From 4cc77c49c4577e08f7de9c1b8f32beed6cb1f54c Mon Sep 17 00:00:00 2001
From: LevelX2 <ludwig.hirth@online.de>
Date: Thu, 19 Apr 2018 15:48:25 +0200
Subject: [PATCH] [DOM] Some fixes and tooltip rule text changes.

---
 Mage.Sets/src/mage/cards/c/CabalPaladin.java  | 14 ++++---------
 Mage.Sets/src/mage/cards/c/CuratorsWard.java  |  8 ++++++--
 .../src/mage/cards/d/DAvenantTrapper.java     |  6 ++++--
 Mage.Sets/src/mage/cards/d/DarkBargain.java   | 11 +++++-----
 .../src/mage/cards/d/DrudgeSentinel.java      |  8 +++-----
 .../src/mage/cards/l/LingeringPhantom.java    |  6 ++++--
 Mage.Sets/src/mage/cards/o/OnSerrasWings.java | 18 ++++++++---------
 .../src/mage/cards/p/PrecognitionField.java   | 20 ++++++++-----------
 Mage.Sets/src/mage/cards/s/SageOfLatNam.java  | 14 +++----------
 .../cards/s/SentinelOfThePearlTrident.java    | 10 ++++++++--
 .../src/mage/cards/s/SergeantAtArms.java      |  4 ++--
 .../src/mage/cards/s/ShalaiVoiceOfPlenty.java |  6 +++---
 .../mage/cards/s/SlinnVodaTheRisingDeep.java  |  6 +++---
 .../src/mage/cards/t/TheEldestReborn.java     |  3 ++-
 Mage.Sets/src/mage/cards/w/WizardsRetort.java |  3 ++-
 .../src/mage/cards/z/ZahidDjinnOfTheLamp.java |  2 +-
 .../AddConditionalColorlessManaEffect.java    |  2 +-
 .../PutLibraryIntoGraveTargetEffect.java      | 17 ++++++++--------
 .../effects/common/UntapLandsEffect.java      |  3 ++-
 .../AddCardSuperTypeAttachedEffect.java       |  3 ++-
 .../counter/AddCountersTargetEffect.java      |  3 ++-
 .../main/java/mage/constants/SuperType.java   |  5 +++--
 .../main/java/mage/filter/StaticFilters.java  |  5 +++++
 23 files changed, 91 insertions(+), 86 deletions(-)

diff --git a/Mage.Sets/src/mage/cards/c/CabalPaladin.java b/Mage.Sets/src/mage/cards/c/CabalPaladin.java
index b0a364e04b..ed50758c51 100644
--- a/Mage.Sets/src/mage/cards/c/CabalPaladin.java
+++ b/Mage.Sets/src/mage/cards/c/CabalPaladin.java
@@ -38,8 +38,7 @@ import mage.cards.CardSetInfo;
 import mage.constants.CardType;
 import mage.constants.Outcome;
 import mage.constants.TargetController;
-import mage.filter.FilterSpell;
-import mage.filter.predicate.mageobject.HistoricPredicate;
+import mage.filter.common.FilterHistoricSpell;
 
 /**
  *
@@ -47,12 +46,6 @@ import mage.filter.predicate.mageobject.HistoricPredicate;
  */
 public class CabalPaladin extends CardImpl {
 
-    private static final FilterSpell filter = new FilterSpell("a historic spell");
-
-    static {
-        filter.add(new HistoricPredicate());
-    }
-
     public CabalPaladin(UUID ownerId, CardSetInfo setInfo) {
         super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}");
 
@@ -63,8 +56,9 @@ public class CabalPaladin extends CardImpl {
 
         // Whenever you cast a historic spell, Cabal Paladin deals 2 damage to each opponent.
         this.addAbility(new SpellCastControllerTriggeredAbility(
-                new DamagePlayersEffect(Outcome.Damage, new StaticValue(2), TargetController.OPPONENT),
-                filter, true
+                new DamagePlayersEffect(Outcome.Damage, new StaticValue(2), TargetController.OPPONENT)
+                        .setText("{this} deals 2 damage to each opponent. <i>(Artifacts, legendaries, and Sagas are historic.)</i>"),
+                new FilterHistoricSpell(), true
         ));
     }
 
diff --git a/Mage.Sets/src/mage/cards/c/CuratorsWard.java b/Mage.Sets/src/mage/cards/c/CuratorsWard.java
index e59b33e975..45e6582263 100644
--- a/Mage.Sets/src/mage/cards/c/CuratorsWard.java
+++ b/Mage.Sets/src/mage/cards/c/CuratorsWard.java
@@ -30,6 +30,7 @@ package mage.cards.c;
 import java.util.UUID;
 import mage.abilities.Ability;
 import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.SimpleStaticAbility;
 import mage.abilities.effects.common.AttachEffect;
 import mage.abilities.effects.common.DrawCardSourceControllerEffect;
 import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
@@ -67,7 +68,9 @@ public class CuratorsWard extends CardImpl {
         this.addAbility(ability);
 
         // Enchanted permanent has hexproof.
-        ability.addEffect(new GainAbilityAttachedEffect(HexproofAbility.getInstance(), AttachmentType.AURA).setText("Enchanted permanent has hexproof"));
+        this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD,
+                new GainAbilityAttachedEffect(HexproofAbility.getInstance(), AttachmentType.AURA)
+                        .setText("Enchanted permanent has hexproof")));
 
         // When enchanted permanent leaves the battlefield, if it was historic, draw two cards.
         this.addAbility(new CuratorsWardTriggeredAbility());
@@ -112,7 +115,8 @@ class CuratorsWardTriggeredAbility extends TriggeredAbilityImpl {
 
     @Override
     public String getRule() {
-        return "When enchanted permanent leaves the battlefield, if it was historic," + super.getRule();
+        return "When enchanted permanent leaves the battlefield, if it was historic, " + super.getRule()
+                + " <i>(Artifacts, legendaries, and Sagas are historic.)</i>";
     }
 
     @Override
diff --git a/Mage.Sets/src/mage/cards/d/DAvenantTrapper.java b/Mage.Sets/src/mage/cards/d/DAvenantTrapper.java
index c61cce30bf..7fcf87c76c 100644
--- a/Mage.Sets/src/mage/cards/d/DAvenantTrapper.java
+++ b/Mage.Sets/src/mage/cards/d/DAvenantTrapper.java
@@ -32,10 +32,10 @@ import mage.MageInt;
 import mage.abilities.Ability;
 import mage.abilities.common.SpellCastControllerTriggeredAbility;
 import mage.abilities.effects.common.TapTargetEffect;
-import mage.constants.SubType;
 import mage.cards.CardImpl;
 import mage.cards.CardSetInfo;
 import mage.constants.CardType;
+import mage.constants.SubType;
 import mage.filter.FilterSpell;
 import mage.filter.predicate.mageobject.HistoricPredicate;
 import mage.target.common.TargetOpponentsCreaturePermanent;
@@ -61,7 +61,9 @@ public class DAvenantTrapper extends CardImpl {
         this.toughness = new MageInt(2);
 
         // Whenever you cast a historic spell, tap target creature an opponent controls.
-        Ability ability = new SpellCastControllerTriggeredAbility(new TapTargetEffect(), filter, true);
+        Ability ability = new SpellCastControllerTriggeredAbility(
+                new TapTargetEffect("tap target creature an opponent controls. <i>(Artifacts, legendaries, and Sagas are historic.)</i>"),
+                filter, true);
         ability.addTarget(new TargetOpponentsCreaturePermanent());
         this.addAbility(ability);
     }
diff --git a/Mage.Sets/src/mage/cards/d/DarkBargain.java b/Mage.Sets/src/mage/cards/d/DarkBargain.java
index f376009c74..c649310409 100644
--- a/Mage.Sets/src/mage/cards/d/DarkBargain.java
+++ b/Mage.Sets/src/mage/cards/d/DarkBargain.java
@@ -27,6 +27,8 @@
  */
 package mage.cards.d;
 
+import java.util.UUID;
+import mage.MageObject;
 import mage.abilities.Ability;
 import mage.abilities.effects.OneShotEffect;
 import mage.abilities.effects.common.DamageControllerEffect;
@@ -39,8 +41,6 @@ import mage.game.Game;
 import mage.players.Player;
 import mage.target.TargetCard;
 
-import java.util.UUID;
-
 /**
  *
  * @author Quercitron
@@ -70,7 +70,7 @@ class DarkBargainEffect extends OneShotEffect {
 
     public DarkBargainEffect() {
         super(Outcome.Benefit);
-        this.staticText = "Look at the top three cards of your library. Put two of them into your hand and the rest into your graveyard.";
+        this.staticText = "Look at the top three cards of your library. Put two of them into your hand and the rest into your graveyard";
     }
 
     public DarkBargainEffect(final DarkBargainEffect effect) {
@@ -85,7 +85,8 @@ class DarkBargainEffect extends OneShotEffect {
     @Override
     public boolean apply(Game game, Ability source) {
         Player player = game.getPlayer(source.getControllerId());
-        if (player != null) {
+        MageObject sourceOject = source.getSourceObject(game);
+        if (player != null && sourceOject != null) {
             Cards cards = new CardsImpl();
             int cardsCount = Math.min(3, player.getLibrary().size());
             for (int i = 0; i < cardsCount; i++) {
@@ -96,7 +97,7 @@ class DarkBargainEffect extends OneShotEffect {
             }
             if (!cards.isEmpty()) {
                 Cards cardsToHand = new CardsImpl();
-                player.lookAtCards("Dark Bargain", cards, game);
+                player.lookAtCards(sourceOject.getIdName(), cards, game);
                 TargetCard target = new TargetCard(Math.min(2, cards.size()), Zone.LIBRARY, new FilterCard("two cards to put in your hand"));
                 if (player.choose(Outcome.DrawCard, cards, target, game)) {
                     for (UUID targetId : target.getTargets()) {
diff --git a/Mage.Sets/src/mage/cards/d/DrudgeSentinel.java b/Mage.Sets/src/mage/cards/d/DrudgeSentinel.java
index 3bec34e324..189b80ff84 100644
--- a/Mage.Sets/src/mage/cards/d/DrudgeSentinel.java
+++ b/Mage.Sets/src/mage/cards/d/DrudgeSentinel.java
@@ -25,11 +25,9 @@
  *  authors and should not be interpreted as representing official policies, either expressed
  *  or implied, of BetaSteward_at_googlemail.com.
  */
-
 package mage.cards.d;
 
 import java.util.UUID;
-
 import mage.MageInt;
 import mage.abilities.Ability;
 import mage.abilities.common.SimpleActivatedAbility;
@@ -44,8 +42,7 @@ import mage.constants.Duration;
 import mage.constants.SubType;
 
 /**
- * @author JRHerlehy
- *         Created on 4/7/18.
+ * @author JRHerlehy Created on 4/7/18.
  */
 public class DrudgeSentinel extends CardImpl {
 
@@ -57,7 +54,8 @@ public class DrudgeSentinel extends CardImpl {
 
         // {3}: Tap Drudge Sentinel. It gains indestructible until end of turn.
         Ability ability = new SimpleActivatedAbility(new TapSourceEffect(), new ManaCostsImpl("{3}"));
-        ability.addEffect(new GainAbilitySourceEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn));
+        ability.addEffect(new GainAbilitySourceEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn)
+                .setText("It gains indestructible until end of turn"));
         this.addAbility(ability);
     }
 
diff --git a/Mage.Sets/src/mage/cards/l/LingeringPhantom.java b/Mage.Sets/src/mage/cards/l/LingeringPhantom.java
index b0d95a8a5c..1b671ec374 100644
--- a/Mage.Sets/src/mage/cards/l/LingeringPhantom.java
+++ b/Mage.Sets/src/mage/cards/l/LingeringPhantom.java
@@ -33,10 +33,10 @@ import mage.abilities.common.SpellCastControllerTriggeredAbility;
 import mage.abilities.costs.mana.ManaCostsImpl;
 import mage.abilities.effects.common.DoIfCostPaid;
 import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect;
-import mage.constants.SubType;
 import mage.cards.CardImpl;
 import mage.cards.CardSetInfo;
 import mage.constants.CardType;
+import mage.constants.SubType;
 import mage.constants.Zone;
 import mage.filter.FilterSpell;
 import mage.filter.predicate.mageobject.HistoricPredicate;
@@ -62,7 +62,9 @@ public class LingeringPhantom extends CardImpl {
 
         // Whenever you cast a historic spell, you may pay {B}. If you do, return Lingering Phantom from your graveyard to your hand.
         this.addAbility(new SpellCastControllerTriggeredAbility(
-                Zone.GRAVEYARD, new DoIfCostPaid(new ReturnSourceFromGraveyardToHandEffect(), new ManaCostsImpl("{B}")),
+                Zone.GRAVEYARD, new DoIfCostPaid(new ReturnSourceFromGraveyardToHandEffect()
+                        .setText("return {this} from your graveyard to your hand. <i>(Artifacts, legendaries, and Sagas are historic.)</i>"),
+                        new ManaCostsImpl("{B}")),
                 filter, true, false
         ));
     }
diff --git a/Mage.Sets/src/mage/cards/o/OnSerrasWings.java b/Mage.Sets/src/mage/cards/o/OnSerrasWings.java
index bbcd032994..a16cc6b7ac 100644
--- a/Mage.Sets/src/mage/cards/o/OnSerrasWings.java
+++ b/Mage.Sets/src/mage/cards/o/OnSerrasWings.java
@@ -28,9 +28,6 @@
 package mage.cards.o;
 
 import java.util.UUID;
-import mage.constants.SubType;
-import mage.constants.SuperType;
-import mage.target.common.TargetCreaturePermanent;
 import mage.abilities.Ability;
 import mage.abilities.common.SimpleStaticAbility;
 import mage.abilities.effects.Effect;
@@ -38,8 +35,6 @@ import mage.abilities.effects.common.AttachEffect;
 import mage.abilities.effects.common.continuous.AddCardSuperTypeAttachedEffect;
 import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
 import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
-import mage.constants.Outcome;
-import mage.target.TargetPermanent;
 import mage.abilities.keyword.EnchantAbility;
 import mage.abilities.keyword.FlyingAbility;
 import mage.abilities.keyword.LifelinkAbility;
@@ -49,7 +44,12 @@ import mage.cards.CardSetInfo;
 import mage.constants.AttachmentType;
 import mage.constants.CardType;
 import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.SubType;
+import mage.constants.SuperType;
 import mage.constants.Zone;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetCreaturePermanent;
 
 /**
  *
@@ -72,16 +72,16 @@ public class OnSerrasWings extends CardImpl {
 
         // Enchanted creature is legendary, gets +1/+1, and has flying, vigilance, and lifelink.
         Effect effect = new AddCardSuperTypeAttachedEffect(SuperType.LEGENDARY, Duration.WhileOnBattlefield, AttachmentType.AURA);
-        effect.setText("Enchanted creature is legendary,");
+        effect.setText("Enchanted creature is legendary");
         ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect);
         effect = new BoostEnchantedEffect(4, 4, Duration.WhileOnBattlefield);
-        effect.setText("gets +1/+1,");
+        effect.setText(", gets +1/+1");
         ability.addEffect(effect);
         effect = new GainAbilityAttachedEffect(FlyingAbility.getInstance(), AttachmentType.AURA);
-        effect.setText("and has flying");
+        effect.setText(", and has flying");
         ability.addEffect(effect);
         effect = new GainAbilityAttachedEffect(VigilanceAbility.getInstance(), AttachmentType.AURA);
-        effect.setText("vigilance,");
+        effect.setText(", vigilance,");
         ability.addEffect(effect);
         effect = new GainAbilityAttachedEffect(LifelinkAbility.getInstance(), AttachmentType.AURA);
         effect.setText("and lifelink");
diff --git a/Mage.Sets/src/mage/cards/p/PrecognitionField.java b/Mage.Sets/src/mage/cards/p/PrecognitionField.java
index ef071052b2..fb69066749 100644
--- a/Mage.Sets/src/mage/cards/p/PrecognitionField.java
+++ b/Mage.Sets/src/mage/cards/p/PrecognitionField.java
@@ -28,7 +28,6 @@
 package mage.cards.p;
 
 import java.util.UUID;
-
 import mage.MageObject;
 import mage.abilities.Ability;
 import mage.abilities.common.SimpleActivatedAbility;
@@ -36,14 +35,12 @@ import mage.abilities.common.SimpleStaticAbility;
 import mage.abilities.costs.mana.GenericManaCost;
 import mage.abilities.effects.AsThoughEffectImpl;
 import mage.abilities.effects.ContinuousEffectImpl;
-import mage.abilities.effects.Effect;
 import mage.abilities.effects.OneShotEffect;
 import mage.cards.Card;
 import mage.cards.CardImpl;
 import mage.cards.CardSetInfo;
 import mage.constants.*;
 import mage.game.Game;
-import mage.players.Library;
 import mage.players.Player;
 
 /**
@@ -54,15 +51,15 @@ public class PrecognitionField extends CardImpl {
     public PrecognitionField(UUID ownerId, CardSetInfo setInfo) {
         super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}");
 
-
         // You may look at the top card of your library.
         this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PrecognitionFieldTopCardRevealedEffect()));
+
         // You may cast the top card of your library if it's an instant or sorcery card.
         this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PrecognitionFieldTopCardCastEffect()));
+
         // {3}: Exile the top card of your library.
-        Effect effect = new PrecognitionFieldExileEffect();
-        effect.setText("Exile the top card of your library.");
-        Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new GenericManaCost(3));
+        this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD,
+                new PrecognitionFieldExileEffect(), new GenericManaCost(3)));
     }
 
     public PrecognitionField(final PrecognitionField card) {
@@ -155,6 +152,7 @@ class PrecognitionFieldExileEffect extends OneShotEffect {
 
     public PrecognitionFieldExileEffect() {
         super(Outcome.Benefit);
+        staticText = "exile the top card of your library";
     }
 
     public PrecognitionFieldExileEffect(final PrecognitionFieldExileEffect effect) {
@@ -169,12 +167,10 @@ class PrecognitionFieldExileEffect extends OneShotEffect {
     @Override
     public boolean apply(Game game, Ability source) {
         Player controller = game.getPlayer(source.getControllerId());
-        MageObject sourceObject = source.getSourceObject(game);
-        if (controller != null && sourceObject != null && controller.getLibrary().hasCards()) {
-            Library library = controller.getLibrary();
-            Card card = library.removeFromTop(game);
+        if (controller != null) {
+            Card card = controller.getLibrary().getFromTop(game);
             if (card != null) {
-                card.moveToExile(id, "Precognition Field Exile", source.getSourceId(), game);
+                controller.moveCards(card, Zone.EXILED, source, game);
             }
             return true;
         }
diff --git a/Mage.Sets/src/mage/cards/s/SageOfLatNam.java b/Mage.Sets/src/mage/cards/s/SageOfLatNam.java
index 40a38438dd..7129f43a1d 100644
--- a/Mage.Sets/src/mage/cards/s/SageOfLatNam.java
+++ b/Mage.Sets/src/mage/cards/s/SageOfLatNam.java
@@ -39,8 +39,7 @@ import mage.cards.CardSetInfo;
 import mage.constants.CardType;
 import mage.constants.SubType;
 import mage.constants.Zone;
-import mage.filter.common.FilterControlledPermanent;
-import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.filter.StaticFilters;
 import mage.target.common.TargetControlledPermanent;
 
 /**
@@ -49,15 +48,8 @@ import mage.target.common.TargetControlledPermanent;
  */
 public class SageOfLatNam extends CardImpl {
 
-    private static final FilterControlledPermanent filter = new FilterControlledPermanent("an Artifact");
-    
-    static
-    {
-        filter.add(new CardTypePredicate(CardType.ARTIFACT));
-    }
-    
     public SageOfLatNam(UUID ownerId, CardSetInfo setInfo) {
-        super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}");
+        super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}");
         this.subtype.add(SubType.HUMAN);
         this.subtype.add(SubType.ARTIFICER);
 
@@ -66,7 +58,7 @@ public class SageOfLatNam extends CardImpl {
 
         // {T}, Sacrifice an artifact: Draw a card.
         Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new TapSourceCost());
-        ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter)));
+        ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_PERMANENT_ARTIFACT_AN)));
         this.addAbility(ability);
     }
 
diff --git a/Mage.Sets/src/mage/cards/s/SentinelOfThePearlTrident.java b/Mage.Sets/src/mage/cards/s/SentinelOfThePearlTrident.java
index b86e8438b8..f66ec5c0f4 100644
--- a/Mage.Sets/src/mage/cards/s/SentinelOfThePearlTrident.java
+++ b/Mage.Sets/src/mage/cards/s/SentinelOfThePearlTrident.java
@@ -35,11 +35,12 @@ import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbil
 import mage.abilities.effects.Effect;
 import mage.abilities.effects.OneShotEffect;
 import mage.abilities.effects.common.ReturnToBattlefieldUnderOwnerControlTargetEffect;
-import mage.constants.SubType;
+import mage.abilities.keyword.FlashAbility;
 import mage.cards.CardImpl;
 import mage.cards.CardSetInfo;
 import mage.constants.CardType;
 import mage.constants.Outcome;
+import mage.constants.SubType;
 import mage.constants.Zone;
 import mage.filter.common.FilterControlledPermanent;
 import mage.filter.predicate.mageobject.HistoricPredicate;
@@ -69,6 +70,9 @@ public class SentinelOfThePearlTrident extends CardImpl {
         this.power = new MageInt(3);
         this.toughness = new MageInt(3);
 
+        // Flash
+        this.addAbility(FlashAbility.getInstance());
+
         // When Sentinel of the Pearl Trident enters the battlefield, you may exile target historic permanent you control. If you do, return that card to the battlefield under its owner's control at the beginning of the next end step.
         Ability etbAbility = new EntersBattlefieldTriggeredAbility(new SentinelOfThePearlTridentEffect(), true);
         etbAbility.addTarget(new TargetPermanent(filter));
@@ -87,7 +91,9 @@ public class SentinelOfThePearlTrident extends CardImpl {
 
 class SentinelOfThePearlTridentEffect extends OneShotEffect {
 
-    private static final String effectText = "exile target historic permanent you control. If you do, return that card to the battlefield under its owner's control at the beginning of the next end step";
+    private static final String effectText = "exile target historic permanent you control. "
+            + "If you do, return that card to the battlefield under its owner's control"
+            + " at the beginning of the next end step.  <i>(Artifacts, legendaries, and Sagas are historic.)</i>";
 
     SentinelOfThePearlTridentEffect() {
         super(Outcome.Detriment);
diff --git a/Mage.Sets/src/mage/cards/s/SergeantAtArms.java b/Mage.Sets/src/mage/cards/s/SergeantAtArms.java
index dc773e6c33..744a4b9025 100644
--- a/Mage.Sets/src/mage/cards/s/SergeantAtArms.java
+++ b/Mage.Sets/src/mage/cards/s/SergeantAtArms.java
@@ -34,10 +34,10 @@ import mage.abilities.condition.common.KickedCondition;
 import mage.abilities.decorator.ConditionalOneShotEffect;
 import mage.abilities.effects.common.CreateTokenEffect;
 import mage.abilities.keyword.KickerAbility;
-import mage.constants.SubType;
 import mage.cards.CardImpl;
 import mage.cards.CardSetInfo;
 import mage.constants.CardType;
+import mage.constants.SubType;
 import mage.game.permanent.token.SoldierToken;
 
 /**
@@ -60,7 +60,7 @@ public class SergeantAtArms extends CardImpl {
         // When Sergeant-at-Arms enters the battlefield, if it was kicked, create two 1/1 white soldier creature tokens.
         this.addAbility(new EntersBattlefieldTriggeredAbility(new ConditionalOneShotEffect(
                 new CreateTokenEffect(new SoldierToken(), 2), KickedCondition.instance,
-                "create two 1/1 white soldier creature tokens.")));
+                "create two 1/1 white Soldier creature tokens.")));
     }
 
     public SergeantAtArms(final SergeantAtArms card) {
diff --git a/Mage.Sets/src/mage/cards/s/ShalaiVoiceOfPlenty.java b/Mage.Sets/src/mage/cards/s/ShalaiVoiceOfPlenty.java
index e54d430ba9..d3a07b30ff 100644
--- a/Mage.Sets/src/mage/cards/s/ShalaiVoiceOfPlenty.java
+++ b/Mage.Sets/src/mage/cards/s/ShalaiVoiceOfPlenty.java
@@ -80,13 +80,13 @@ public class ShalaiVoiceOfPlenty extends CardImpl {
 
         // You, planeswalkers you control, and other creatures you control have hexproof.
         Effect effect = new GainAbilityControllerEffect(HexproofAbility.getInstance(), Duration.WhileOnBattlefield);
-        effect.setText("You,");
+        effect.setText("You");
         Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect);
         effect = new GainAbilityControlledEffect(HexproofAbility.getInstance(), Duration.WhileOnBattlefield, filter1);
-        effect.setText("planeswalkers you control,");
+        effect.setText(", planeswalkers you control");
         ability.addEffect(effect);
         effect = new GainAbilityControlledEffect(HexproofAbility.getInstance(), Duration.WhileOnBattlefield, filter2);
-        effect.setText("and other creatures you control have hexproof");
+        effect.setText(", and other creatures you control have hexproof");
         ability.addEffect(effect);
         this.addAbility(ability);
 
diff --git a/Mage.Sets/src/mage/cards/s/SlinnVodaTheRisingDeep.java b/Mage.Sets/src/mage/cards/s/SlinnVodaTheRisingDeep.java
index 8511d1173b..f56083c602 100644
--- a/Mage.Sets/src/mage/cards/s/SlinnVodaTheRisingDeep.java
+++ b/Mage.Sets/src/mage/cards/s/SlinnVodaTheRisingDeep.java
@@ -34,11 +34,11 @@ import mage.abilities.condition.common.KickedCondition;
 import mage.abilities.decorator.ConditionalTriggeredAbility;
 import mage.abilities.effects.common.ReturnToHandFromBattlefieldAllEffect;
 import mage.abilities.keyword.KickerAbility;
-import mage.constants.SubType;
-import mage.constants.SuperType;
 import mage.cards.CardImpl;
 import mage.cards.CardSetInfo;
 import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.SuperType;
 import mage.filter.common.FilterCreaturePermanent;
 import mage.filter.predicate.Predicates;
 import mage.filter.predicate.mageobject.SubtypePredicate;
@@ -79,7 +79,7 @@ public class SlinnVodaTheRisingDeep extends CardImpl {
                 KickedCondition.instance,
                 "when {this} enters the battlefield, if it was kicked, "
                 + "return all creatures to their owners' hands except for "
-                + "Merfolk, Krakens, Leviathans, Octopuses, and Serpents"
+                + "Merfolk, Krakens, Leviathans, Octopuses, and Serpents."
         ));
     }
 
diff --git a/Mage.Sets/src/mage/cards/t/TheEldestReborn.java b/Mage.Sets/src/mage/cards/t/TheEldestReborn.java
index 491d441b2d..c019eb53b3 100644
--- a/Mage.Sets/src/mage/cards/t/TheEldestReborn.java
+++ b/Mage.Sets/src/mage/cards/t/TheEldestReborn.java
@@ -68,7 +68,8 @@ public class TheEldestReborn extends CardImpl {
 
         // III — Put target creature or planeswalker card from a graveyard onto the battlefield under your control.
         Ability ability = sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III,
-                new ReturnFromGraveyardToBattlefieldTargetEffect());
+                new ReturnFromGraveyardToBattlefieldTargetEffect()
+                        .setText("Put target creature or planeswalker card from a graveyard onto the battlefield under your control"));
         FilterCard filter = new FilterCard("creature or planeswalker card from a graveyard");
         filter.add(Predicates.or(new CardTypePredicate(CardType.CREATURE), new CardTypePredicate(CardType.PLANESWALKER)));
         ability.addTarget(new TargetCardInGraveyard(filter));
diff --git a/Mage.Sets/src/mage/cards/w/WizardsRetort.java b/Mage.Sets/src/mage/cards/w/WizardsRetort.java
index 3db3f5b87f..33e9eb4b56 100644
--- a/Mage.Sets/src/mage/cards/w/WizardsRetort.java
+++ b/Mage.Sets/src/mage/cards/w/WizardsRetort.java
@@ -41,13 +41,14 @@ import mage.constants.Zone;
 import mage.filter.common.FilterControlledPermanent;
 import mage.filter.predicate.mageobject.SubtypePredicate;
 import mage.target.TargetSpell;
+
 /**
  *
  * @author Will
  */
 public class WizardsRetort extends CardImpl {
 
-    private static final FilterControlledPermanent filter = new FilterControlledPermanent("a Wizard");
+    private static final FilterControlledPermanent filter = new FilterControlledPermanent("you control a Wizard");
 
     static {
         filter.add(new SubtypePredicate(SubType.WIZARD));
diff --git a/Mage.Sets/src/mage/cards/z/ZahidDjinnOfTheLamp.java b/Mage.Sets/src/mage/cards/z/ZahidDjinnOfTheLamp.java
index 33f24bb802..d8461ddc06 100644
--- a/Mage.Sets/src/mage/cards/z/ZahidDjinnOfTheLamp.java
+++ b/Mage.Sets/src/mage/cards/z/ZahidDjinnOfTheLamp.java
@@ -59,7 +59,7 @@ public class ZahidDjinnOfTheLamp extends CardImpl {
 
         // You may pay {3}{U} and tap an untapped artifact you control rather than pay this spell's mana cost.
         AlternativeCostSourceAbility alternativeCostSourceAbility = new AlternativeCostSourceAbility(new ManaCostsImpl("{3}{U}"), null,
-                "You may pay {3}{U} and tap an untapped  artifact you control rather than pay this spell's mana cost");
+                "You may pay {3}{U} and tap an untapped  artifact you control rather than pay this spell's mana cost.");
         FilterControlledArtifactPermanent filter = new FilterControlledArtifactPermanent("untapped artifact you control");
         filter.add(Predicates.not(new TappedPredicate()));
         alternativeCostSourceAbility.addCost(new TapTargetCost(new TargetControlledPermanent(filter)));
diff --git a/Mage/src/main/java/mage/abilities/effects/common/AddConditionalColorlessManaEffect.java b/Mage/src/main/java/mage/abilities/effects/common/AddConditionalColorlessManaEffect.java
index 26aa0228f3..596b447002 100644
--- a/Mage/src/main/java/mage/abilities/effects/common/AddConditionalColorlessManaEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/common/AddConditionalColorlessManaEffect.java
@@ -26,7 +26,7 @@ public class AddConditionalColorlessManaEffect extends ManaEffect {
         this.manaBuilder = manaBuilder;
 
         staticText = "Add " + String.format(String.format("%%%ds", amount), " ").replace(" ", "{C}")
-                + " to your mana pool. " + manaBuilder.getRule();
+                + ". " + manaBuilder.getRule();
     }
 
     public AddConditionalColorlessManaEffect(final AddConditionalColorlessManaEffect effect) {
diff --git a/Mage/src/main/java/mage/abilities/effects/common/PutLibraryIntoGraveTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/PutLibraryIntoGraveTargetEffect.java
index c9f19b341c..c38f45161e 100644
--- a/Mage/src/main/java/mage/abilities/effects/common/PutLibraryIntoGraveTargetEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/common/PutLibraryIntoGraveTargetEffect.java
@@ -1,16 +1,16 @@
 /*
  *  Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
- * 
+ *
  *  Redistribution and use in source and binary forms, with or without modification, are
  *  permitted provided that the following conditions are met:
- * 
+ *
  *     1. Redistributions of source code must retain the above copyright notice, this list of
  *        conditions and the following disclaimer.
- * 
+ *
  *     2. Redistributions in binary form must reproduce the above copyright notice, this list
  *        of conditions and the following disclaimer in the documentation and/or other materials
  *        provided with the distribution.
- * 
+ *
  *  THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
  *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  *  FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
@@ -20,21 +20,20 @@
  *  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  *  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- * 
+ *
  *  The views and conclusions contained in the software and documentation are those of the
  *  authors and should not be interpreted as representing official policies, either expressed
  *  or implied, of BetaSteward_at_googlemail.com.
  */
-
 package mage.abilities.effects.common;
 
-import mage.constants.Outcome;
-import mage.constants.Zone;
 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.constants.Zone;
 import mage.game.Game;
 import mage.players.Player;
 import mage.util.CardUtil;
@@ -88,7 +87,7 @@ public class PutLibraryIntoGraveTargetEffect extends OneShotEffect {
         StringBuilder sb = new StringBuilder();
         String message = amount.getMessage();
 
-        sb.append("Target ").append(mode.getTargets().get(0).getTargetName());
+        sb.append("target ").append(mode.getTargets().get(0).getTargetName());
         sb.append(" puts the top ");
         if (message.isEmpty()) {
             if (amount.toString().equals("1")) {
diff --git a/Mage/src/main/java/mage/abilities/effects/common/UntapLandsEffect.java b/Mage/src/main/java/mage/abilities/effects/common/UntapLandsEffect.java
index cadc38451b..bd9def4d8e 100644
--- a/Mage/src/main/java/mage/abilities/effects/common/UntapLandsEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/common/UntapLandsEffect.java
@@ -39,6 +39,7 @@ import mage.game.Game;
 import mage.game.permanent.Permanent;
 import mage.players.Player;
 import mage.target.common.TargetLandPermanent;
+import mage.util.CardUtil;
 
 /**
  * "Untap (up to) X lands" effect
@@ -56,7 +57,7 @@ public class UntapLandsEffect extends OneShotEffect {
         super(Outcome.Untap);
         this.amount = amount;
         this.upTo = upTo;
-        staticText = "Untap " + (upTo ? "up to " : "") + amount + " lands";
+        staticText = "Untap " + (upTo ? "up to " : "") + CardUtil.numberToText(amount, staticText) + " lands";
     }
 
     public UntapLandsEffect(final UntapLandsEffect effect) {
diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSuperTypeAttachedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSuperTypeAttachedEffect.java
index 05498643ef..ac3b838f2a 100644
--- a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSuperTypeAttachedEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSuperTypeAttachedEffect.java
@@ -27,6 +27,7 @@
  */
 package mage.abilities.effects.common.continuous;
 
+import java.util.Locale;
 import mage.abilities.Ability;
 import mage.abilities.effects.ContinuousEffectImpl;
 import mage.constants.*;
@@ -74,7 +75,7 @@ public class AddCardSuperTypeAttachedEffect extends ContinuousEffectImpl {
     private void setText() {
         StringBuilder sb = new StringBuilder();
         sb.append(attachmentType.verb());
-        sb.append(" permanent is ").append(addedSuperType.toString()); //TODO add attacked card type detection
+        sb.append(" permanent is ").append(addedSuperType.toString().toLowerCase(Locale.ENGLISH)); //TODO add attacked card type detection
         staticText = sb.toString();
     }
 }
diff --git a/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersTargetEffect.java
index a890ba73ec..14389b03c3 100644
--- a/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersTargetEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersTargetEffect.java
@@ -154,7 +154,8 @@ public class AddCountersTargetEffect extends OneShotEffect {
             }
 
             if (target.getMaxNumberOfTargets() > 1 || target.getNumberOfTargets() == 0) {
-                sb.append(target.getMaxNumberOfTargets()).append(" target ").append(target.getTargetName());
+                sb.append(CardUtil.numberToText(target.getMaxNumberOfTargets()))
+                        .append(" target ").append(target.getTargetName());
             } else {
                 if (!target.getTargetName().startsWith("another")) {
                     sb.append("target ");
diff --git a/Mage/src/main/java/mage/constants/SuperType.java b/Mage/src/main/java/mage/constants/SuperType.java
index 773d871d28..f315f8fe22 100644
--- a/Mage/src/main/java/mage/constants/SuperType.java
+++ b/Mage/src/main/java/mage/constants/SuperType.java
@@ -14,11 +14,12 @@ public enum SuperType {
 
     String text;
 
-    SuperType(String text){
+    SuperType(String text) {
         this.text = text;
     }
 
-    public String toString(){
+    @Override
+    public String toString() {
         return text;
     }
 
diff --git a/Mage/src/main/java/mage/filter/StaticFilters.java b/Mage/src/main/java/mage/filter/StaticFilters.java
index 3d6470a15f..f19c56ffea 100644
--- a/Mage/src/main/java/mage/filter/StaticFilters.java
+++ b/Mage/src/main/java/mage/filter/StaticFilters.java
@@ -142,6 +142,11 @@ public final class StaticFilters {
     static {
         FILTER_CONTROLLED_PERMANENT_ARTIFACT.setLockedFilter(true);
     }
+    public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_ARTIFACT_AN = new FilterControlledArtifactPermanent("an artifact");
+
+    static {
+        FILTER_CONTROLLED_PERMANENT_ARTIFACT_AN.setLockedFilter(true);
+    }
     public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_ARTIFACT_OR_CREATURE = new FilterControlledPermanent("artifact or creature you control");
 
     static {