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 1/3] 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(); } } From 999ea8150c9eaac040b5db26010bff8f794ed906 Mon Sep 17 00:00:00 2001 From: Alex Vasile <48962821+Alex-Vasile@users.noreply.github.com> Date: Sun, 6 Feb 2022 19:34:52 -0500 Subject: [PATCH 2/3] Fixed two NEO cards which passed on my computer but failed on travis... --- Mage.Sets/src/mage/cards/c/ColossalSkyturtle.java | 2 +- Mage.Sets/src/mage/cards/k/KairiTheSwirlingSky.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/cards/c/ColossalSkyturtle.java b/Mage.Sets/src/mage/cards/c/ColossalSkyturtle.java index fa829a03e7b..17fe0432093 100644 --- a/Mage.Sets/src/mage/cards/c/ColossalSkyturtle.java +++ b/Mage.Sets/src/mage/cards/c/ColossalSkyturtle.java @@ -33,7 +33,7 @@ public final class ColossalSkyturtle extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Ward {2} - this.addAbility(new WardAbility(new ManaCostsImpl<>("{2}"))); + this.addAbility(new WardAbility(new ManaCostsImpl<>("{2}"), false)); // Channel — {2}{G}, Discard Colossal Skyturtle: Return target card from your graveyard to your hand. Ability ability = new ChannelAbility("{2}{G}", new ReturnFromGraveyardToHandTargetEffect()); diff --git a/Mage.Sets/src/mage/cards/k/KairiTheSwirlingSky.java b/Mage.Sets/src/mage/cards/k/KairiTheSwirlingSky.java index 0469936cee5..580602ee6f6 100644 --- a/Mage.Sets/src/mage/cards/k/KairiTheSwirlingSky.java +++ b/Mage.Sets/src/mage/cards/k/KairiTheSwirlingSky.java @@ -45,7 +45,7 @@ public final class KairiTheSwirlingSky extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Ward {3} - this.addAbility(new WardAbility(new ManaCostsImpl<>("{3}"))); + this.addAbility(new WardAbility(new ManaCostsImpl<>("{3}"), false)); // When Kairi, the Swirling Sky dies, choose one — // • Return any number of target nonland permanents with total mana value 6 or less to their owners' hands. From 108259f43784c723fffd428afa7258c143b42a1c Mon Sep 17 00:00:00 2001 From: Alex Vasile <48962821+Alex-Vasile@users.noreply.github.com> Date: Thu, 12 May 2022 08:44:20 -0600 Subject: [PATCH 3/3] Fix failing tests --- Mage.Sets/src/mage/cards/k/KappaCannoneer.java | 3 ++- Mage.Sets/src/mage/cards/o/ObsessiveCollector.java | 3 ++- Mage.Sets/src/mage/cards/r/RaffineSchemingSeer.java | 3 ++- Mage.Sets/src/mage/cards/r/ReservoirKraken.java | 3 ++- Mage.Sets/src/mage/cards/t/TivitSellerOfSecrets.java | 3 ++- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Mage.Sets/src/mage/cards/k/KappaCannoneer.java b/Mage.Sets/src/mage/cards/k/KappaCannoneer.java index 7ea0c9a5658..5d1b001abec 100644 --- a/Mage.Sets/src/mage/cards/k/KappaCannoneer.java +++ b/Mage.Sets/src/mage/cards/k/KappaCannoneer.java @@ -3,6 +3,7 @@ package mage.cards.k; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; +import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.combat.CantBeBlockedSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; @@ -35,7 +36,7 @@ public final class KappaCannoneer extends CardImpl { this.addAbility(new ImproviseAbility()); // Ward {4} - this.addAbility(new WardAbility(new ManaCostsImpl<>("{4}"))); + this.addAbility(new WardAbility(new GenericManaCost(4), false)); // Whenever an artifact enters the battlefield under your control, put a +1/+1 counter on Kappa Cannoneer and it can't be blocked this turn. Ability ability = new EntersBattlefieldControlledTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/o/ObsessiveCollector.java b/Mage.Sets/src/mage/cards/o/ObsessiveCollector.java index 622f82af119..7a980ae38b0 100644 --- a/Mage.Sets/src/mage/cards/o/ObsessiveCollector.java +++ b/Mage.Sets/src/mage/cards/o/ObsessiveCollector.java @@ -3,6 +3,7 @@ package mage.cards.o; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.FlyingAbility; @@ -37,7 +38,7 @@ public final class ObsessiveCollector extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Ward {2} - this.addAbility(new WardAbility(new ManaCostsImpl<>("{2}"))); + this.addAbility(new WardAbility(new GenericManaCost(2), false)); // Whenever Obsessive Collector deals combat damage to a player, seek a card with mana value equal to the number of cards in your hand. this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new ObsessiveCollectorEffect(), false)); diff --git a/Mage.Sets/src/mage/cards/r/RaffineSchemingSeer.java b/Mage.Sets/src/mage/cards/r/RaffineSchemingSeer.java index 2133863a684..cb847fa65bc 100644 --- a/Mage.Sets/src/mage/cards/r/RaffineSchemingSeer.java +++ b/Mage.Sets/src/mage/cards/r/RaffineSchemingSeer.java @@ -3,6 +3,7 @@ package mage.cards.r; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.AttacksWithCreaturesTriggeredAbility; +import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.common.AttackingCreatureCount; import mage.abilities.effects.OneShotEffect; @@ -46,7 +47,7 @@ public final class RaffineSchemingSeer extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Ward {1} - this.addAbility(new WardAbility(new ManaCostsImpl<>("{1}"))); + this.addAbility(new WardAbility(new GenericManaCost(1), false)); // Whenever you attack, target creature connives X, where X is the number of attacking creatures. Ability ability = new AttacksWithCreaturesTriggeredAbility(new RaffineSchemingSeerEffect(), 1); diff --git a/Mage.Sets/src/mage/cards/r/ReservoirKraken.java b/Mage.Sets/src/mage/cards/r/ReservoirKraken.java index f5d64e50531..222d61e866a 100644 --- a/Mage.Sets/src/mage/cards/r/ReservoirKraken.java +++ b/Mage.Sets/src/mage/cards/r/ReservoirKraken.java @@ -5,6 +5,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.BeginningOfCombatTriggeredAbility; import mage.abilities.condition.common.SourceTappedCondition; +import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.constants.Outcome; @@ -41,7 +42,7 @@ public final class ReservoirKraken extends CardImpl { this.addAbility(TrampleAbility.getInstance()); // Ward {2} - this.addAbility(new WardAbility(new ManaCostsImpl<>("{2}"))); + this.addAbility(new WardAbility(new GenericManaCost(2), false)); // At the beginning of each combat, if Reservoir Kraken is untapped, any opponent may tap an untapped creature they control. If they do, tap Reservoir Kraken and create a 1/1 blue Fish creature token with "This creature can't be blocked." this.addAbility(new ConditionalInterveningIfTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/t/TivitSellerOfSecrets.java b/Mage.Sets/src/mage/cards/t/TivitSellerOfSecrets.java index f97962ab731..fdcf9f570ff 100644 --- a/Mage.Sets/src/mage/cards/t/TivitSellerOfSecrets.java +++ b/Mage.Sets/src/mage/cards/t/TivitSellerOfSecrets.java @@ -5,6 +5,7 @@ import mage.abilities.Ability; import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.ReplacementEffectImpl; @@ -41,7 +42,7 @@ public final class TivitSellerOfSecrets extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Ward {3} - this.addAbility(new WardAbility(new ManaCostsImpl<>("{3}"))); + this.addAbility(new WardAbility(new GenericManaCost(3), false)); // Council's dilemma — Whenever Tivit enters the battlefield or deals combat damage to a player, starting with you, each player votes for evidence or bribery. For each evidence vote, investigate. For each bribery vote, create a Treasure token. this.addAbility(new OrTriggeredAbility(