From cd4f11e909ed45c9e0d16dd3dab4fbeafd3d6381 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 22 Apr 2021 19:31:06 -0400 Subject: [PATCH] more text fixes --- .../src/mage/cards/a/AetherMeltdown.java | 3 +- .../src/mage/cards/a/ArchangelOfTithes.java | 2 +- .../src/mage/cards/a/ArchmageAscension.java | 2 +- .../src/mage/cards/a/AuriokSalvagers.java | 3 +- Mage.Sets/src/mage/cards/b/Bifurcate.java | 2 +- .../src/mage/cards/b/BloodshotTrainee.java | 52 +++++--------- .../src/mage/cards/b/BoldwyrHeavyweights.java | 2 +- .../src/mage/cards/b/BoundlessRealms.java | 3 +- Mage.Sets/src/mage/cards/d/DeathsOasis.java | 2 +- .../src/mage/cards/d/DescendantsPath.java | 4 +- .../src/mage/cards/e/EverbarkShaman.java | 2 +- Mage.Sets/src/mage/cards/f/FireBowman.java | 13 ++-- Mage.Sets/src/mage/cards/f/FireJuggler.java | 2 +- Mage.Sets/src/mage/cards/f/ForgeArmor.java | 5 +- Mage.Sets/src/mage/cards/f/FromTheAshes.java | 2 +- Mage.Sets/src/mage/cards/g/GemOfBecoming.java | 3 +- Mage.Sets/src/mage/cards/g/Gigantiform.java | 2 +- .../src/mage/cards/g/GraspingCurrent.java | 2 +- .../src/mage/cards/g/GreenhiltTrainee.java | 59 ++++++--------- Mage.Sets/src/mage/cards/g/GuiseOfFire.java | 2 +- .../src/mage/cards/h/HauntedPlateMail.java | 4 +- Mage.Sets/src/mage/cards/h/HiredGiant.java | 2 +- .../src/mage/cards/i/InfectiousBloodlust.java | 36 ++++------ .../mage/cards/i/InfiniteObliteration.java | 2 +- .../src/mage/cards/j/JourneyOfDiscovery.java | 2 +- .../src/mage/cards/l/LanternOfInsight.java | 14 ++-- Mage.Sets/src/mage/cards/l/LilianasShade.java | 4 +- .../mage/cards/m/MwonvuliBeastTracker.java | 2 +- .../src/mage/cards/m/MythosOfBrokkos.java | 2 +- .../src/mage/cards/n/NaturalBalance.java | 2 +- Mage.Sets/src/mage/cards/n/NewFrontiers.java | 2 +- .../src/mage/cards/n/NobleBenefactor.java | 2 +- Mage.Sets/src/mage/cards/p/PullingTeeth.java | 2 +- .../mage/cards/q/QuestForTheHolyRelic.java | 2 +- Mage.Sets/src/mage/cards/r/RageExtractor.java | 2 +- Mage.Sets/src/mage/cards/r/RedeemTheLost.java | 3 +- .../src/mage/cards/r/ReviveTheFallen.java | 2 +- .../src/mage/cards/r/RootweaverDruid.java | 2 +- .../src/mage/cards/s/SadisticSacrament.java | 2 +- .../src/mage/cards/s/ShadowbornApostle.java | 4 +- .../src/mage/cards/s/ShadowsOfThePast.java | 2 +- .../mage/cards/s/SilvergladePathfinder.java | 2 +- Mage.Sets/src/mage/cards/s/Skinshifter.java | 26 +++---- .../src/mage/cards/s/SparkOfCreativity.java | 2 +- .../src/mage/cards/s/SpeakerOfTheHeavens.java | 2 +- .../src/mage/cards/s/SphinxAmbassador.java | 2 +- .../src/mage/cards/s/StonehewerGiant.java | 2 +- .../src/mage/cards/t/TemptWithDiscovery.java | 2 +- Mage.Sets/src/mage/cards/t/TerentatekCub.java | 2 +- Mage.Sets/src/mage/cards/t/Timesifter.java | 2 +- Mage.Sets/src/mage/cards/t/ToothAndNail.java | 2 +- .../src/mage/cards/t/TormentorsTrident.java | 2 +- .../src/mage/cards/u/UncontrollableAnger.java | 2 +- .../mage/cards/v/VarragothBloodskySire.java | 2 +- Mage.Sets/src/mage/cards/v/ViviensJaguar.java | 2 +- Mage.Sets/src/mage/cards/w/WaveOfVitriol.java | 2 +- Mage.Sets/src/mage/cards/w/WeirdHarvest.java | 2 +- Mage.Sets/src/mage/cards/w/WildWanderer.java | 2 +- .../src/mage/cards/w/WoodlandBellower.java | 72 +++++-------------- .../LimitedTimesPerTurnActivatedAbility.java | 3 +- .../common/UntapAllLandsControllerEffect.java | 2 +- .../combat/AttacksIfAbleAttachedEffect.java | 2 +- .../combat/AttacksIfAbleTargetEffect.java | 2 +- .../BecomesCreatureSourceEffect.java | 4 +- .../PlayAdditionalLandsControllerEffect.java | 3 + ...SearchLibraryGraveyardPutInHandEffect.java | 2 +- 66 files changed, 168 insertions(+), 242 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/AetherMeltdown.java b/Mage.Sets/src/mage/cards/a/AetherMeltdown.java index cd738baba4..5fe1e7abe7 100644 --- a/Mage.Sets/src/mage/cards/a/AetherMeltdown.java +++ b/Mage.Sets/src/mage/cards/a/AetherMeltdown.java @@ -24,7 +24,7 @@ import mage.target.TargetPermanent; */ public final class AetherMeltdown extends CardImpl { - private static final FilterPermanent filter = new FilterPermanent("creature or vehicle"); + private static final FilterPermanent filter = new FilterPermanent("creature or Vehicle"); static { filter.add(Predicates.or(CardType.CREATURE.getPredicate(), SubType.VEHICLE.getPredicate())); @@ -47,7 +47,6 @@ public final class AetherMeltdown extends CardImpl { this.addAbility(new EntersBattlefieldTriggeredAbility(new GetEnergyCountersControllerEffect(2))); // Enchanted permanent gets -4/-0. Effect effect = new BoostEnchantedEffect(-4, 0, Duration.WhileOnBattlefield); - effect.setText("Enchanted permanent gets -4/-0"); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); } diff --git a/Mage.Sets/src/mage/cards/a/ArchangelOfTithes.java b/Mage.Sets/src/mage/cards/a/ArchangelOfTithes.java index bd98a677cd..82f961cb8d 100644 --- a/Mage.Sets/src/mage/cards/a/ArchangelOfTithes.java +++ b/Mage.Sets/src/mage/cards/a/ArchangelOfTithes.java @@ -54,7 +54,7 @@ class ArchangelOfTithesPayManaToAttackAllEffect extends CantAttackYouUnlessPayMa ArchangelOfTithesPayManaToAttackAllEffect() { super(new ManaCostsImpl<>("{1}"), true); - staticText = "As long as {this} is untapped, creatures can't attack you or a planeswalker you control unless their controller pays {1} for each of those creatures."; + staticText = "As long as {this} is untapped, creatures can't attack you or planeswalkers you control unless their controller pays {1} for each of those creatures."; } ArchangelOfTithesPayManaToAttackAllEffect(ArchangelOfTithesPayManaToAttackAllEffect effect) { diff --git a/Mage.Sets/src/mage/cards/a/ArchmageAscension.java b/Mage.Sets/src/mage/cards/a/ArchmageAscension.java index 8cd6ecedf4..ef2a99e765 100644 --- a/Mage.Sets/src/mage/cards/a/ArchmageAscension.java +++ b/Mage.Sets/src/mage/cards/a/ArchmageAscension.java @@ -35,7 +35,7 @@ public final class ArchmageAscension extends CardImpl { new AddCountersSourceEffect(CounterType.QUEST.createInstance(1)), TargetController.EACH_PLAYER, true ), ArchmageAscensionCondition.instance, "At the beginning of each end step, " + - "if you drew two or more cards this turn, you may put a quest counter on {this}" + "if you drew two or more cards this turn, you may put a quest counter on {this}." ), new CardsAmountDrawnThisTurnWatcher()); // As long as Archmage Ascension has six or more quest counters on it, if you would draw a card, diff --git a/Mage.Sets/src/mage/cards/a/AuriokSalvagers.java b/Mage.Sets/src/mage/cards/a/AuriokSalvagers.java index 640982c66d..396921324d 100644 --- a/Mage.Sets/src/mage/cards/a/AuriokSalvagers.java +++ b/Mage.Sets/src/mage/cards/a/AuriokSalvagers.java @@ -6,6 +6,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -37,7 +38,7 @@ public final class AuriokSalvagers extends CardImpl { this.toughness = new MageInt(4); // {1}{W}: Return target artifact card with converted mana cost 1 or less from your graveyard to your hand. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(),new ManaCostsImpl("{1}{W}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnFromGraveyardToHandTargetEffect(),new ManaCostsImpl("{1}{W}")); ability.addTarget(new TargetCardInYourGraveyard(filter)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/b/Bifurcate.java b/Mage.Sets/src/mage/cards/b/Bifurcate.java index a3f56f6978..23ecae9a43 100644 --- a/Mage.Sets/src/mage/cards/b/Bifurcate.java +++ b/Mage.Sets/src/mage/cards/b/Bifurcate.java @@ -54,7 +54,7 @@ class BifurcateEffect extends OneShotEffect { public BifurcateEffect() { super(Outcome.Benefit); - this.staticText = "Search your library for a permanent card with the same name as target nontoken creature and put that card onto the battlefield. Then shuffle"; + this.staticText = "search your library for a permanent card with the same name as target nontoken creature, put that card onto the battlefield, then shuffle"; } public BifurcateEffect(final BifurcateEffect effect) { diff --git a/Mage.Sets/src/mage/cards/b/BloodshotTrainee.java b/Mage.Sets/src/mage/cards/b/BloodshotTrainee.java index b17c4d7223..a46fbb0e55 100644 --- a/Mage.Sets/src/mage/cards/b/BloodshotTrainee.java +++ b/Mage.Sets/src/mage/cards/b/BloodshotTrainee.java @@ -1,12 +1,9 @@ - package mage.cards.b; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.Cost; -import mage.abilities.costs.CostImpl; +import mage.abilities.common.ActivateIfConditionActivatedAbility; +import mage.abilities.condition.Condition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; @@ -18,23 +15,26 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author North */ public final class BloodshotTrainee extends CardImpl { public BloodshotTrainee(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); this.subtype.add(SubType.GOBLIN); this.subtype.add(SubType.WARRIOR); this.power = new MageInt(2); this.toughness = new MageInt(3); - SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(4), new TapSourceCost()); + Ability ability = new ActivateIfConditionActivatedAbility( + Zone.BATTLEFIELD, new DamageTargetEffect(4), + new TapSourceCost(), BloodshotTraineeCondition.instance + ); ability.addTarget(new TargetCreaturePermanent()); - ability.addCost(new BloodshotTraineeCost()); this.addAbility(ability); } @@ -48,35 +48,17 @@ public final class BloodshotTrainee extends CardImpl { } } -class BloodshotTraineeCost extends CostImpl { +enum BloodshotTraineeCondition implements Condition { + instance; - public BloodshotTraineeCost() { - this.text = "Activate only if Bloodshot Trainee's power is 4 or greater"; - } - - public BloodshotTraineeCost(final BloodshotTraineeCost cost) { - super(cost); + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = source.getSourcePermanentIfItStillExists(game); + return permanent != null && permanent.getPower().getValue() >= 4; } @Override - public BloodshotTraineeCost copy() { - return new BloodshotTraineeCost(this); - } - - @Override - public boolean canPay(Ability ability, Ability source, UUID controllerId, Game game) { - Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent != null) { - if (permanent.getPower().getValue() >= 4) { - return true; - } - } - return false; - } - - @Override - public boolean pay(Ability ability, Game game, Ability source, UUID controllerId, boolean noMana, Cost costToPay) { - this.paid = true; - return paid; + public String toString() { + return "{this}'s power is 4 or greater"; } } diff --git a/Mage.Sets/src/mage/cards/b/BoldwyrHeavyweights.java b/Mage.Sets/src/mage/cards/b/BoldwyrHeavyweights.java index 2b1dc76a34..403f69d1fe 100644 --- a/Mage.Sets/src/mage/cards/b/BoldwyrHeavyweights.java +++ b/Mage.Sets/src/mage/cards/b/BoldwyrHeavyweights.java @@ -53,7 +53,7 @@ class BoldwyrHeavyweightsEffect extends OneShotEffect { BoldwyrHeavyweightsEffect() { super(Outcome.Detriment); - this.staticText = "each opponent may search their library for a creature card and put it onto the battlefield. Then each player who searched their library this way shuffles it"; + this.staticText = "each opponent may search their library for a creature card and put it onto the battlefield. Then each player who searched their library this way shuffles"; } BoldwyrHeavyweightsEffect(final BoldwyrHeavyweightsEffect effect) { diff --git a/Mage.Sets/src/mage/cards/b/BoundlessRealms.java b/Mage.Sets/src/mage/cards/b/BoundlessRealms.java index 15d0d51233..326224da07 100644 --- a/Mage.Sets/src/mage/cards/b/BoundlessRealms.java +++ b/Mage.Sets/src/mage/cards/b/BoundlessRealms.java @@ -46,7 +46,8 @@ class BoundlessRealmsEffect extends OneShotEffect { public BoundlessRealmsEffect() { super(Outcome.Benefit); - this.staticText = "Search your library for up to X basic land cards, where X is the number of lands you control, and put them onto the battlefield tapped. Then shuffle."; + this.staticText = "search your library for up to X basic land cards, where X is the number of " + + "lands you control, put them onto the battlefield tapped, then shuffle"; } public BoundlessRealmsEffect(final BoundlessRealmsEffect effect) { diff --git a/Mage.Sets/src/mage/cards/d/DeathsOasis.java b/Mage.Sets/src/mage/cards/d/DeathsOasis.java index 4a9e357222..4e5d95e502 100644 --- a/Mage.Sets/src/mage/cards/d/DeathsOasis.java +++ b/Mage.Sets/src/mage/cards/d/DeathsOasis.java @@ -47,7 +47,7 @@ public final class DeathsOasis extends CardImpl { // {1}, Sacrifice Death's Oasis: You gain life equal to the greatest converted mana cost among creatures you control. Ability ability = new SimpleActivatedAbility( new GainLifeEffect(DeathsOasisValue.instance) - .setText("you gain life equal to the greatest mana value among creatures you control"), + .setText("you gain life equal to the highest mana value among creatures you control"), new GenericManaCost(1) ); ability.addCost(new SacrificeSourceCost()); diff --git a/Mage.Sets/src/mage/cards/d/DescendantsPath.java b/Mage.Sets/src/mage/cards/d/DescendantsPath.java index 6bf349776a..a7ed285fd5 100644 --- a/Mage.Sets/src/mage/cards/d/DescendantsPath.java +++ b/Mage.Sets/src/mage/cards/d/DescendantsPath.java @@ -51,8 +51,8 @@ class DescendantsPathEffect extends OneShotEffect { super(Outcome.Discard); this.staticText = "reveal the top card of your library. If it's a creature " + "card that shares a creature type with a creature you control, " - + "you may cast that card without paying its mana cost. Otherwise, " - + "put that card on the bottom of your library"; + + "you may cast it without paying its mana cost. If you don't cast it, " + + "put it on the bottom of your library"; } public DescendantsPathEffect(final DescendantsPathEffect effect) { diff --git a/Mage.Sets/src/mage/cards/e/EverbarkShaman.java b/Mage.Sets/src/mage/cards/e/EverbarkShaman.java index 7760992bc7..8a1533f8cf 100644 --- a/Mage.Sets/src/mage/cards/e/EverbarkShaman.java +++ b/Mage.Sets/src/mage/cards/e/EverbarkShaman.java @@ -25,7 +25,7 @@ import mage.target.common.TargetCardInYourGraveyard; public final class EverbarkShaman extends CardImpl { private static final FilterCard filterForest = new FilterCard("Forest"); - private static final FilterCard filterTreefolk = new FilterCard("Treefolk from your graveyard"); + private static final FilterCard filterTreefolk = new FilterCard("Treefolk card from your graveyard"); static { filterForest.add(SubType.FOREST.getPredicate()); diff --git a/Mage.Sets/src/mage/cards/f/FireBowman.java b/Mage.Sets/src/mage/cards/f/FireBowman.java index 18712393fe..7b98f5f4d3 100644 --- a/Mage.Sets/src/mage/cards/f/FireBowman.java +++ b/Mage.Sets/src/mage/cards/f/FireBowman.java @@ -1,7 +1,5 @@ - package mage.cards.f; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.ActivateIfConditionActivatedAbility; @@ -15,14 +13,15 @@ import mage.constants.SubType; import mage.constants.Zone; import mage.target.common.TargetAnyTarget; +import java.util.UUID; + /** - * * @author fireshoes */ public final class FireBowman extends CardImpl { public FireBowman(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.SOLDIER); this.subtype.add(SubType.ARCHER); @@ -30,8 +29,10 @@ public final class FireBowman extends CardImpl { this.toughness = new MageInt(1); // Sacrifice Fire Bowman: Fire Bowman deals 1 damage to any target. Activate this ability only during your turn, before attackers are declared. - Ability ability = new ActivateIfConditionActivatedAbility(Zone.BATTLEFIELD, - new DamageTargetEffect(1), new SacrificeSourceCost(), MyTurnBeforeAttackersDeclaredCondition.instance); + Ability ability = new ActivateIfConditionActivatedAbility( + Zone.BATTLEFIELD, new DamageTargetEffect(1, "it"), + new SacrificeSourceCost(), MyTurnBeforeAttackersDeclaredCondition.instance + ); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/f/FireJuggler.java b/Mage.Sets/src/mage/cards/f/FireJuggler.java index e2fdf018e7..e68eb240e1 100644 --- a/Mage.Sets/src/mage/cards/f/FireJuggler.java +++ b/Mage.Sets/src/mage/cards/f/FireJuggler.java @@ -28,7 +28,7 @@ public final class FireJuggler extends CardImpl { this.toughness = new MageInt(2); // Whenever Fire Juggler becomes blocked, clash with an opponent. If you win, Fire Juggler deals 4 damage to each creature blocking it. - FilterPermanent filter = new FilterPermanent("each creature blocking it"); + FilterPermanent filter = new FilterPermanent("creature blocking it"); filter.add(new BlockingAttackerIdPredicate(this.getId())); this.addAbility(new BecomesBlockedSourceTriggeredAbility(new DoIfClashWonEffect(new DamageAllEffect(4,filter)),false)); } diff --git a/Mage.Sets/src/mage/cards/f/ForgeArmor.java b/Mage.Sets/src/mage/cards/f/ForgeArmor.java index 2cd4dec3ac..172af38949 100644 --- a/Mage.Sets/src/mage/cards/f/ForgeArmor.java +++ b/Mage.Sets/src/mage/cards/f/ForgeArmor.java @@ -9,7 +9,8 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.counters.CounterType; -import mage.filter.common.FilterControlledArtifactPermanent; +import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledPermanent; import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetCreaturePermanent; @@ -23,7 +24,7 @@ public final class ForgeArmor extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{4}{R}"); // As an additional cost to cast Forge Armor, sacrifice an artifact. - this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledArtifactPermanent()))); + this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledPermanent(StaticFilters.FILTER_CONTROLLED_PERMANENT_ARTIFACT_AN)))); // Put X +1/+1 counters on target creature, where X is the sacrificed artifact's converted mana cost. this.getSpellAbility().addEffect(new AddCountersTargetEffect(new AddCountersTargetEffect( CounterType.P1P1.createInstance(), new SacrificeCostConvertedMana("artifact")))); diff --git a/Mage.Sets/src/mage/cards/f/FromTheAshes.java b/Mage.Sets/src/mage/cards/f/FromTheAshes.java index 99ed9db9cd..90c4edbc62 100644 --- a/Mage.Sets/src/mage/cards/f/FromTheAshes.java +++ b/Mage.Sets/src/mage/cards/f/FromTheAshes.java @@ -48,7 +48,7 @@ class FromTheAshesEffect extends OneShotEffect { public FromTheAshesEffect() { super(Outcome.Benefit); - this.staticText = "Destroy all nonbasic lands. For each land destroyed this way, its controller may search their library for a basic land card and put it onto the battlefield. Then each player who searched their library this way shuffles it"; + this.staticText = "Destroy all nonbasic lands. For each land destroyed this way, its controller may search their library for a basic land card and put it onto the battlefield. Then each player who searched their library this way shuffles"; } public FromTheAshesEffect(final FromTheAshesEffect effect) { diff --git a/Mage.Sets/src/mage/cards/g/GemOfBecoming.java b/Mage.Sets/src/mage/cards/g/GemOfBecoming.java index 9ccd85ccc2..9873bfba02 100644 --- a/Mage.Sets/src/mage/cards/g/GemOfBecoming.java +++ b/Mage.Sets/src/mage/cards/g/GemOfBecoming.java @@ -30,7 +30,8 @@ public final class GemOfBecoming extends CardImpl { Ability ability = new SimpleActivatedAbility( new SearchLibraryPutInHandEffect( new GemOfBecomingTarget(), true - ), new GenericManaCost(3) + ).setText("search your library for an Island card, a Swamp card, and a Mountain card. " + + "Reveal those cards, put them into your hand, then shuffle"), new GenericManaCost(3) ); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); diff --git a/Mage.Sets/src/mage/cards/g/Gigantiform.java b/Mage.Sets/src/mage/cards/g/Gigantiform.java index 535f5876b8..9aa5aa4f76 100644 --- a/Mage.Sets/src/mage/cards/g/Gigantiform.java +++ b/Mage.Sets/src/mage/cards/g/Gigantiform.java @@ -84,7 +84,7 @@ class GigantiformAbility extends StaticAbility { @Override public String getRule() { - return "Enchanted creature has base power and toughness 8/8 and has trample"; + return "Enchanted creature has base power and toughness 8/8 and has trample."; } } diff --git a/Mage.Sets/src/mage/cards/g/GraspingCurrent.java b/Mage.Sets/src/mage/cards/g/GraspingCurrent.java index 24777c9070..2433de4b93 100644 --- a/Mage.Sets/src/mage/cards/g/GraspingCurrent.java +++ b/Mage.Sets/src/mage/cards/g/GraspingCurrent.java @@ -31,7 +31,7 @@ public final class GraspingCurrent extends CardImpl { this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2)); // Search your library and/or graveyard for a card named Jace, Ingenious Mind-Mage, reveal it, then put it into your hand. If you searched your library this way, shuffle it. - this.getSpellAbility().addEffect(new SearchLibraryGraveyardPutInHandEffect(filter)); + this.getSpellAbility().addEffect(new SearchLibraryGraveyardPutInHandEffect(filter).concatBy("
")); } private GraspingCurrent(final GraspingCurrent card) { diff --git a/Mage.Sets/src/mage/cards/g/GreenhiltTrainee.java b/Mage.Sets/src/mage/cards/g/GreenhiltTrainee.java index cd86915782..74c544c5ae 100644 --- a/Mage.Sets/src/mage/cards/g/GreenhiltTrainee.java +++ b/Mage.Sets/src/mage/cards/g/GreenhiltTrainee.java @@ -1,45 +1,44 @@ - - package mage.cards.g; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.Cost; -import mage.abilities.costs.CostImpl; +import mage.abilities.common.ActivateIfConditionActivatedAbility; +import mage.abilities.condition.Condition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author Loki */ public final class GreenhiltTrainee extends CardImpl { - public GreenhiltTrainee (UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}"); + public GreenhiltTrainee(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}"); this.subtype.add(SubType.ELF); this.subtype.add(SubType.WARRIOR); this.power = new MageInt(2); this.toughness = new MageInt(3); - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(4, 4, Duration.EndOfTurn), new TapSourceCost()); + Ability ability = new ActivateIfConditionActivatedAbility( + Zone.BATTLEFIELD, new BoostTargetEffect(4, 4, Duration.EndOfTurn), + new TapSourceCost(), GreenhiltTraineeCondition.instance + ); ability.addTarget(new TargetCreaturePermanent()); - ability.addCost(new GreenhiltTraineeCost()); this.addAbility(ability); } - public GreenhiltTrainee (final GreenhiltTrainee card) { + public GreenhiltTrainee(final GreenhiltTrainee card) { super(card); } @@ -49,35 +48,17 @@ public final class GreenhiltTrainee extends CardImpl { } } -class GreenhiltTraineeCost extends CostImpl { +enum GreenhiltTraineeCondition implements Condition { + instance; - public GreenhiltTraineeCost() { - this.text = "Activate only if Greenhilt Trainee's power is 4 or greater"; - } - - public GreenhiltTraineeCost(final GreenhiltTraineeCost cost) { - super(cost); + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = source.getSourcePermanentIfItStillExists(game); + return permanent != null && permanent.getPower().getValue() >= 4; } @Override - public GreenhiltTraineeCost copy() { - return new GreenhiltTraineeCost(this); - } - - @Override - public boolean canPay(Ability ability, Ability source, UUID controllerId, Game game) { - Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent != null) { - if (permanent.getPower().getValue() >= 4) { - return true; - } - } - return false; - } - - @Override - public boolean pay(Ability ability, Game game, Ability source, UUID controllerId, boolean noMana, Cost costToPay) { - this.paid = true; - return paid; + public String toString() { + return "{this}'s power is 4 or greater"; } } diff --git a/Mage.Sets/src/mage/cards/g/GuiseOfFire.java b/Mage.Sets/src/mage/cards/g/GuiseOfFire.java index 067d2a9f99..2f543c31b3 100644 --- a/Mage.Sets/src/mage/cards/g/GuiseOfFire.java +++ b/Mage.Sets/src/mage/cards/g/GuiseOfFire.java @@ -34,7 +34,7 @@ public final class GuiseOfFire extends CardImpl { // Enchanted creature gets +1/-1 and attacks each turn if able. ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, -1, Duration.WhileOnBattlefield)); Effect effect = new AttacksIfAbleAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.AURA); - effect.setText("and attacks each turn if able"); + effect.setText("and attacks each combat if able"); ability.addEffect(effect); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/h/HauntedPlateMail.java b/Mage.Sets/src/mage/cards/h/HauntedPlateMail.java index d26a3fd03e..f614277e4c 100644 --- a/Mage.Sets/src/mage/cards/h/HauntedPlateMail.java +++ b/Mage.Sets/src/mage/cards/h/HauntedPlateMail.java @@ -9,7 +9,7 @@ import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.decorator.ConditionalActivatedAbility; import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; -import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.continuous.BoostEquippedEffect; import mage.abilities.keyword.EquipAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -33,7 +33,7 @@ public final class HauntedPlateMail extends CardImpl { this.subtype.add(SubType.EQUIPMENT); // Equipped creature gets +4/+4. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(4, 4))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(4, 4))); // {0}: Until end of turn, Haunted Plate Mail becomes a 4/4 Spirit artifact creature that's no longer an Equipment. Activate this ability only if you control no creatures. Ability ability = new ConditionalActivatedAbility( Zone.BATTLEFIELD, diff --git a/Mage.Sets/src/mage/cards/h/HiredGiant.java b/Mage.Sets/src/mage/cards/h/HiredGiant.java index 291a3eae18..050baa4671 100644 --- a/Mage.Sets/src/mage/cards/h/HiredGiant.java +++ b/Mage.Sets/src/mage/cards/h/HiredGiant.java @@ -50,7 +50,7 @@ class HiredGiantEffect extends OneShotEffect { HiredGiantEffect() { super(Outcome.Detriment); - this.staticText = "each other player may search their library for a land card and put that card onto the battlefield. Then each player who searched their library this way shuffles it"; + this.staticText = "each other player may search their library for a land card and put that card onto the battlefield. Then each player who searched their library this way shuffles"; } HiredGiantEffect(final HiredGiantEffect effect) { diff --git a/Mage.Sets/src/mage/cards/i/InfectiousBloodlust.java b/Mage.Sets/src/mage/cards/i/InfectiousBloodlust.java index 2ab452544f..edf4b74d74 100644 --- a/Mage.Sets/src/mage/cards/i/InfectiousBloodlust.java +++ b/Mage.Sets/src/mage/cards/i/InfectiousBloodlust.java @@ -1,11 +1,8 @@ - package mage.cards.i; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.DiesAttachedTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.combat.AttacksIfAbleAttachedEffect; import mage.abilities.effects.common.continuous.BoostEnchantedEffect; @@ -15,20 +12,16 @@ import mage.abilities.keyword.EnchantAbility; import mage.abilities.keyword.HasteAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.AttachmentType; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Zone; +import mage.constants.*; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.NamePredicate; import mage.target.TargetPermanent; import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author fireshoes */ public final class InfectiousBloodlust extends CardImpl { @@ -40,7 +33,7 @@ public final class InfectiousBloodlust extends CardImpl { } public InfectiousBloodlust(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}"); this.subtype.add(SubType.AURA); // Enchant creature @@ -51,20 +44,19 @@ public final class InfectiousBloodlust extends CardImpl { this.addAbility(ability); // Enchanted creature gets +2/+1, has haste, and attacks each turn if able. - Effect effect = new BoostEnchantedEffect(2, 1); - effect.setText("Enchanted creature gets +2/+1"); - ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); - effect = new GainAbilityAttachedEffect(HasteAbility.getInstance(), AttachmentType.AURA); - effect.setText("has haste"); - ability.addEffect(effect); - effect = new AttacksIfAbleAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.AURA); - effect.setText("and attacks each turn if able"); - ability.addEffect(effect); + ability = new SimpleStaticAbility(new BoostEnchantedEffect(2, 1)); + ability.addEffect(new GainAbilityAttachedEffect( + HasteAbility.getInstance(), AttachmentType.AURA + ).setText(", has haste")); + ability.addEffect(new AttacksIfAbleAttachedEffect( + Duration.WhileOnBattlefield, AttachmentType.AURA + ).setText(", and attacks each combat if able")); this.addAbility(ability); // When enchanted creature dies, you may search your library for a card named Infectious Bloodlust, reveal it, put it into your hand, then shuffle your library. - TargetCardInLibrary target = new TargetCardInLibrary(0, 1, filter); - this.addAbility(new DiesAttachedTriggeredAbility(new SearchLibraryPutInHandEffect(target, true, true), "enchanted creature", true)); + this.addAbility(new DiesAttachedTriggeredAbility(new SearchLibraryPutInHandEffect( + new TargetCardInLibrary(filter), true, true + ), "enchanted creature", true)); } private InfectiousBloodlust(final InfectiousBloodlust card) { diff --git a/Mage.Sets/src/mage/cards/i/InfiniteObliteration.java b/Mage.Sets/src/mage/cards/i/InfiniteObliteration.java index 39e8a31d79..eae9bd6c43 100644 --- a/Mage.Sets/src/mage/cards/i/InfiniteObliteration.java +++ b/Mage.Sets/src/mage/cards/i/InfiniteObliteration.java @@ -84,7 +84,7 @@ class InfiniteObliterationEffect extends SearchTargetGraveyardHandLibraryForCard @Override public String getText(Mode mode) { - return "Name a creature card. " + super.getText(mode); + return "Choose a creature card name. " + super.getText(mode); } } diff --git a/Mage.Sets/src/mage/cards/j/JourneyOfDiscovery.java b/Mage.Sets/src/mage/cards/j/JourneyOfDiscovery.java index abb12e8360..cb24153a7e 100644 --- a/Mage.Sets/src/mage/cards/j/JourneyOfDiscovery.java +++ b/Mage.Sets/src/mage/cards/j/JourneyOfDiscovery.java @@ -24,7 +24,7 @@ public final class JourneyOfDiscovery extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{G}"); // Choose one - Search your library for up to two basic land cards, reveal them, put them into your hand, then shuffle your library; - this.getSpellAbility().addEffect(new SearchLibraryPutInHandEffect(new TargetCardInLibrary(0, 2, StaticFilters.FILTER_CARD_BASIC_LAND), true)); + this.getSpellAbility().addEffect(new SearchLibraryPutInHandEffect(new TargetCardInLibrary(0, 2, StaticFilters.FILTER_CARD_BASIC_LANDS), true)); // or you may play up to two additional lands this turn. Mode mode = new Mode(); diff --git a/Mage.Sets/src/mage/cards/l/LanternOfInsight.java b/Mage.Sets/src/mage/cards/l/LanternOfInsight.java index f5f32b054d..828e535770 100644 --- a/Mage.Sets/src/mage/cards/l/LanternOfInsight.java +++ b/Mage.Sets/src/mage/cards/l/LanternOfInsight.java @@ -1,7 +1,5 @@ - package mage.cards.l; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; @@ -12,23 +10,23 @@ import mage.abilities.effects.common.continuous.PlayWithTheTopCardRevealedEffect import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Zone; import mage.target.TargetPlayer; +import java.util.UUID; + /** - * * @author emerald000 */ public final class LanternOfInsight extends CardImpl { public LanternOfInsight(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{1}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}"); // Each player plays with the top card of their library revealed. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PlayWithTheTopCardRevealedEffect(true))); - + this.addAbility(new SimpleStaticAbility(new PlayWithTheTopCardRevealedEffect(true))); + // {tap}, Sacrifice Lantern of Insight: Target player shuffles their library. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ShuffleLibraryTargetEffect(), new TapSourceCost()); + Ability ability = new SimpleActivatedAbility(new ShuffleLibraryTargetEffect().setText("target player shuffles"), new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); ability.addTarget(new TargetPlayer()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/l/LilianasShade.java b/Mage.Sets/src/mage/cards/l/LilianasShade.java index 23bcdbf374..7b612d17bb 100644 --- a/Mage.Sets/src/mage/cards/l/LilianasShade.java +++ b/Mage.Sets/src/mage/cards/l/LilianasShade.java @@ -23,7 +23,7 @@ import mage.target.common.TargetCardInLibrary; */ public final class LilianasShade extends CardImpl { - private static final FilterLandCard filter = new FilterLandCard("Swamp"); + private static final FilterLandCard filter = new FilterLandCard("Swamp card"); static { filter.add(SubType.SWAMP.getPredicate()); @@ -37,7 +37,7 @@ public final class LilianasShade extends CardImpl { this.toughness = new MageInt(1); // When Liliana's Shade enters the battlefield, you may search your library for a Swamp card, reveal it, put it into your hand, then shuffle your library. - this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true, true))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true, true), true)); // {B}: Liliana's Shade gets +1/+1 until end of turn. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 1, Duration.EndOfTurn), new ManaCostsImpl("{B}"))); } diff --git a/Mage.Sets/src/mage/cards/m/MwonvuliBeastTracker.java b/Mage.Sets/src/mage/cards/m/MwonvuliBeastTracker.java index 40fdbe0d19..1d799a1e8b 100644 --- a/Mage.Sets/src/mage/cards/m/MwonvuliBeastTracker.java +++ b/Mage.Sets/src/mage/cards/m/MwonvuliBeastTracker.java @@ -24,7 +24,7 @@ import mage.target.common.TargetCardInLibrary; */ public final class MwonvuliBeastTracker extends CardImpl { - private static final FilterCard filter = new FilterCard("creature card with deathtouch, hexproof, reach, or trample in your library"); + private static final FilterCard filter = new FilterCard("creature card with deathtouch, hexproof, reach, or trample"); static { filter.add(CardType.CREATURE.getPredicate()); diff --git a/Mage.Sets/src/mage/cards/m/MythosOfBrokkos.java b/Mage.Sets/src/mage/cards/m/MythosOfBrokkos.java index d95bd8503a..21a313547c 100644 --- a/Mage.Sets/src/mage/cards/m/MythosOfBrokkos.java +++ b/Mage.Sets/src/mage/cards/m/MythosOfBrokkos.java @@ -55,7 +55,7 @@ class MythosOfBrokkosEffect extends OneShotEffect { MythosOfBrokkosEffect() { super(Outcome.Benefit); - staticText = "If {U}{B} was spent to cast Mythos of Brokkos, search your library for a card, " + + staticText = "If {U}{B} was spent to cast this spell, search your library for a card, " + "put that card into your graveyard, then shuffle.
" + "Return up to two permanent cards from your graveyard to your hand."; } diff --git a/Mage.Sets/src/mage/cards/n/NaturalBalance.java b/Mage.Sets/src/mage/cards/n/NaturalBalance.java index a3fead804d..9361791299 100644 --- a/Mage.Sets/src/mage/cards/n/NaturalBalance.java +++ b/Mage.Sets/src/mage/cards/n/NaturalBalance.java @@ -47,7 +47,7 @@ public final class NaturalBalance extends CardImpl { public NaturalBalanceEffect() { super(Outcome.PutCardInPlay); - this.staticText = "Each player who controls six or more lands chooses five lands they control and sacrifices the rest. Each player who controls four or fewer lands may search their library for up to X basic land cards and put them onto the battlefield, where X is five minus the number of lands they control. Then each player who searched their library this way shuffles it."; + this.staticText = "Each player who controls six or more lands chooses five lands they control and sacrifices the rest. Each player who controls four or fewer lands may search their library for up to X basic land cards and put them onto the battlefield, where X is five minus the number of lands they control. Then each player who searched their library this way shuffles."; } public NaturalBalanceEffect(final NaturalBalanceEffect effect) { diff --git a/Mage.Sets/src/mage/cards/n/NewFrontiers.java b/Mage.Sets/src/mage/cards/n/NewFrontiers.java index dce943e682..042ac488f5 100644 --- a/Mage.Sets/src/mage/cards/n/NewFrontiers.java +++ b/Mage.Sets/src/mage/cards/n/NewFrontiers.java @@ -43,7 +43,7 @@ class NewFrontiersEffect extends OneShotEffect { public NewFrontiersEffect() { super(Outcome.Detriment); - this.staticText = "Each player may search their library for up to X basic land cards and put them onto the battlefield tapped. Then each player who searched their library this way shuffles it"; + this.staticText = "Each player may search their library for up to X basic land cards and put them onto the battlefield tapped. Then each player who searched their library this way shuffles"; } public NewFrontiersEffect(final NewFrontiersEffect effect) { diff --git a/Mage.Sets/src/mage/cards/n/NobleBenefactor.java b/Mage.Sets/src/mage/cards/n/NobleBenefactor.java index ecf3ec74ce..cfad918241 100644 --- a/Mage.Sets/src/mage/cards/n/NobleBenefactor.java +++ b/Mage.Sets/src/mage/cards/n/NobleBenefactor.java @@ -50,7 +50,7 @@ class NobleBenefactorEffect extends OneShotEffect { public NobleBenefactorEffect() { super(Outcome.Benefit); - this.staticText = "each player may search their library for a card and put that card into their hand. Then each player who searched their library this way shuffles it"; + this.staticText = "each player may search their library for a card and put that card into their hand. Then each player who searched their library this way shuffles"; } public NobleBenefactorEffect(final NobleBenefactorEffect effect) { diff --git a/Mage.Sets/src/mage/cards/p/PullingTeeth.java b/Mage.Sets/src/mage/cards/p/PullingTeeth.java index d5280ff469..e024871304 100644 --- a/Mage.Sets/src/mage/cards/p/PullingTeeth.java +++ b/Mage.Sets/src/mage/cards/p/PullingTeeth.java @@ -42,7 +42,7 @@ class PullingTeethEffect extends OneShotEffect { public PullingTeethEffect() { super(Outcome.Discard); - this.staticText = "Clash with an opponent. If you win, target player discards two cards. Otherwise that player discards a card"; + this.staticText = "Clash with an opponent. If you win, target player discards two cards. Otherwise, that player discards a card"; } public PullingTeethEffect(final PullingTeethEffect effect) { diff --git a/Mage.Sets/src/mage/cards/q/QuestForTheHolyRelic.java b/Mage.Sets/src/mage/cards/q/QuestForTheHolyRelic.java index 5e8538e653..7b4ec91c3b 100644 --- a/Mage.Sets/src/mage/cards/q/QuestForTheHolyRelic.java +++ b/Mage.Sets/src/mage/cards/q/QuestForTheHolyRelic.java @@ -66,7 +66,7 @@ class QuestForTheHolyRelicEffect extends OneShotEffect { QuestForTheHolyRelicEffect() { super(Outcome.PutCardInPlay); - this.staticText = "Search your library for an Equipment card, put it onto the battlefield, and attach it to a creature you control. Then shuffle"; + this.staticText = "Search your library for an Equipment card, put it onto the battlefield, attach it to a creature you control, then shuffle"; } private QuestForTheHolyRelicEffect(final QuestForTheHolyRelicEffect effect) { diff --git a/Mage.Sets/src/mage/cards/r/RageExtractor.java b/Mage.Sets/src/mage/cards/r/RageExtractor.java index bf6432c59e..9c4d203be7 100644 --- a/Mage.Sets/src/mage/cards/r/RageExtractor.java +++ b/Mage.Sets/src/mage/cards/r/RageExtractor.java @@ -76,6 +76,6 @@ class RageExtractorTriggeredAbility extends TriggeredAbilityImpl { @Override public String getRule() { - return "Whenever you cast a spell with p in its mana cost, {this} deals damage equal to that spell's mana value to any target."; + return "Whenever you cast a spell with {P} in its mana cost, {this} deals damage equal to that spell's mana value to any target."; } } diff --git a/Mage.Sets/src/mage/cards/r/RedeemTheLost.java b/Mage.Sets/src/mage/cards/r/RedeemTheLost.java index 7ccd344db1..16b5a15516 100644 --- a/Mage.Sets/src/mage/cards/r/RedeemTheLost.java +++ b/Mage.Sets/src/mage/cards/r/RedeemTheLost.java @@ -8,6 +8,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; +import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetCreaturePermanent; /** @@ -21,7 +22,7 @@ public final class RedeemTheLost extends CardImpl { // Target creature you control gains protection from the color of your choice until end of turn. this.getSpellAbility().addEffect(new GainProtectionFromColorTargetEffect(Duration.EndOfTurn)); - this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent()); // Clash with an opponent. If you win, return Redeem the Lost to its owner's hand. this.getSpellAbility().addEffect(ClashWinReturnToHandSpellEffect.getInstance()); } diff --git a/Mage.Sets/src/mage/cards/r/ReviveTheFallen.java b/Mage.Sets/src/mage/cards/r/ReviveTheFallen.java index 3fff388aed..3e90df0071 100644 --- a/Mage.Sets/src/mage/cards/r/ReviveTheFallen.java +++ b/Mage.Sets/src/mage/cards/r/ReviveTheFallen.java @@ -21,7 +21,7 @@ public final class ReviveTheFallen extends CardImpl { // Return target creature card from a graveyard to its owner's hand. this.getSpellAbility().addEffect(new ReturnToHandTargetEffect()); - this.getSpellAbility().addTarget(new TargetCardInGraveyard(new FilterCreatureCard("creature card in a graveyard"))); + this.getSpellAbility().addTarget(new TargetCardInGraveyard(new FilterCreatureCard("creature card from a graveyard"))); // Clash with an opponent. If you win, return Revive the Fallen to its owner's hand. this.getSpellAbility().addEffect(ClashWinReturnToHandSpellEffect.getInstance()); } diff --git a/Mage.Sets/src/mage/cards/r/RootweaverDruid.java b/Mage.Sets/src/mage/cards/r/RootweaverDruid.java index 909615f821..21a7a62aa7 100644 --- a/Mage.Sets/src/mage/cards/r/RootweaverDruid.java +++ b/Mage.Sets/src/mage/cards/r/RootweaverDruid.java @@ -53,7 +53,7 @@ class RootweaverDruidEffect extends OneShotEffect { staticText = "each opponent may search their library for up to three basic land cards. " + "They each put one of those cards onto the battlefield tapped under your control " + "and the rest onto the battlefield tapped under their control. " + - "Then each player who searched their library this way shuffles it"; + "Then each player who searched their library this way shuffles"; } private RootweaverDruidEffect(final RootweaverDruidEffect effect) { diff --git a/Mage.Sets/src/mage/cards/s/SadisticSacrament.java b/Mage.Sets/src/mage/cards/s/SadisticSacrament.java index 3ea6708b3e..7861c85228 100644 --- a/Mage.Sets/src/mage/cards/s/SadisticSacrament.java +++ b/Mage.Sets/src/mage/cards/s/SadisticSacrament.java @@ -25,7 +25,7 @@ import mage.target.common.TargetCardInLibrary; */ public final class SadisticSacrament extends CardImpl { - private static final String ruleText = "Search target player's library for up to three cards, exile them, then that player shuffles. if this spell was kicked, instead search that player's library for up to fifteen cards, exile them, then that player shuffles"; + private static final String ruleText = "Search target player's library for up to three cards, exile them, then that player shuffles. If this spell was kicked, instead search that player's library for up to fifteen cards, exile them, then that player shuffles"; public SadisticSacrament(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{B}{B}{B}"); diff --git a/Mage.Sets/src/mage/cards/s/ShadowbornApostle.java b/Mage.Sets/src/mage/cards/s/ShadowbornApostle.java index 5a02ea1c61..8ab705985f 100644 --- a/Mage.Sets/src/mage/cards/s/ShadowbornApostle.java +++ b/Mage.Sets/src/mage/cards/s/ShadowbornApostle.java @@ -27,8 +27,8 @@ import mage.target.common.TargetControlledCreaturePermanent; */ public final class ShadowbornApostle extends CardImpl { - private static final FilterCreatureCard filter = new FilterCreatureCard("a Demon creature"); - private static final FilterControlledCreaturePermanent filterApostle = new FilterControlledCreaturePermanent("six creatures named Shadowborn Apostle"); + private static final FilterCreatureCard filter = new FilterCreatureCard("a Demon creature card"); + private static final FilterControlledCreaturePermanent filterApostle = new FilterControlledCreaturePermanent("creatures named Shadowborn Apostle"); static { filter.add(SubType.DEMON.getPredicate()); filterApostle.add(new NamePredicate("Shadowborn Apostle")); diff --git a/Mage.Sets/src/mage/cards/s/ShadowsOfThePast.java b/Mage.Sets/src/mage/cards/s/ShadowsOfThePast.java index 70b93c514a..6d87bf22b9 100644 --- a/Mage.Sets/src/mage/cards/s/ShadowsOfThePast.java +++ b/Mage.Sets/src/mage/cards/s/ShadowsOfThePast.java @@ -30,7 +30,7 @@ public final class ShadowsOfThePast extends CardImpl { // {4}{B}: Each opponent loses 2 life and you gain 2 life. Activate this ability only if there are four or more creature cards in your graveyard. Ability ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD, - new LoseLifeOpponentsEffect(2), new ManaCostsImpl<>("{4}{B}"), new CardsInControllerGraveyardCondition(4, StaticFilters.FILTER_CARD_CREATURE)); + new LoseLifeOpponentsEffect(2), new ManaCostsImpl<>("{4}{B}"), new CardsInControllerGraveyardCondition(4, StaticFilters.FILTER_CARD_CREATURES)); Effect effect = new GainLifeEffect(2); effect.setText("and you gain 2 life"); ability.addEffect(effect); diff --git a/Mage.Sets/src/mage/cards/s/SilvergladePathfinder.java b/Mage.Sets/src/mage/cards/s/SilvergladePathfinder.java index 4d045e0b48..c88e7f55ce 100644 --- a/Mage.Sets/src/mage/cards/s/SilvergladePathfinder.java +++ b/Mage.Sets/src/mage/cards/s/SilvergladePathfinder.java @@ -33,7 +33,7 @@ public final class SilvergladePathfinder extends CardImpl { // {1}{G}, {tap}, Discard a card: Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, - new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(0, 1, StaticFilters.FILTER_CARD_BASIC_LAND), true, true), + new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND), true, true), new ManaCostsImpl("{1}{G}")); ability.addCost(new TapSourceCost()); ability.addCost(new DiscardCardCost()); diff --git a/Mage.Sets/src/mage/cards/s/Skinshifter.java b/Mage.Sets/src/mage/cards/s/Skinshifter.java index a873598290..8019094272 100644 --- a/Mage.Sets/src/mage/cards/s/Skinshifter.java +++ b/Mage.Sets/src/mage/cards/s/Skinshifter.java @@ -1,11 +1,9 @@ - package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.Mode; -import mage.abilities.common.LimitedTimesPerTurnActivatedAbility; +import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; import mage.abilities.keyword.FlyingAbility; @@ -13,28 +11,29 @@ import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; -import mage.constants.Zone; +import mage.constants.SubType; import mage.game.permanent.token.TokenImpl; +import java.util.UUID; + /** - * * @author North */ public final class Skinshifter extends CardImpl { public Skinshifter(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.SHAMAN); this.power = new MageInt(1); this.toughness = new MageInt(1); - Ability ability = new LimitedTimesPerTurnActivatedAbility(Zone.BATTLEFIELD, + Ability ability = new SimpleActivatedAbility( new BecomesCreatureSourceEffect(new RhinoToken(), "", Duration.EndOfTurn), - new ManaCostsImpl("{G}")); + new ManaCostsImpl<>("{G}")); + ability.getModes().setChooseText("Choose one. Activate only once each turn."); Mode mode = new Mode(); mode.addEffect(new BecomesCreatureSourceEffect(new BirdToken(), "", Duration.EndOfTurn)); @@ -56,7 +55,7 @@ public final class Skinshifter extends CardImpl { return new Skinshifter(this); } - private class RhinoToken extends TokenImpl { + private static final class RhinoToken extends TokenImpl { public RhinoToken() { super("Rhino", "Rhino with base power and toughness 4/4 and gains trample"); @@ -68,6 +67,7 @@ public final class Skinshifter extends CardImpl { this.toughness = new MageInt(4); this.addAbility(TrampleAbility.getInstance()); } + public RhinoToken(final RhinoToken token) { super(token); } @@ -77,7 +77,7 @@ public final class Skinshifter extends CardImpl { } } - private class BirdToken extends TokenImpl { + private static final class BirdToken extends TokenImpl { public BirdToken() { super("Bird", "Bird with base power and toughness 2/2 and gains flying"); @@ -89,6 +89,7 @@ public final class Skinshifter extends CardImpl { this.toughness = new MageInt(2); this.addAbility(FlyingAbility.getInstance()); } + public BirdToken(final BirdToken token) { super(token); } @@ -98,7 +99,7 @@ public final class Skinshifter extends CardImpl { } } - private class PlantToken extends TokenImpl { + private static final class PlantToken extends TokenImpl { public PlantToken() { super("Plant", "Plant with base power and toughness 0/8"); @@ -109,6 +110,7 @@ public final class Skinshifter extends CardImpl { this.power = new MageInt(0); this.toughness = new MageInt(8); } + public PlantToken(final PlantToken token) { super(token); } diff --git a/Mage.Sets/src/mage/cards/s/SparkOfCreativity.java b/Mage.Sets/src/mage/cards/s/SparkOfCreativity.java index fff863fea9..17f83d65c2 100644 --- a/Mage.Sets/src/mage/cards/s/SparkOfCreativity.java +++ b/Mage.Sets/src/mage/cards/s/SparkOfCreativity.java @@ -48,7 +48,7 @@ class SparkOfCreativityEffect extends OneShotEffect { public SparkOfCreativityEffect() { super(Outcome.Benefit); - this.staticText = "Choose target creature. Exile the top card of your library. You may have Spark of Creativity deal damage to that creature equal to the mana value of the exiled card. If you don't, you may play that card until end of turn"; + this.staticText = "Choose target creature. Exile the top card of your library. You may have {this} deal damage to that creature equal to the exiled card's mana value. If you don't, you may play that card until end of turn"; } public SparkOfCreativityEffect(final SparkOfCreativityEffect effect) { diff --git a/Mage.Sets/src/mage/cards/s/SpeakerOfTheHeavens.java b/Mage.Sets/src/mage/cards/s/SpeakerOfTheHeavens.java index 94f369ee2c..fc43ccaae9 100644 --- a/Mage.Sets/src/mage/cards/s/SpeakerOfTheHeavens.java +++ b/Mage.Sets/src/mage/cards/s/SpeakerOfTheHeavens.java @@ -74,6 +74,6 @@ enum SpeakerOfTheHeavensCondition implements Condition { @Override public String toString() { - return "you have at least 7 life more than your starting life total and only any time you could cast a sorcery"; + return "you have at least 7 life more than your starting life total and only as a sorcery"; } } diff --git a/Mage.Sets/src/mage/cards/s/SphinxAmbassador.java b/Mage.Sets/src/mage/cards/s/SphinxAmbassador.java index 1032a41c65..90c2ee2772 100644 --- a/Mage.Sets/src/mage/cards/s/SphinxAmbassador.java +++ b/Mage.Sets/src/mage/cards/s/SphinxAmbassador.java @@ -55,7 +55,7 @@ class SphinxAmbassadorEffect extends OneShotEffect { public SphinxAmbassadorEffect() { super(Outcome.PutCreatureInPlay); - this.staticText = "search that player's library for a card, then that player names a card. If you searched for a creature card that isn't the named card, you may put it onto the battlefield under your control. Then that player shuffles"; + this.staticText = "search that player's library for a card, then that player chooses a card name. If you searched for a creature card that doesn't have that name, you may put it onto the battlefield under your control. Then that player shuffles"; } public SphinxAmbassadorEffect(final SphinxAmbassadorEffect effect) { diff --git a/Mage.Sets/src/mage/cards/s/StonehewerGiant.java b/Mage.Sets/src/mage/cards/s/StonehewerGiant.java index 907a5bd31f..47cf1c89c3 100644 --- a/Mage.Sets/src/mage/cards/s/StonehewerGiant.java +++ b/Mage.Sets/src/mage/cards/s/StonehewerGiant.java @@ -65,7 +65,7 @@ class StonehewerGiantEffect extends OneShotEffect { public StonehewerGiantEffect() { super(Outcome.PutCardInPlay); - this.staticText = "Search your library for an Equipment card and put it onto the battlefield. Attach it to a creature you control. Then shuffle"; + this.staticText = "search your library for an Equipment card, put it onto the battlefield, attach it to a creature you control, then shuffle"; } public StonehewerGiantEffect(final StonehewerGiantEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/TemptWithDiscovery.java b/Mage.Sets/src/mage/cards/t/TemptWithDiscovery.java index f7ef5ae1b5..cb2538f5cb 100644 --- a/Mage.Sets/src/mage/cards/t/TemptWithDiscovery.java +++ b/Mage.Sets/src/mage/cards/t/TemptWithDiscovery.java @@ -47,7 +47,7 @@ class TemptWithDiscoveryEffect extends OneShotEffect { public TemptWithDiscoveryEffect() { super(Outcome.PutLandInPlay); - this.staticText = "Tempting offer — Search your library for a land card and put it onto the battlefield. Each opponent may search their library for a land card and put it onto the battlefield. For each opponent who searches a library this way, search your library for a land card and put it onto the battlefield. Then each player who searched a library this way shuffles it"; + this.staticText = "Tempting offer — Search your library for a land card and put it onto the battlefield. Each opponent may search their library for a land card and put it onto the battlefield. For each opponent who searches a library this way, search your library for a land card and put it onto the battlefield. Then each player who searched a library this way shuffles"; } public TemptWithDiscoveryEffect(final TemptWithDiscoveryEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/TerentatekCub.java b/Mage.Sets/src/mage/cards/t/TerentatekCub.java index 8615990666..56814d2727 100644 --- a/Mage.Sets/src/mage/cards/t/TerentatekCub.java +++ b/Mage.Sets/src/mage/cards/t/TerentatekCub.java @@ -43,7 +43,7 @@ public final class TerentatekCub extends CardImpl { new OpponentControlsPermanentCondition(filter), "As long as an opponent controls a Jedi or Sith, {this} gets +1/+1")); Effect effect = new ConditionalRequirementEffect(new AttacksIfAbleSourceEffect(Duration.Custom), new OpponentControlsPermanentCondition(filter)); - effect.setText("and attacks each turn if able"); + effect.setText("and attacks each combat if able"); ability.addEffect(effect); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/t/Timesifter.java b/Mage.Sets/src/mage/cards/t/Timesifter.java index 58b45fc7e6..d084aa2eb4 100644 --- a/Mage.Sets/src/mage/cards/t/Timesifter.java +++ b/Mage.Sets/src/mage/cards/t/Timesifter.java @@ -46,7 +46,7 @@ class TimesifterEffect extends OneShotEffect { TimesifterEffect() { super(Outcome.ExtraTurn); - this.staticText = "each player exiles the top card of their library. The player who exiled the card with the highest mana value takes an extra turn after this one. If two or more players' cards are tied for highest cost, the tied players repeat this process until the tie is broken"; + this.staticText = "each player exiles the top card of their library. The player who exiled the card with the highest mana value takes an extra turn after this one. If two or more players' cards are tied for highest, the tied players repeat this process until the tie is broken"; } TimesifterEffect(final TimesifterEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/ToothAndNail.java b/Mage.Sets/src/mage/cards/t/ToothAndNail.java index 663ad56c18..cd1ef626fe 100644 --- a/Mage.Sets/src/mage/cards/t/ToothAndNail.java +++ b/Mage.Sets/src/mage/cards/t/ToothAndNail.java @@ -30,7 +30,7 @@ public final class ToothAndNail extends CardImpl { // Choose one - // Search your library for up to two creature cards, reveal them, put them into your hand, then shuffle your library; - this.getSpellAbility().addEffect(new SearchLibraryPutInHandEffect(new TargetCardInLibrary(0, 2, StaticFilters.FILTER_CARD_CREATURE), true)); + this.getSpellAbility().addEffect(new SearchLibraryPutInHandEffect(new TargetCardInLibrary(0, 2, StaticFilters.FILTER_CARD_CREATURES), true)); // or put up to two creature cards from your hand onto the battlefield. Mode mode = new Mode(); mode.addEffect(new ToothAndNailPutCreatureOnBattlefieldEffect()); diff --git a/Mage.Sets/src/mage/cards/t/TormentorsTrident.java b/Mage.Sets/src/mage/cards/t/TormentorsTrident.java index 5f4be14b16..9b1eb3a285 100644 --- a/Mage.Sets/src/mage/cards/t/TormentorsTrident.java +++ b/Mage.Sets/src/mage/cards/t/TormentorsTrident.java @@ -32,7 +32,7 @@ public final class TormentorsTrident extends CardImpl { // Equipped creature gets +3/+0 and attacks each turn if able. Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(3, 0)); Effect effect = new AttacksIfAbleAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.EQUIPMENT); - effect.setText("and attacks each turn if able"); + effect.setText("and attacks each combat if able"); ability.addEffect(effect); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/u/UncontrollableAnger.java b/Mage.Sets/src/mage/cards/u/UncontrollableAnger.java index c967d562ab..02b7de1005 100644 --- a/Mage.Sets/src/mage/cards/u/UncontrollableAnger.java +++ b/Mage.Sets/src/mage/cards/u/UncontrollableAnger.java @@ -44,7 +44,7 @@ public final class UncontrollableAnger extends CardImpl { // Enchanted creature gets +2/+2 and attacks each turn if able. ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2, 2, Duration.WhileOnBattlefield)); Effect effect = new AttacksIfAbleAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.AURA); - effect.setText("and attacks each turn if able"); + effect.setText("and attacks each combat if able"); ability.addEffect(effect); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/v/VarragothBloodskySire.java b/Mage.Sets/src/mage/cards/v/VarragothBloodskySire.java index 7b981195fc..587e80fa5e 100644 --- a/Mage.Sets/src/mage/cards/v/VarragothBloodskySire.java +++ b/Mage.Sets/src/mage/cards/v/VarragothBloodskySire.java @@ -57,7 +57,7 @@ class VarragothBloodskySireEffect extends SearchEffect { public VarragothBloodskySireEffect() { super(new TargetCardInLibrary(), Outcome.DrawCard); - this.staticText = "Target player searches their library for a card, then shuffles and puts that card on top of it"; + this.staticText = "Target player searches their library for a card, then shuffles and puts that card on top"; } private VarragothBloodskySireEffect(final VarragothBloodskySireEffect effect) { diff --git a/Mage.Sets/src/mage/cards/v/ViviensJaguar.java b/Mage.Sets/src/mage/cards/v/ViviensJaguar.java index 9f83feb3dd..d045a89aec 100644 --- a/Mage.Sets/src/mage/cards/v/ViviensJaguar.java +++ b/Mage.Sets/src/mage/cards/v/ViviensJaguar.java @@ -44,7 +44,7 @@ public final class ViviensJaguar extends CardImpl { new ManaCostsImpl("{2}{G}"), new PermanentsOnTheBattlefieldCondition(filter), "{2}{G}: Return {this} from your graveyard to your hand. " - + "Activate only if you control a Vivien planeswalker" + + "Activate only if you control a Vivien planeswalker." )); } diff --git a/Mage.Sets/src/mage/cards/w/WaveOfVitriol.java b/Mage.Sets/src/mage/cards/w/WaveOfVitriol.java index e756da84f0..6c681600ef 100644 --- a/Mage.Sets/src/mage/cards/w/WaveOfVitriol.java +++ b/Mage.Sets/src/mage/cards/w/WaveOfVitriol.java @@ -61,7 +61,7 @@ class WaveOfVitriolEffect extends OneShotEffect { public WaveOfVitriolEffect() { super(Outcome.Benefit); - this.staticText = "Each player sacrifices all artifacts, enchantments, and nonbasic lands they control. For each land sacrificed this way, its controller may search their library for a basic land card and put it onto the battlefield tapped. Then each player who searched their library this way shuffles it"; + this.staticText = "Each player sacrifices all artifacts, enchantments, and nonbasic lands they control. For each land sacrificed this way, its controller may search their library for a basic land card and put it onto the battlefield tapped. Then each player who searched their library this way shuffles"; } public WaveOfVitriolEffect(final WaveOfVitriolEffect effect) { diff --git a/Mage.Sets/src/mage/cards/w/WeirdHarvest.java b/Mage.Sets/src/mage/cards/w/WeirdHarvest.java index 730dff432a..d77c0e7170 100644 --- a/Mage.Sets/src/mage/cards/w/WeirdHarvest.java +++ b/Mage.Sets/src/mage/cards/w/WeirdHarvest.java @@ -45,7 +45,7 @@ class WeirdHarvestEffect extends OneShotEffect { public WeirdHarvestEffect() { super(Outcome.Detriment); - this.staticText = "Each player may search their library for up to X creature cards, reveal those cards, and put them into their hand. Then each player who searched their library this way shuffles it"; + this.staticText = "each player may search their library for up to X creature cards, reveal those cards, put them into their hand, then shuffle"; } public WeirdHarvestEffect(final WeirdHarvestEffect effect) { diff --git a/Mage.Sets/src/mage/cards/w/WildWanderer.java b/Mage.Sets/src/mage/cards/w/WildWanderer.java index 33e2ca90ed..a63db7564e 100644 --- a/Mage.Sets/src/mage/cards/w/WildWanderer.java +++ b/Mage.Sets/src/mage/cards/w/WildWanderer.java @@ -27,7 +27,7 @@ public final class WildWanderer extends CardImpl { this.toughness = new MageInt(2); // When Wild Wanderer enters the battlefield, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. - this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND), true, true))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND), true, true), true)); } private WildWanderer(final WildWanderer card) { diff --git a/Mage.Sets/src/mage/cards/w/WoodlandBellower.java b/Mage.Sets/src/mage/cards/w/WoodlandBellower.java index 22743023c8..eeea27be6c 100644 --- a/Mage.Sets/src/mage/cards/w/WoodlandBellower.java +++ b/Mage.Sets/src/mage/cards/w/WoodlandBellower.java @@ -1,43 +1,47 @@ - package mage.cards.w; -import java.util.UUID; import mage.MageInt; import mage.ObjectColor; -import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.ComparisonType; -import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.SuperType; -import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ColorPredicate; import mage.filter.predicate.mageobject.ManaValuePredicate; -import mage.game.Game; -import mage.players.Player; import mage.target.common.TargetCardInLibrary; +import java.util.UUID; + /** - * * @author fireshoes */ public final class WoodlandBellower extends CardImpl { + private static final FilterCard filter = new FilterCard("nonlegendary green creature card with mana value 3 or less"); + + static { + filter.add(new ColorPredicate(ObjectColor.GREEN)); + filter.add(CardType.CREATURE.getPredicate()); + filter.add(Predicates.not(SuperType.LEGENDARY.getPredicate())); + filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 4)); + } + public WoodlandBellower(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{G}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}{G}"); this.subtype.add(SubType.BEAST); this.power = new MageInt(6); this.toughness = new MageInt(5); // When Woodland Bellower enters the battlefield, you may search your library for a nonlegendary green creature card with converted mana cost 3 or less, put it onto the battlefield, then shuffle your library. - this.addAbility(new EntersBattlefieldTriggeredAbility(new WoodlandBellowerEffect(), true)); + this.addAbility(new EntersBattlefieldTriggeredAbility( + new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter)), true + )); } private WoodlandBellower(final WoodlandBellower card) { @@ -49,45 +53,3 @@ public final class WoodlandBellower extends CardImpl { return new WoodlandBellower(this); } } - -class WoodlandBellowerEffect extends OneShotEffect { - - WoodlandBellowerEffect() { - super(Outcome.PutCreatureInPlay); - staticText = "Search your library for a nonlegendary green creature card with mana value 3 or less, put it onto the battlefield, then shuffle"; - } - - WoodlandBellowerEffect(final WoodlandBellowerEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { - return false; - } - FilterCard filter = new FilterCard("nonlegendary green creature card with mana value 3 or less"); - filter.add(new ColorPredicate(ObjectColor.GREEN)); - filter.add(CardType.CREATURE.getPredicate()); - filter.add(Predicates.not(SuperType.LEGENDARY.getPredicate())); - filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 4)); - TargetCardInLibrary target = new TargetCardInLibrary(filter); - if (controller.searchLibrary(target, source, game)) { - if (!target.getTargets().isEmpty()) { - Card card = controller.getLibrary().getCard(target.getFirstTarget(), game); - controller.moveCards(card, Zone.BATTLEFIELD, source, game); - } - controller.shuffleLibrary(source, game); - return true; - } - controller.shuffleLibrary(source, game); - return false; - } - - @Override - public WoodlandBellowerEffect copy() { - return new WoodlandBellowerEffect(this); - } - -} diff --git a/Mage/src/main/java/mage/abilities/common/LimitedTimesPerTurnActivatedAbility.java b/Mage/src/main/java/mage/abilities/common/LimitedTimesPerTurnActivatedAbility.java index 8f43b20284..893fccdf69 100644 --- a/Mage/src/main/java/mage/abilities/common/LimitedTimesPerTurnActivatedAbility.java +++ b/Mage/src/main/java/mage/abilities/common/LimitedTimesPerTurnActivatedAbility.java @@ -44,7 +44,8 @@ public class LimitedTimesPerTurnActivatedAbility extends ActivatedAbilityImpl { public String getRule() { StringBuilder sb = new StringBuilder(super.getRule()).append(" Activate "); if (condition != null) { - sb.append("only ").append(condition.toString()).append(" and "); + String message = condition.toString(); + sb.append("only ").append(message.startsWith("if ") || message.startsWith("during") ? message : "if " + message).append(" and "); } if (getTiming() == TimingRule.SORCERY) { sb.append("only as a sorcery and "); diff --git a/Mage/src/main/java/mage/abilities/effects/common/UntapAllLandsControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/UntapAllLandsControllerEffect.java index 595fed8dc6..f99eee146f 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/UntapAllLandsControllerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/UntapAllLandsControllerEffect.java @@ -30,7 +30,7 @@ public class UntapAllLandsControllerEffect extends OneShotEffect { public UntapAllLandsControllerEffect(FilterLandPermanent filter) { super(Outcome.Untap); - staticText = "Untap all " + filter.getMessage() + " you control"; + staticText = "untap all " + filter.getMessage() + " you control"; this.filter = filter; } diff --git a/Mage/src/main/java/mage/abilities/effects/common/combat/AttacksIfAbleAttachedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/combat/AttacksIfAbleAttachedEffect.java index f13ad0cc48..329f0f8353 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/combat/AttacksIfAbleAttachedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/combat/AttacksIfAbleAttachedEffect.java @@ -18,7 +18,7 @@ public class AttacksIfAbleAttachedEffect extends RequirementEffect { public AttacksIfAbleAttachedEffect(Duration duration, AttachmentType attachmentType) { super(duration); - this.staticText = attachmentType.verb() + " creature attacks each turn if able"; + this.staticText = attachmentType.verb() + " creature attacks each combat if able"; } public AttacksIfAbleAttachedEffect(final AttacksIfAbleAttachedEffect effect) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/combat/AttacksIfAbleTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/combat/AttacksIfAbleTargetEffect.java index c545cd2488..848619ecd8 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/combat/AttacksIfAbleTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/combat/AttacksIfAbleTargetEffect.java @@ -50,7 +50,7 @@ public class AttacksIfAbleTargetEffect extends RequirementEffect { if (this.duration == Duration.EndOfTurn) { return "target " + mode.getTargets().get(0).getTargetName() + " attacks this turn if able"; } else { - return "target " + mode.getTargets().get(0).getTargetName() + " attacks each turn if able"; + return "target " + mode.getTargets().get(0).getTargetName() + " attacks each combat if able"; } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java index b9c3f839a0..07962c4ec1 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java @@ -146,9 +146,9 @@ public class BecomesCreatureSourceEffect extends ContinuousEffectImpl implements private void setText() { if (theyAreStillType != null && !theyAreStillType.isEmpty()) { - staticText = duration.toString() + " {this} becomes a " + token.getDescription() + " that's still a " + this.theyAreStillType; + staticText = duration.toString() + ", {this} becomes a " + token.getDescription() + " that's still a " + this.theyAreStillType; } else { - staticText = duration.toString() + " {this} becomes a " + token.getDescription(); + staticText = duration.toString() + ", {this} becomes a " + token.getDescription(); } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/PlayAdditionalLandsControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/PlayAdditionalLandsControllerEffect.java index 83663222cd..8005dd8f59 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/PlayAdditionalLandsControllerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/PlayAdditionalLandsControllerEffect.java @@ -54,6 +54,9 @@ public class PlayAdditionalLandsControllerEffect extends ContinuousEffectImpl { if (additionalCards == Integer.MAX_VALUE) { sb.append("any number of"); } else { + if (additionalCards > 1 && duration == Duration.EndOfTurn) { + sb.append("up to "); + } sb.append(CardUtil.numberToText(additionalCards, "an")); } sb.append(" additional land").append((additionalCards == 1 ? "" : "s")) diff --git a/Mage/src/main/java/mage/abilities/effects/common/search/SearchLibraryGraveyardPutInHandEffect.java b/Mage/src/main/java/mage/abilities/effects/common/search/SearchLibraryGraveyardPutInHandEffect.java index 94449d5c19..21cd0a5468 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/search/SearchLibraryGraveyardPutInHandEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/search/SearchLibraryGraveyardPutInHandEffect.java @@ -35,7 +35,7 @@ public class SearchLibraryGraveyardPutInHandEffect extends OneShotEffect { this.filter = filter; this.forceToSearchBoth = forceToSearchBoth; staticText = (youMay ? "you may " : "") + "search your library and" + (forceToSearchBoth ? "" : "/or") + " graveyard for a card named " + filter.getMessage() - + ", reveal it, then put it into your hand. " + (forceToSearchBoth ? "Then shuffle" : "If you search your library this way, shuffle"); + + ", reveal it, and put it into your hand. " + (forceToSearchBoth ? "Then shuffle" : "If you search your library this way, shuffle"); } public SearchLibraryGraveyardPutInHandEffect(final SearchLibraryGraveyardPutInHandEffect effect) {