From 24ff47c8035eed5c01986e71d0bae1131985d0aa Mon Sep 17 00:00:00 2001
From: Alex Vasile <48962821+Alex-Vasile@users.noreply.github.com>
Date: Sun, 6 Feb 2022 16:24:57 -0500
Subject: [PATCH] Fixed hints on ward
---
.../src/mage/cards/c/ChapelShieldgeist.java | 4 ++-
.../src/mage/cards/d/DragonsDisciple.java | 4 ++-
.../src/mage/cards/g/GavonyDawnguard.java | 2 +-
.../src/mage/cards/g/GraveyardGlutton.java | 2 +-
.../src/mage/cards/g/GraveyardTrespasser.java | 2 +-
.../src/mage/cards/h/HallOfStormGiants.java | 7 +++++-
Mage.Sets/src/mage/cards/l/LeatherArmor.java | 3 ++-
Mage.Sets/src/mage/cards/m/MoonrageBrute.java | 2 +-
.../src/mage/cards/o/OctaviaLivingThesis.java | 2 +-
Mage.Sets/src/mage/cards/p/PlateArmor.java | 3 ++-
.../mage/cards/s/StorvaldFrostGiantJarl.java | 4 +--
.../src/mage/cards/t/TimotharBaronOfBats.java | 2 +-
.../mage/cards/v/VarisSilverymoonRanger.java | 2 +-
Mage.Sets/src/mage/cards/w/WingedBoots.java | 4 ++-
.../java/mage/verify/VerifyCardDataTest.java | 6 ++---
.../mage/abilities/keyword/WardAbility.java | 25 +++++++++++++------
16 files changed, 48 insertions(+), 26 deletions(-)
diff --git a/Mage.Sets/src/mage/cards/c/ChapelShieldgeist.java b/Mage.Sets/src/mage/cards/c/ChapelShieldgeist.java
index d5ac684e100..5c366277c10 100644
--- a/Mage.Sets/src/mage/cards/c/ChapelShieldgeist.java
+++ b/Mage.Sets/src/mage/cards/c/ChapelShieldgeist.java
@@ -43,7 +43,9 @@ public final class ChapelShieldgeist extends CardImpl {
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
new WardAbility(new GenericManaCost(1)), Duration.WhileOnBattlefield,
StaticFilters.FILTER_PERMANENT_CREATURE
- ).setText("each creature you control has ward {1}")));
+ ).setText("each creature you control has ward {1}. " +
+ "(Whenever it becomes the target of a spell or ability an opponent controls, " +
+ "counter it unless that player pays 1.)")));
// If Chapel Shieldgeist would be put into a graveyard from anywhere, exile it instead.
this.addAbility(new PutIntoGraveFromAnywhereSourceAbility(new ExileSourceEffect().setText("exile it instead")));
diff --git a/Mage.Sets/src/mage/cards/d/DragonsDisciple.java b/Mage.Sets/src/mage/cards/d/DragonsDisciple.java
index ea6fc91d699..3c110d23ce6 100644
--- a/Mage.Sets/src/mage/cards/d/DragonsDisciple.java
+++ b/Mage.Sets/src/mage/cards/d/DragonsDisciple.java
@@ -44,7 +44,9 @@ public final class DragonsDisciple extends CardImpl {
// Dragons you control have ward {1}.
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
new WardAbility(new GenericManaCost(1)), Duration.WhileOnBattlefield, filter
- )));
+ ).setText("Dragons you control have ward {1}. " +
+ "(Whenever a Dragon you control becomes the target of a spell or ability an opponent controls, " +
+ "counter it unless that player pays 1.)")));
}
private DragonsDisciple(final DragonsDisciple card) {
diff --git a/Mage.Sets/src/mage/cards/g/GavonyDawnguard.java b/Mage.Sets/src/mage/cards/g/GavonyDawnguard.java
index 88f5cce5f93..ce6800aefed 100644
--- a/Mage.Sets/src/mage/cards/g/GavonyDawnguard.java
+++ b/Mage.Sets/src/mage/cards/g/GavonyDawnguard.java
@@ -39,7 +39,7 @@ public final class GavonyDawnguard extends CardImpl {
this.toughness = new MageInt(3);
// Ward {1}
- this.addAbility(new WardAbility(new ManaCostsImpl<>("{1}")));
+ this.addAbility(new WardAbility(new ManaCostsImpl<>("{1}"), false));
// If it's neither day nor night, it becomes day as Gavony Dawnguard enters the battlefield.
this.addAbility(new BecomeDayAsEntersAbility());
diff --git a/Mage.Sets/src/mage/cards/g/GraveyardGlutton.java b/Mage.Sets/src/mage/cards/g/GraveyardGlutton.java
index 2fd570828e3..5d6f60ee957 100644
--- a/Mage.Sets/src/mage/cards/g/GraveyardGlutton.java
+++ b/Mage.Sets/src/mage/cards/g/GraveyardGlutton.java
@@ -37,7 +37,7 @@ public final class GraveyardGlutton extends CardImpl {
this.nightCard = true;
// Ward—Discard a card.
- this.addAbility(new WardAbility(new DiscardCardCost()));
+ this.addAbility(new WardAbility(new DiscardCardCost(), false));
// Whenever Graveyard Glutton enters the battlefield or attacks, exile up to two target cards from graveyards. For each creature card exiled this way, each opponent loses 1 life and you gain 1 life.
Ability ability = new EntersBattlefieldOrAttacksSourceTriggeredAbility(new GraveyardGluttonEffect());
diff --git a/Mage.Sets/src/mage/cards/g/GraveyardTrespasser.java b/Mage.Sets/src/mage/cards/g/GraveyardTrespasser.java
index bec1aa22fc4..da157163818 100644
--- a/Mage.Sets/src/mage/cards/g/GraveyardTrespasser.java
+++ b/Mage.Sets/src/mage/cards/g/GraveyardTrespasser.java
@@ -37,7 +37,7 @@ public final class GraveyardTrespasser extends CardImpl {
this.secondSideCardClazz = mage.cards.g.GraveyardGlutton.class;
// Ward—Discard a card.
- this.addAbility(new WardAbility(new DiscardCardCost()));
+ this.addAbility(new WardAbility(new DiscardCardCost(), false));
// Whenever Graveyard Trespasser enters the battlefield or attacks, exile up to one target card from a graveyard. If a creature card was exiled this way, each opponent loses 1 life and you gain 1 life.
Ability ability = new EntersBattlefieldOrAttacksSourceTriggeredAbility(new GraveyardTrespasserEffect());
diff --git a/Mage.Sets/src/mage/cards/h/HallOfStormGiants.java b/Mage.Sets/src/mage/cards/h/HallOfStormGiants.java
index c0ccdba633f..58ae81c1ffe 100644
--- a/Mage.Sets/src/mage/cards/h/HallOfStormGiants.java
+++ b/Mage.Sets/src/mage/cards/h/HallOfStormGiants.java
@@ -50,7 +50,12 @@ public final class HallOfStormGiants extends CardImpl {
.withColor("U")
.withSubType(SubType.GIANT)
.withAbility(new WardAbility(new GenericManaCost(3))),
- "land", Duration.EndOfTurn), new ManaCostsImpl("{5}{U}")));
+ "land", Duration.EndOfTurn).setText(
+ "Until end of turn, Hall of Storm Giants becomes a 7/7 blue Giant creature with ward {3}. " +
+ "It's still a land. " +
+ "(Whenever it becomes the target of a spell or ability an opponent controls, " +
+ "counter it unless that player pays {3}.)"),
+ new ManaCostsImpl("{5}{U}")));
}
private HallOfStormGiants(final HallOfStormGiants card) {
diff --git a/Mage.Sets/src/mage/cards/l/LeatherArmor.java b/Mage.Sets/src/mage/cards/l/LeatherArmor.java
index 63c83f260aa..c509da29e68 100644
--- a/Mage.Sets/src/mage/cards/l/LeatherArmor.java
+++ b/Mage.Sets/src/mage/cards/l/LeatherArmor.java
@@ -33,7 +33,8 @@ public final class LeatherArmor extends CardImpl {
new WardAbility(new GenericManaCost(1)),
AttachmentType.EQUIPMENT,
Duration.WhileOnBattlefield,
- "and has ward {1}"
+ "and has ward {1}. (Whenever equipped creature becomes the target of a spell or ability an opponent controls, " +
+ "counter it unless that player pays {1}.)"
));
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/m/MoonrageBrute.java b/Mage.Sets/src/mage/cards/m/MoonrageBrute.java
index eb754cd791e..1b9ed12ce72 100644
--- a/Mage.Sets/src/mage/cards/m/MoonrageBrute.java
+++ b/Mage.Sets/src/mage/cards/m/MoonrageBrute.java
@@ -30,7 +30,7 @@ public final class MoonrageBrute extends CardImpl {
this.addAbility(FirstStrikeAbility.getInstance());
// Ward—Pay 3 life.
- this.addAbility(new WardAbility(new PayLifeCost(3)));
+ this.addAbility(new WardAbility(new PayLifeCost(3), false));
// Nightbound
this.addAbility(new NightboundAbility());
diff --git a/Mage.Sets/src/mage/cards/o/OctaviaLivingThesis.java b/Mage.Sets/src/mage/cards/o/OctaviaLivingThesis.java
index d18a3e8b43e..c6de4ca6f1b 100644
--- a/Mage.Sets/src/mage/cards/o/OctaviaLivingThesis.java
+++ b/Mage.Sets/src/mage/cards/o/OctaviaLivingThesis.java
@@ -48,7 +48,7 @@ public final class OctaviaLivingThesis extends CardImpl {
).setRuleAtTheTop(true).addHint(hint));
// Ward {8}
- this.addAbility(new WardAbility(new ManaCostsImpl<>("{8}")));
+ this.addAbility(new WardAbility(new ManaCostsImpl<>("{8}"), false));
// Magecraft — Whenever you cast an instant or sorcery spell, target creature has base power and toughness 8/8 until end of turn.
Ability ability = new MagecraftAbility(
diff --git a/Mage.Sets/src/mage/cards/p/PlateArmor.java b/Mage.Sets/src/mage/cards/p/PlateArmor.java
index df42e245ca9..e89ae384cc8 100644
--- a/Mage.Sets/src/mage/cards/p/PlateArmor.java
+++ b/Mage.Sets/src/mage/cards/p/PlateArmor.java
@@ -40,7 +40,8 @@ public final class PlateArmor extends CardImpl {
new WardAbility(new GenericManaCost(1)),
AttachmentType.EQUIPMENT,
Duration.WhileOnBattlefield,
- "and has ward {1}"
+ "and has ward {1}. (Whenever equipped creature becomes the target of a spell or ability an opponent controls, " +
+ "counter it unless that player pays {1}.)"
));
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/s/StorvaldFrostGiantJarl.java b/Mage.Sets/src/mage/cards/s/StorvaldFrostGiantJarl.java
index f209bdf8d30..9269679c2ad 100644
--- a/Mage.Sets/src/mage/cards/s/StorvaldFrostGiantJarl.java
+++ b/Mage.Sets/src/mage/cards/s/StorvaldFrostGiantJarl.java
@@ -35,11 +35,11 @@ public final class StorvaldFrostGiantJarl extends CardImpl {
this.toughness = new MageInt(7);
// Ward {3}
- this.addAbility(new WardAbility(new ManaCostsImpl<>("{3}")));
+ this.addAbility(new WardAbility(new ManaCostsImpl<>("{3}"), false));
// Other creatures you control have ward {3}.
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
- new WardAbility(new GenericManaCost(3)), Duration.WhileOnBattlefield,
+ new WardAbility(new GenericManaCost(3), false), Duration.WhileOnBattlefield,
StaticFilters.FILTER_PERMANENT_CREATURES, true
)));
diff --git a/Mage.Sets/src/mage/cards/t/TimotharBaronOfBats.java b/Mage.Sets/src/mage/cards/t/TimotharBaronOfBats.java
index 5641da434dc..00c6361ef0a 100644
--- a/Mage.Sets/src/mage/cards/t/TimotharBaronOfBats.java
+++ b/Mage.Sets/src/mage/cards/t/TimotharBaronOfBats.java
@@ -58,7 +58,7 @@ public class TimotharBaronOfBats extends CardImpl {
this.toughness = new MageInt(4);
// Ward—Discard a card.
- this.addAbility(new WardAbility(new DiscardCardCost()));
+ this.addAbility(new WardAbility(new DiscardCardCost(), false));
// Whenever another nontoken Vampire you control dies, you may pay {1} and exile it.
// If you do, create a 1/1 black Bat creature token with flying.
diff --git a/Mage.Sets/src/mage/cards/v/VarisSilverymoonRanger.java b/Mage.Sets/src/mage/cards/v/VarisSilverymoonRanger.java
index 9b1e8bfe428..1d2e4d957e6 100644
--- a/Mage.Sets/src/mage/cards/v/VarisSilverymoonRanger.java
+++ b/Mage.Sets/src/mage/cards/v/VarisSilverymoonRanger.java
@@ -47,7 +47,7 @@ public final class VarisSilverymoonRanger extends CardImpl {
this.addAbility(ReachAbility.getInstance());
// Ward {1}
- this.addAbility(new WardAbility(new ManaCostsImpl<>("{1}")));
+ this.addAbility(new WardAbility(new ManaCostsImpl<>("{1}"), false));
// Whenever you cast a creature or planeswalker spell, venture into the dungeon. This ability triggers only once each turn.
this.addAbility(new SpellCastControllerTriggeredAbility(
diff --git a/Mage.Sets/src/mage/cards/w/WingedBoots.java b/Mage.Sets/src/mage/cards/w/WingedBoots.java
index 30d861f9087..0d7a93c7d5a 100644
--- a/Mage.Sets/src/mage/cards/w/WingedBoots.java
+++ b/Mage.Sets/src/mage/cards/w/WingedBoots.java
@@ -31,7 +31,9 @@ public final class WingedBoots extends CardImpl {
));
ability.addEffect(new GainAbilityAttachedEffect(
new WardAbility(new GenericManaCost(4)), AttachmentType.EQUIPMENT
- ).setText("and ward {4}"));
+ ).setText("and ward {4}. " +
+ "(Whenever equipped creature becomes the target of a spell or ability an opponent controls, " +
+ "counter it unless that player pays {4}.)"));
this.addAbility(ability);
// Equip {1}
diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java
index ecf6c6332f8..9b35eb1fc5c 100644
--- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java
+++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java
@@ -7,10 +7,7 @@ import mage.abilities.common.WerewolfBackTriggeredAbility;
import mage.abilities.common.WerewolfFrontTriggeredAbility;
import mage.abilities.effects.common.FightTargetsEffect;
import mage.abilities.effects.keyword.ScryEffect;
-import mage.abilities.keyword.EnchantAbility;
-import mage.abilities.keyword.MenaceAbility;
-import mage.abilities.keyword.MultikickerAbility;
-import mage.abilities.keyword.TransformAbility;
+import mage.abilities.keyword.*;
import mage.cards.*;
import mage.cards.decks.DeckCardLists;
import mage.cards.decks.importer.DeckImporter;
@@ -1420,6 +1417,7 @@ public class VerifyCardDataTest {
hints.put(FightTargetsEffect.class, "Each deals damage equal to its power to the other");
hints.put(MenaceAbility.class, "can't be blocked except by two or more");
hints.put(ScryEffect.class, "Look at the top card of your library. You may put that card on the bottom of your library");
+ hints.put(WardAbility.class, "becomes the target of a spell or ability an opponent controls");
for (Class objectClass : hints.keySet()) {
String objectHint = hints.get(objectClass);
diff --git a/Mage/src/main/java/mage/abilities/keyword/WardAbility.java b/Mage/src/main/java/mage/abilities/keyword/WardAbility.java
index 0d9ce2405bc..acff52ce328 100644
--- a/Mage/src/main/java/mage/abilities/keyword/WardAbility.java
+++ b/Mage/src/main/java/mage/abilities/keyword/WardAbility.java
@@ -18,15 +18,22 @@ import mage.util.CardUtil;
public class WardAbility extends TriggeredAbilityImpl {
private final Cost cost;
+ private final boolean showAbilityHint;
public WardAbility(Cost cost) {
+ this(cost, true);
+ }
+
+ public WardAbility(Cost cost, boolean showAbilityHint) {
super(Zone.BATTLEFIELD, new CounterUnlessPaysEffect(cost), false);
this.cost = cost;
+ this.showAbilityHint = showAbilityHint;
}
private WardAbility(final WardAbility ability) {
super(ability);
this.cost = ability.cost.copy();
+ this.showAbilityHint = ability.showAbilityHint;
}
@Override
@@ -73,14 +80,18 @@ public class WardAbility extends TriggeredAbilityImpl {
} else {
sb.append("—").append(CardUtil.getTextWithFirstCharUpperCase(cost.getText())).append('.');
}
- sb.append(" (Whenever {this} becomes the target of a spell or ability an opponent controls, " +
- "counter that spell or ability unless that player ");
- if (cost instanceof ManaCost) {
- sb.append("pays ").append(cost.getText());
- } else {
- sb.append(cost.getText().replace("pay ", "pays "));
+
+ if (showAbilityHint) {
+ sb.append(" (Whenever this creature becomes the target of a spell or ability an opponent controls, " +
+ "counter it unless that player ");
+ if (cost instanceof ManaCost) {
+ sb.append("pays ").append(cost.getText());
+ } else {
+ sb.append(cost.getText().replace("pay ", "pays "));
+ }
+ sb.append(".)");
}
- sb.append(".)");
+
return sb.toString();
}
}