diff --git a/Mage.Sets/src/mage/cards/a/AngelicObserver.java b/Mage.Sets/src/mage/cards/a/AngelicObserver.java
index 2f2b08a0ff..b272203736 100644
--- a/Mage.Sets/src/mage/cards/a/AngelicObserver.java
+++ b/Mage.Sets/src/mage/cards/a/AngelicObserver.java
@@ -24,7 +24,7 @@ import java.util.UUID;
public final class AngelicObserver extends CardImpl {
private static final FilterPermanent filter
- = new FilterControlledPermanent(SubType.CITIZEN, "Citizens you control");
+ = new FilterControlledPermanent(SubType.CITIZEN, "Citizen you control");
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(filter);
private static final Hint hint = new ValueHint("Citizens you control", xValue);
diff --git a/Mage.Sets/src/mage/cards/b/BodyLaunderer.java b/Mage.Sets/src/mage/cards/b/BodyLaunderer.java
index 1b691addba..7fe27f8bc1 100644
--- a/Mage.Sets/src/mage/cards/b/BodyLaunderer.java
+++ b/Mage.Sets/src/mage/cards/b/BodyLaunderer.java
@@ -1,6 +1,5 @@
package mage.cards.b;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.DiesCreatureTriggeredAbility;
@@ -8,12 +7,12 @@ import mage.abilities.common.DiesSourceTriggeredAbility;
import mage.abilities.effects.Effects;
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
import mage.abilities.effects.keyword.ConniveSourceEffect;
-import mage.constants.ComparisonType;
-import mage.constants.SubType;
import mage.abilities.keyword.DeathtouchAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.ComparisonType;
+import mage.constants.SubType;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterCreatureCard;
import mage.filter.predicate.Predicates;
@@ -25,8 +24,9 @@ import mage.game.permanent.Permanent;
import mage.target.common.TargetCardInYourGraveyard;
import mage.target.targetadjustment.TargetAdjuster;
+import java.util.UUID;
+
/**
- *
* @author weirddan455
*/
public final class BodyLaunderer extends CardImpl {
@@ -51,11 +51,11 @@ public final class BodyLaunderer extends CardImpl {
this.addAbility(DeathtouchAbility.getInstance());
// Whenever another nontoken creature you control dies, Body Launderer connives.
- this.addAbility(new DiesCreatureTriggeredAbility(new ConniveSourceEffect(), false, filter));
+ this.addAbility(new DiesCreatureTriggeredAbility(new ConniveSourceEffect("{this}"), false, filter));
// When Body Launderer dies, return another target non-Rogue creature card with power less than or equal to Body Launderer from your graveyard to the battlefield.
Ability ability = new DiesSourceTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect()
- .setText("return another target non-Rogue creature card with power less than or equal to {this} from your graveyard to the battlefield")
+ .setText("return another target non-Rogue creature card with equal or lesser power from your graveyard to the battlefield")
);
ability.setTargetAdjuster(BodyLaundererAdjuster.instance);
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/b/BoonOfSafety.java b/Mage.Sets/src/mage/cards/b/BoonOfSafety.java
index 3b7239026e..7ecff9bf54 100644
--- a/Mage.Sets/src/mage/cards/b/BoonOfSafety.java
+++ b/Mage.Sets/src/mage/cards/b/BoonOfSafety.java
@@ -1,16 +1,16 @@
package mage.cards.b;
-import java.util.UUID;
-
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.abilities.effects.keyword.ScryEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.counters.CounterType;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
/**
- *
* @author TheElk801
*/
public final class BoonOfSafety extends CardImpl {
@@ -20,9 +20,10 @@ public final class BoonOfSafety extends CardImpl {
// Put a shield counter on target creature.
this.getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.SHIELD.createInstance()));
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
// Scry 1.
- this.getSpellAbility().addEffect(new ScryEffect(1,false).concatBy("
"));
+ this.getSpellAbility().addEffect(new ScryEffect(1, false).concatBy("
"));
}
private BoonOfSafety(final BoonOfSafety card) {
diff --git a/Mage.Sets/src/mage/cards/b/BouncersBeatdown.java b/Mage.Sets/src/mage/cards/b/BouncersBeatdown.java
index 558caa0baa..e003395662 100644
--- a/Mage.Sets/src/mage/cards/b/BouncersBeatdown.java
+++ b/Mage.Sets/src/mage/cards/b/BouncersBeatdown.java
@@ -37,7 +37,7 @@ public final class BouncersBeatdown extends CardImpl {
// This spell costs {2} less to cast if it targets a black permanent.
this.addAbility(new SimpleStaticAbility(
- Zone.ALL, new SpellCostReductionSourceEffect(3, condition).setCanWorksOnStackOnly(true)
+ Zone.ALL, new SpellCostReductionSourceEffect(2, condition).setCanWorksOnStackOnly(true)
).setRuleAtTheTop(true));
// Bouncer's Beatdown deals X damage to target creature or planeswalker, where X is the greatest power among creatures you control. If that creature or planeswalker would die this turn, exile it instead.
diff --git a/Mage.Sets/src/mage/cards/b/BrokersHideout.java b/Mage.Sets/src/mage/cards/b/BrokersHideout.java
index 6813a7877f..021c7b7f5d 100644
--- a/Mage.Sets/src/mage/cards/b/BrokersHideout.java
+++ b/Mage.Sets/src/mage/cards/b/BrokersHideout.java
@@ -43,7 +43,7 @@ public final class BrokersHideout extends CardImpl {
), false);
ability.addEffect(new GainLifeEffect(1).concatBy("and"));
this.addAbility(new EntersBattlefieldTriggeredAbility(new DoWhenCostPaid(
- ability, new SacrificeSourceCost(), null, false
+ ability, new SacrificeSourceCost().setText("sacrifice it"), null, false
)));
}
diff --git a/Mage.Sets/src/mage/cards/c/CabarettiAscendancy.java b/Mage.Sets/src/mage/cards/c/CabarettiAscendancy.java
index 16eb70bb04..4201c564e6 100644
--- a/Mage.Sets/src/mage/cards/c/CabarettiAscendancy.java
+++ b/Mage.Sets/src/mage/cards/c/CabarettiAscendancy.java
@@ -44,7 +44,7 @@ class CabarettiAscendencyEffect extends OneShotEffect {
public CabarettiAscendencyEffect() {
super(Outcome.DrawCard);
- this.staticText = "look at the top card of your library. If it's a creature or planeswalker card, you may reveal it and put it in your hand. If you don't, you may put it on the bottom of your library";
+ this.staticText = "look at the top card of your library. If it's a creature or planeswalker card, you may reveal it and put it into your hand. If you don't put the card into your hand, you may put it on the bottom of your library";
}
private CabarettiAscendencyEffect(final CabarettiAscendencyEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/c/CabarettiCourtyard.java b/Mage.Sets/src/mage/cards/c/CabarettiCourtyard.java
index 6363401838..bad2a9c30b 100644
--- a/Mage.Sets/src/mage/cards/c/CabarettiCourtyard.java
+++ b/Mage.Sets/src/mage/cards/c/CabarettiCourtyard.java
@@ -42,7 +42,7 @@ public final class CabarettiCourtyard extends CardImpl {
), false);
ability.addEffect(new GainLifeEffect(1).concatBy("and"));
this.addAbility(new EntersBattlefieldTriggeredAbility(new DoWhenCostPaid(
- ability, new SacrificeSourceCost(), null, false
+ ability, new SacrificeSourceCost().setText("sacrifice it"), null, false
)));
}
diff --git a/Mage.Sets/src/mage/cards/c/CapennaExpress.java b/Mage.Sets/src/mage/cards/c/CapennaExpress.java
index b56fc45cb6..10bad4bdfa 100644
--- a/Mage.Sets/src/mage/cards/c/CapennaExpress.java
+++ b/Mage.Sets/src/mage/cards/c/CapennaExpress.java
@@ -19,7 +19,7 @@ import java.util.UUID;
*/
public final class CapennaExpress extends CardImpl {
- private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.TREASURE);
+ private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.TREASURE, "Treasure");
public CapennaExpress(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}{G}");
diff --git a/Mage.Sets/src/mage/cards/c/CementShoes.java b/Mage.Sets/src/mage/cards/c/CementShoes.java
index 583a4894f7..eae1973b49 100644
--- a/Mage.Sets/src/mage/cards/c/CementShoes.java
+++ b/Mage.Sets/src/mage/cards/c/CementShoes.java
@@ -1,7 +1,5 @@
package mage.cards.c;
-import java.util.UUID;
-
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfYourEndStepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
@@ -10,14 +8,15 @@ import mage.abilities.effects.common.TapSourceEffect;
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
import mage.abilities.keyword.EquipAbility;
-import mage.constants.AttachmentType;
-import mage.constants.SubType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.constants.AttachmentType;
import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
/**
- *
* @author weirddan455
*/
public final class CementShoes extends CardImpl {
@@ -33,12 +32,11 @@ public final class CementShoes extends CardImpl {
new BeginningOfYourEndStepTriggeredAbility(new TapSourceEffect(), false),
AttachmentType.EQUIPMENT
).setText("and has \"At the beginning of your end step, tap this creature.\""));
+ this.addAbility(ability);
// Equipped creature doesn't untap during its controller's untap step.
- ability.addEffect(new DontUntapInControllersUntapStepEnchantedEffect()
- .setText("Equipped creature doesn't untap during its controller's untap step")
- );
- this.addAbility(ability);
+ this.addAbility(new SimpleStaticAbility(new DontUntapInControllersUntapStepEnchantedEffect()
+ .setText("Equipped creature doesn't untap during its controller's untap step")));
// Equip {2}
this.addAbility(new EquipAbility(2));
diff --git a/Mage.Sets/src/mage/cards/c/CitizensCrowbar.java b/Mage.Sets/src/mage/cards/c/CitizensCrowbar.java
index 864d6c1543..40c9431b09 100644
--- a/Mage.Sets/src/mage/cards/c/CitizensCrowbar.java
+++ b/Mage.Sets/src/mage/cards/c/CitizensCrowbar.java
@@ -43,6 +43,7 @@ public final class CitizensCrowbar extends CardImpl {
new DestroyTargetEffect(), new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT),
new SacrificeAttachmentCost(), new ManaCostsImpl<>("{W}"), new TapSourceCost()
));
+ this.addAbility(ability);
// Equip {2}
this.addAbility(new EquipAbility(2));
diff --git a/Mage.Sets/src/mage/cards/c/CivilServant.java b/Mage.Sets/src/mage/cards/c/CivilServant.java
index 8289506f6c..52d80ba512 100644
--- a/Mage.Sets/src/mage/cards/c/CivilServant.java
+++ b/Mage.Sets/src/mage/cards/c/CivilServant.java
@@ -42,7 +42,7 @@ public final class CivilServant extends CardImpl {
// Whenever Civil Servant attacks, you may tap another untapped Citizen you control. If you do, Civil Servant gets +1/+0 and gains lifelink until end of turn.
this.addAbility(new AttacksTriggeredAbility(new DoIfCostPaid(
- new BoostSourceEffect(1, 0, Duration.EndOfTurn).setText("{this} gets +1/+1"),
+ new BoostSourceEffect(1, 0, Duration.EndOfTurn).setText("{this} gets +1/+0"),
new TapTargetCost(new TargetControlledPermanent(filter))
).addEffect(new GainAbilitySourceEffect(
LifelinkAbility.getInstance(), Duration.EndOfTurn
diff --git a/Mage.Sets/src/mage/cards/d/DaringEscape.java b/Mage.Sets/src/mage/cards/d/DaringEscape.java
index 92bc098f62..335dbe7754 100644
--- a/Mage.Sets/src/mage/cards/d/DaringEscape.java
+++ b/Mage.Sets/src/mage/cards/d/DaringEscape.java
@@ -21,7 +21,7 @@ public final class DaringEscape extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{R}");
// Target creature gets +1/+0 and gains first strike until end of turn. Scry 1.
- this.getSpellAbility().addEffect(new BoostTargetEffect(1, 0));
+ this.getSpellAbility().addEffect(new BoostTargetEffect(1, 0).setText("target creature gets +1/+0"));
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(FirstStrikeAbility.getInstance()).setText("and gains first strike until end of turn"));
this.getSpellAbility().addEffect(new ScryEffect(1, false));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
diff --git a/Mage.Sets/src/mage/cards/e/ElspethResplendent.java b/Mage.Sets/src/mage/cards/e/ElspethResplendent.java
index e892b37bc6..036df34d81 100644
--- a/Mage.Sets/src/mage/cards/e/ElspethResplendent.java
+++ b/Mage.Sets/src/mage/cards/e/ElspethResplendent.java
@@ -46,7 +46,7 @@ public final class ElspethResplendent extends CardImpl {
this.addAbility(new LoyaltyAbility(new ElspethResplendentLookEffect(), -3));
// −7: Create five 3/3 white Angel creature tokens with flying.
- this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new Angel33Token(), 5)));
+ this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new Angel33Token(), 5), -7));
}
private ElspethResplendent(final ElspethResplendent card) {
@@ -113,7 +113,7 @@ class ElspethResplendentLookEffect extends OneShotEffect {
ElspethResplendentLookEffect() {
super(Outcome.Benefit);
- staticText = "look at the top seven cards of your library. You may put a permanent card" +
+ staticText = "look at the top seven cards of your library. You may put a permanent card " +
"with mana value 3 or less from among them onto the battlefield with a shield counter on it. " +
"Put the rest on the bottom of your library in a random order";
}
diff --git a/Mage.Sets/src/mage/cards/e/ErrantStreetArtist.java b/Mage.Sets/src/mage/cards/e/ErrantStreetArtist.java
index c373a08ccb..f6e5af6645 100644
--- a/Mage.Sets/src/mage/cards/e/ErrantStreetArtist.java
+++ b/Mage.Sets/src/mage/cards/e/ErrantStreetArtist.java
@@ -3,6 +3,7 @@ package mage.cards.e;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.CopyTargetSpellEffect;
import mage.abilities.keyword.DefenderAbility;
@@ -54,6 +55,7 @@ public final class ErrantStreetArtist extends CardImpl {
// {1}{U}, {T}: Copy target spell you control that wasn't cast. You may choose new targets for the copy.
Ability ability = new SimpleActivatedAbility(new CopyTargetSpellEffect(), new ManaCostsImpl<>("{1}{U}"));
+ ability.addCost(new TapSourceCost());
ability.addTarget(new TargetSpell(filter));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/e/EvenTheScore.java b/Mage.Sets/src/mage/cards/e/EvenTheScore.java
index 2ebfd4638d..b07af6fe13 100644
--- a/Mage.Sets/src/mage/cards/e/EvenTheScore.java
+++ b/Mage.Sets/src/mage/cards/e/EvenTheScore.java
@@ -57,4 +57,9 @@ enum EvenTheScoreCondition implements Condition {
.mapToInt(game.getState().getWatcher(CardsDrawnThisTurnWatcher.class)::getCardsDrawnThisTurn)
.anyMatch(x -> x >= 4);
}
+
+ @Override
+ public String toString() {
+ return "an opponent has drawn four or more cards this turn";
+ }
}
diff --git a/Mage.Sets/src/mage/cards/e/EvolvingDoor.java b/Mage.Sets/src/mage/cards/e/EvolvingDoor.java
index 7120530640..5a058e6859 100644
--- a/Mage.Sets/src/mage/cards/e/EvolvingDoor.java
+++ b/Mage.Sets/src/mage/cards/e/EvolvingDoor.java
@@ -2,7 +2,7 @@ package mage.cards.e;
import mage.ApprovingObject;
import mage.abilities.Ability;
-import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
@@ -34,7 +34,7 @@ public final class EvolvingDoor extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{G}");
// {1}, {T}, Sacrifice a creature: Count the colors of the sacrificed creature, then search your library for a creature card that's exactly that many colors plus one. Exile that card, then shuffle. You may cast the exiled card. Activate only as a sorcery.
- Ability ability = new SimpleActivatedAbility(new EvolvingDoorEffect(), new GenericManaCost(1));
+ Ability ability = new ActivateAsSorceryActivatedAbility(new EvolvingDoorEffect(), new GenericManaCost(1));
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_CREATURE_SHORT_TEXT)));
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/f/FatalGrudge.java b/Mage.Sets/src/mage/cards/f/FatalGrudge.java
index 3869a3450f..e56f3b5ec0 100644
--- a/Mage.Sets/src/mage/cards/f/FatalGrudge.java
+++ b/Mage.Sets/src/mage/cards/f/FatalGrudge.java
@@ -37,7 +37,7 @@ public final class FatalGrudge extends CardImpl {
this.getSpellAbility().addEffect(new FatalGrudgeEffect());
// Draw a card.
- this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1));
+ this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("
"));
}
private FatalGrudge(final FatalGrudge card) {
diff --git a/Mage.Sets/src/mage/cards/f/FightRigging.java b/Mage.Sets/src/mage/cards/f/FightRigging.java
index a42e3a3605..0832d0e183 100644
--- a/Mage.Sets/src/mage/cards/f/FightRigging.java
+++ b/Mage.Sets/src/mage/cards/f/FightRigging.java
@@ -46,7 +46,7 @@ public final class FightRigging extends CardImpl {
TargetController.YOU, false
);
ability.addEffect(new ConditionalOneShotEffect(
- new HideawayPlayEffect(), condition, "then if you control a creature " +
+ new HideawayPlayEffect(), condition, "Then if you control a creature " +
"with power 7 or greater, you may play the exiled card without paying its mana cost"
));
ability.addTarget(new TargetControlledCreaturePermanent());
diff --git a/Mage.Sets/src/mage/cards/g/GlamorousOutlaw.java b/Mage.Sets/src/mage/cards/g/GlamorousOutlaw.java
index 7b5787708a..23a42c33d8 100644
--- a/Mage.Sets/src/mage/cards/g/GlamorousOutlaw.java
+++ b/Mage.Sets/src/mage/cards/g/GlamorousOutlaw.java
@@ -29,7 +29,7 @@ public final class GlamorousOutlaw extends CardImpl {
// When Glamorous Outlaw enters the battlefield, it deals 2 damage to each opponent and you scry 2.
Ability ability = new EntersBattlefieldTriggeredAbility(
- new DamagePlayersEffect(2, TargetController.OPPONENT)
+ new DamagePlayersEffect(2, TargetController.OPPONENT, "it")
);
ability.addEffect(new ScryEffect(2, false).concatBy("and you"));
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/g/GraveyardShift.java b/Mage.Sets/src/mage/cards/g/GraveyardShift.java
index 54e28c2631..30c73a1b37 100644
--- a/Mage.Sets/src/mage/cards/g/GraveyardShift.java
+++ b/Mage.Sets/src/mage/cards/g/GraveyardShift.java
@@ -13,7 +13,7 @@ import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Zone;
import mage.filter.StaticFilters;
-import mage.target.common.TargetCardInGraveyard;
+import mage.target.common.TargetCardInYourGraveyard;
import java.util.UUID;
@@ -36,7 +36,7 @@ public final class GraveyardShift extends CardImpl {
// Return target creature card from your graveyard to the battlefield.
this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect());
- this.getSpellAbility().addTarget(new TargetCardInGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
+ this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
}
private GraveyardShift(final GraveyardShift card) {
diff --git a/Mage.Sets/src/mage/cards/h/HypnoticGrifter.java b/Mage.Sets/src/mage/cards/h/HypnoticGrifter.java
index f9c38bb0b1..324854d03f 100644
--- a/Mage.Sets/src/mage/cards/h/HypnoticGrifter.java
+++ b/Mage.Sets/src/mage/cards/h/HypnoticGrifter.java
@@ -25,7 +25,7 @@ public final class HypnoticGrifter extends CardImpl {
this.toughness = new MageInt(2);
// {3}: Hypnotic Grifter connives.
- this.addAbility(new SimpleActivatedAbility(new ConniveSourceEffect(), new GenericManaCost(3)));
+ this.addAbility(new SimpleActivatedAbility(new ConniveSourceEffect("{this}"), new GenericManaCost(3)));
}
private HypnoticGrifter(final HypnoticGrifter card) {
diff --git a/Mage.Sets/src/mage/cards/k/KnockoutBlow.java b/Mage.Sets/src/mage/cards/k/KnockoutBlow.java
index 09083c7514..508f7efe08 100644
--- a/Mage.Sets/src/mage/cards/k/KnockoutBlow.java
+++ b/Mage.Sets/src/mage/cards/k/KnockoutBlow.java
@@ -12,6 +12,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Zone;
import mage.filter.FilterPermanent;
+import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.ColorPredicate;
import mage.target.common.TargetAttackingOrBlockingCreature;
@@ -23,7 +24,7 @@ import java.util.UUID;
public final class KnockoutBlow extends CardImpl {
private static final FilterPermanent filter
- = new FilterPermanent("a red permanent");
+ = new FilterCreaturePermanent("a red creature");
static {
filter.add(new ColorPredicate(ObjectColor.RED));
diff --git a/Mage.Sets/src/mage/cards/l/LedgerShredder.java b/Mage.Sets/src/mage/cards/l/LedgerShredder.java
index 82254abcc3..5a33300933 100644
--- a/Mage.Sets/src/mage/cards/l/LedgerShredder.java
+++ b/Mage.Sets/src/mage/cards/l/LedgerShredder.java
@@ -29,7 +29,7 @@ public final class LedgerShredder extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// Whenever a player casts their second spell each turn, Ledger Shredder connives.
- this.addAbility(new CastSecondSpellTriggeredAbility(new ConniveSourceEffect(), TargetController.ANY));
+ this.addAbility(new CastSecondSpellTriggeredAbility(new ConniveSourceEffect("{this}"), TargetController.ANY));
}
private LedgerShredder(final LedgerShredder card) {
diff --git a/Mage.Sets/src/mage/cards/m/MaestrosTheater.java b/Mage.Sets/src/mage/cards/m/MaestrosTheater.java
index f94bb2b173..9fe34869da 100644
--- a/Mage.Sets/src/mage/cards/m/MaestrosTheater.java
+++ b/Mage.Sets/src/mage/cards/m/MaestrosTheater.java
@@ -42,7 +42,7 @@ public final class MaestrosTheater extends CardImpl {
), false);
ability.addEffect(new GainLifeEffect(1).concatBy("and"));
this.addAbility(new EntersBattlefieldTriggeredAbility(new DoWhenCostPaid(
- ability, new SacrificeSourceCost(), null, false
+ ability, new SacrificeSourceCost().setText("sacrifice it"), null, false
)));
}
diff --git a/Mage.Sets/src/mage/cards/o/ObNixilisTheAdversary.java b/Mage.Sets/src/mage/cards/o/ObNixilisTheAdversary.java
index 967d15906f..7516f32be3 100644
--- a/Mage.Sets/src/mage/cards/o/ObNixilisTheAdversary.java
+++ b/Mage.Sets/src/mage/cards/o/ObNixilisTheAdversary.java
@@ -73,7 +73,7 @@ class ObNixilisTheAdversaryCasualtyAbility extends StaticAbility {
public ObNixilisTheAdversaryCasualtyAbility(Card card) {
super(Zone.ALL, new InfoEffect(
- "Casualty X. (As you cast this spell, " +
+ "Casualty X. The copy isn't legendary and has starting loyalty X. (As you cast this spell, " +
"you may sacrifice a creature with power X. " +
"When you do, copy this spell. The copy becomes a token.)"
));
diff --git a/Mage.Sets/src/mage/cards/o/ObscuraInitiate.java b/Mage.Sets/src/mage/cards/o/ObscuraInitiate.java
index ac5a6cc475..2886cdcddf 100644
--- a/Mage.Sets/src/mage/cards/o/ObscuraInitiate.java
+++ b/Mage.Sets/src/mage/cards/o/ObscuraInitiate.java
@@ -9,6 +9,7 @@ import mage.abilities.keyword.LifelinkAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.Duration;
import mage.constants.SubType;
import java.util.UUID;
@@ -30,9 +31,9 @@ public final class ObscuraInitiate extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// {1}{W/B}: Obscura Initiate gains lifelink until end of turn.
- this.addAbility(new SimpleActivatedAbility(
- new GainAbilitySourceEffect(LifelinkAbility.getInstance()), new ManaCostsImpl<>("{1}{W/B}")
- ));
+ this.addAbility(new SimpleActivatedAbility(new GainAbilitySourceEffect(
+ LifelinkAbility.getInstance(), Duration.EndOfTurn
+ ), new ManaCostsImpl<>("{1}{W/B}")));
}
private ObscuraInitiate(final ObscuraInitiate card) {
diff --git a/Mage.Sets/src/mage/cards/o/ObscuraInterceptor.java b/Mage.Sets/src/mage/cards/o/ObscuraInterceptor.java
index 8560eb5981..196dbed282 100644
--- a/Mage.Sets/src/mage/cards/o/ObscuraInterceptor.java
+++ b/Mage.Sets/src/mage/cards/o/ObscuraInterceptor.java
@@ -38,7 +38,7 @@ public final class ObscuraInterceptor extends CardImpl {
// When Obscura Interceptor enters the battlefield, it connives. When it connives this way, return up to one target spell to its owner's hand.
ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(new ReturnToHandTargetEffect(), false);
ability.addTarget(new TargetSpell(0, 1, StaticFilters.FILTER_SPELL));
- this.addAbility(new EntersBattlefieldTriggeredAbility(new ConniveSourceEffect(ability)));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new ConniveSourceEffect("it", ability)));
}
private ObscuraInterceptor(final ObscuraInterceptor card) {
diff --git a/Mage.Sets/src/mage/cards/o/ObscuraStorefront.java b/Mage.Sets/src/mage/cards/o/ObscuraStorefront.java
index 1e4a5d9e6c..0c4175e5a0 100644
--- a/Mage.Sets/src/mage/cards/o/ObscuraStorefront.java
+++ b/Mage.Sets/src/mage/cards/o/ObscuraStorefront.java
@@ -42,7 +42,7 @@ public final class ObscuraStorefront extends CardImpl {
), false);
ability.addEffect(new GainLifeEffect(1).concatBy("and"));
this.addAbility(new EntersBattlefieldTriggeredAbility(new DoWhenCostPaid(
- ability, new SacrificeSourceCost(), null, false
+ ability, new SacrificeSourceCost().setText("sacrifice it"), null, false
)));
}
diff --git a/Mage.Sets/src/mage/cards/p/PsychicPickpocket.java b/Mage.Sets/src/mage/cards/p/PsychicPickpocket.java
index e51d634e2f..7f04184474 100644
--- a/Mage.Sets/src/mage/cards/p/PsychicPickpocket.java
+++ b/Mage.Sets/src/mage/cards/p/PsychicPickpocket.java
@@ -29,7 +29,7 @@ public final class PsychicPickpocket extends CardImpl {
// When Psychic Pickpocket enters the battlefield, it connives. When it connives this way, return up to one target nonland permanent to its owner's hand.
ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(new ReturnToHandTargetEffect(), false);
ability.addTarget(new TargetNonlandPermanent(0, 1));
- this.addAbility(new EntersBattlefieldTriggeredAbility(new ConniveSourceEffect(ability)));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new ConniveSourceEffect("it", ability)));
}
private PsychicPickpocket(final PsychicPickpocket card) {
diff --git a/Mage.Sets/src/mage/cards/q/QuezaAugurOfAgonies.java b/Mage.Sets/src/mage/cards/q/QuezaAugurOfAgonies.java
index bf79cbe924..2be0501f24 100644
--- a/Mage.Sets/src/mage/cards/q/QuezaAugurOfAgonies.java
+++ b/Mage.Sets/src/mage/cards/q/QuezaAugurOfAgonies.java
@@ -30,7 +30,7 @@ public final class QuezaAugurOfAgonies extends CardImpl {
// Whenever you draw a card, target opponent loses 1 life and you gain 1 life.
Ability ability = new DrawCardControllerTriggeredAbility(new LoseLifeTargetEffect(1), false);
- ability.addEffect(new GainLifeEffect(1));
+ ability.addEffect(new GainLifeEffect(1).concatBy("and"));
ability.addTarget(new TargetOpponent());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/r/RiveteersAscendancy.java b/Mage.Sets/src/mage/cards/r/RiveteersAscendancy.java
index 64d31061e6..67eed77dc6 100644
--- a/Mage.Sets/src/mage/cards/r/RiveteersAscendancy.java
+++ b/Mage.Sets/src/mage/cards/r/RiveteersAscendancy.java
@@ -9,6 +9,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.FilterCard;
+import mage.filter.StaticFilters;
import mage.filter.common.FilterCreatureCard;
import mage.filter.predicate.ObjectSourcePlayer;
import mage.filter.predicate.ObjectSourcePlayerPredicate;
@@ -25,7 +26,7 @@ import java.util.UUID;
public final class RiveteersAscendancy extends CardImpl {
private static final FilterCard filter
- = new FilterCreatureCard("creature card with lesser mana value from your graveyard ");
+ = new FilterCreatureCard("creature card with lesser mana value from your graveyard");
static {
filter.add(RiveteersAscendancyPredicate.instance);
@@ -36,7 +37,8 @@ public final class RiveteersAscendancy extends CardImpl {
// Whenever you sacrifice a creature, you may return target creature card with lesser mana value from your graveyard to the battlefield tapped. Do this only once each turn.
Ability ability = new SacrificePermanentTriggeredAbility(
- new ReturnFromGraveyardToBattlefieldTargetEffect(true)
+ new ReturnFromGraveyardToBattlefieldTargetEffect(true),
+ StaticFilters.FILTER_PERMANENT_A_CREATURE
).setDoOnlyOnce(true);
ability.addTarget(new TargetCardInYourGraveyard(filter));
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/r/RiveteersOverlook.java b/Mage.Sets/src/mage/cards/r/RiveteersOverlook.java
index bed93dadb0..0342de20e6 100644
--- a/Mage.Sets/src/mage/cards/r/RiveteersOverlook.java
+++ b/Mage.Sets/src/mage/cards/r/RiveteersOverlook.java
@@ -42,7 +42,7 @@ public final class RiveteersOverlook extends CardImpl {
), false);
ability.addEffect(new GainLifeEffect(1).concatBy("and"));
this.addAbility(new EntersBattlefieldTriggeredAbility(new DoWhenCostPaid(
- ability, new SacrificeSourceCost(), null, false
+ ability, new SacrificeSourceCost().setText("sacrifice it"), null, false
)));
}
diff --git a/Mage.Sets/src/mage/cards/s/SanctuaryWarden.java b/Mage.Sets/src/mage/cards/s/SanctuaryWarden.java
index b9efb74371..4f926b367c 100644
--- a/Mage.Sets/src/mage/cards/s/SanctuaryWarden.java
+++ b/Mage.Sets/src/mage/cards/s/SanctuaryWarden.java
@@ -59,7 +59,7 @@ public final class SanctuaryWarden extends CardImpl {
new DoIfCostPaid(
new DrawCardSourceControllerEffect(1),
new RemoveCounterCost(new TargetControlledPermanent(filter))
- ).addEffect(new CreateTokenEffect(new CitizenGreenWhiteToken()))
+ ).addEffect(new CreateTokenEffect(new CitizenGreenWhiteToken()).concatBy("and"))
));
}
diff --git a/Mage.Sets/src/mage/cards/s/StickyFingers.java b/Mage.Sets/src/mage/cards/s/StickyFingers.java
index f3306a37e9..557fbf2e54 100644
--- a/Mage.Sets/src/mage/cards/s/StickyFingers.java
+++ b/Mage.Sets/src/mage/cards/s/StickyFingers.java
@@ -42,7 +42,7 @@ public final class StickyFingers extends CardImpl {
// Enchanted creature has menace and "Whenever this creature deals combat damage to a player, create a Treasure token.
Ability ability = new SimpleStaticAbility(new GainAbilityAttachedEffect(new MenaceAbility(false), AttachmentType.AURA));
ability.addEffect(new GainAbilityAttachedEffect(new DealsCombatDamageToAPlayerTriggeredAbility(new CreateTokenEffect(new TreasureToken()), false), AttachmentType.AURA)
- .setText("and \"Whenever this creature deals combat damage to a player, create a Treasure token. (It creature can't be blocked except by two or more creatures. The token is an artiface with \"{T}, Sacrifice this artifact: Add one mana of any color.\")"));
+ .setText("and \"Whenever this creature deals combat damage to a player, create a Treasure token.\" (It can't be blocked except by two or more creatures. The token is an artifact with \"{T}, Sacrifice this artifact: Add one mana of any color.\")"));
this.addAbility(ability);
// When enchanted creature dies, draw a card.
diff --git a/Mage.Sets/src/mage/cards/s/StimulusPackage.java b/Mage.Sets/src/mage/cards/s/StimulusPackage.java
index c02fac47d6..19fa50bac6 100644
--- a/Mage.Sets/src/mage/cards/s/StimulusPackage.java
+++ b/Mage.Sets/src/mage/cards/s/StimulusPackage.java
@@ -19,7 +19,7 @@ import java.util.UUID;
*/
public final class StimulusPackage extends CardImpl {
- private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.TREASURE);
+ private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.TREASURE, "a Treasure");
public StimulusPackage(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}{G}");
diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java
index 59eed819cd..6c61cfa16b 100644
--- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java
+++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java
@@ -62,7 +62,7 @@ public class VerifyCardDataTest {
private static final Logger logger = Logger.getLogger(VerifyCardDataTest.class);
- private static final String FULL_ABILITIES_CHECK_SET_CODE = "FUT"; // check all abilities and output cards with wrong abilities texts;
+ private static final String FULL_ABILITIES_CHECK_SET_CODE = "SNC"; // check all abilities and output cards with wrong abilities texts;
private static final boolean AUTO_FIX_SAMPLE_DECKS = false; // debug only: auto-fix sample decks by test_checkSampleDecks test run
private static final boolean ONLY_TEXT = false; // use when checking text locally, suppresses unnecessary checks and output messages
diff --git a/Mage/src/main/java/mage/abilities/costs/common/RemoveCounterCost.java b/Mage/src/main/java/mage/abilities/costs/common/RemoveCounterCost.java
index 148d89c9f9..036f83ac51 100644
--- a/Mage/src/main/java/mage/abilities/costs/common/RemoveCounterCost.java
+++ b/Mage/src/main/java/mage/abilities/costs/common/RemoveCounterCost.java
@@ -128,11 +128,18 @@ public class RemoveCounterCost extends CostImpl {
private String setText() {
StringBuilder sb = new StringBuilder("remove ");
if (counterTypeToRemove != null) {
- sb.append(CardUtil.numberToText(countersToRemove, counterTypeToRemove.getArticle())).append(' ').append(counterTypeToRemove.getName());
+ sb.append(CardUtil.numberToText(countersToRemove, counterTypeToRemove.getArticle()));
+ sb.append(' ');
+ sb.append(counterTypeToRemove.getName());
} else {
sb.append(CardUtil.numberToText(countersToRemove, "a"));
}
- sb.append(countersToRemove == 1 ? " counter from " : " counters from ").append(target.getMaxNumberOfTargets() == 1 ? "a " : "").append(target.getTargetName());
+ sb.append(countersToRemove > 1 ? " counters from " : " counter from ");
+ if (target.getMaxNumberOfTargets() > 1) {
+ sb.append(target.getTargetName());
+ } else {
+ sb.append(CardUtil.addArticle(target.getTargetName()));
+ }
return sb.toString();
}
diff --git a/Mage/src/main/java/mage/abilities/costs/common/UntapTargetCost.java b/Mage/src/main/java/mage/abilities/costs/common/UntapTargetCost.java
index 2206a4c73b..cdae3e0068 100644
--- a/Mage/src/main/java/mage/abilities/costs/common/UntapTargetCost.java
+++ b/Mage/src/main/java/mage/abilities/costs/common/UntapTargetCost.java
@@ -57,7 +57,8 @@ public class UntapTargetCost extends CostImpl {
StringBuilder sb = new StringBuilder("untap ");
if (target.getMaxNumberOfTargets() > 1) {
sb.append(CardUtil.numberToText(target.getMaxNumberOfTargets()));
- sb.append(target.getTargetName().replace("you control", "s you control"));
+ sb.append(' ');
+ sb.append(target.getTargetName().replace(" you control", "s you control"));
} else {
sb.append(CardUtil.addArticle(target.getTargetName()));
}
diff --git a/Mage/src/main/java/mage/abilities/effects/common/HideawayPlayEffect.java b/Mage/src/main/java/mage/abilities/effects/common/HideawayPlayEffect.java
index b9687198dc..c9232b617c 100644
--- a/Mage/src/main/java/mage/abilities/effects/common/HideawayPlayEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/common/HideawayPlayEffect.java
@@ -19,7 +19,7 @@ public class HideawayPlayEffect extends OneShotEffect {
public HideawayPlayEffect() {
super(Outcome.Benefit);
- staticText = "You may play the exiled card without paying its mana cost";
+ staticText = "you may play the exiled card without paying its mana cost";
}
public HideawayPlayEffect(final HideawayPlayEffect effect) {
diff --git a/Mage/src/main/java/mage/abilities/effects/common/MillHalfLibraryTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/MillHalfLibraryTargetEffect.java
index 35df10deae..64b4ba0127 100644
--- a/Mage/src/main/java/mage/abilities/effects/common/MillHalfLibraryTargetEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/common/MillHalfLibraryTargetEffect.java
@@ -12,7 +12,7 @@ import mage.players.Player;
*/
public class MillHalfLibraryTargetEffect extends OneShotEffect {
- private static boolean roundUp;
+ private final boolean roundUp;
public MillHalfLibraryTargetEffect(boolean roundUp) {
super(Outcome.Benefit);
diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/ConniveSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/ConniveSourceEffect.java
index 1d8c2d3808..a39dbb6d08 100644
--- a/Mage/src/main/java/mage/abilities/effects/keyword/ConniveSourceEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/keyword/ConniveSourceEffect.java
@@ -17,19 +17,26 @@ import mage.util.CardUtil;
*/
public class ConniveSourceEffect extends OneShotEffect {
+ private final String selfName;
private final ReflexiveTriggeredAbility ability;
public ConniveSourceEffect() {
- this((ReflexiveTriggeredAbility) null);
+ this("it");
}
- public ConniveSourceEffect(ReflexiveTriggeredAbility ability) {
+ public ConniveSourceEffect(String selfName) {
+ this(selfName, null);
+ }
+
+ public ConniveSourceEffect(String selfName, ReflexiveTriggeredAbility ability) {
super(Outcome.Benefit);
+ this.selfName = selfName;
this.ability = ability;
}
private ConniveSourceEffect(final ConniveSourceEffect effect) {
super(effect);
+ this.selfName = effect.selfName;
this.ability = effect.ability;
}
@@ -74,10 +81,10 @@ public class ConniveSourceEffect extends OneShotEffect {
return staticText;
}
if (ability == null) {
- return "it connives. (Draw a card, then discard a card. " +
+ return selfName + " connives. (Draw a card, then discard a card. " +
"If you discarded a nonland card, put a +1/+1 counter on this creature.)";
}
- return "it connives. When it connives this way, " +
+ return selfName + " connives. When it connives this way, " +
CardUtil.getTextWithFirstCharLowerCase(ability.getRule()) +
" (To have a creature connive, draw a card, then discard a card. " +
"If you discarded a nonland card, put a +1/+1 counter on that creature.)";
diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/ConniveTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/ConniveTargetEffect.java
index 086b999d94..3098eaed82 100644
--- a/Mage/src/main/java/mage/abilities/effects/keyword/ConniveTargetEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/keyword/ConniveTargetEffect.java
@@ -56,7 +56,7 @@ public class ConniveTargetEffect extends OneShotEffect {
sb.append(", where X is ");
sb.append(xValue.getMessage());
}
- sb.append("(Draw ");
+ sb.append(" (Draw ");
sb.append(xValue);
sb.append(" cards, then discard ");
sb.append(xValue);