From 0db5c1696d8918d4f8d61b9353e8d637001ecb0a Mon Sep 17 00:00:00 2001 From: xenohedron Date: Thu, 12 Sep 2024 21:08:42 -0400 Subject: [PATCH] various fixes from checking text discrepancies --- .../mage/cards/a/AltanakTheThriceCalled.java | 5 ++- .../mage/cards/a/ArabellaAbandonedDoll.java | 4 +-- .../src/mage/cards/b/BalustradeWurm.java | 3 ++ Mage.Sets/src/mage/cards/b/Broodspinner.java | 3 +- .../mage/cards/c/CaduceusStaffOfHermes.java | 2 +- .../mage/cards/c/ClockworkPercussionist.java | 3 +- Mage.Sets/src/mage/cards/c/CynicalLoner.java | 2 +- .../src/mage/cards/d/DiversionSpecialist.java | 3 +- Mage.Sets/src/mage/cards/g/GetOut.java | 4 +-- .../src/mage/cards/i/ImpossibleInferno.java | 1 - .../src/mage/cards/i/InfernalPhantom.java | 3 +- .../mage/cards/r/RoshanHiddenMagister.java | 2 +- .../src/mage/cards/s/SawbladeSkinripper.java | 4 +-- Mage.Sets/src/mage/cards/s/SplitskinDoll.java | 2 +- .../src/mage/cards/t/TheSwarmweaver.java | 4 +-- .../mage/cards/t/TheyCameFromThePipes.java | 2 +- .../src/mage/cards/u/UntimelyMalfunction.java | 9 +++--- .../src/mage/cards/v/VengefulPossession.java | 2 +- .../ConditionalTriggeredAbility.java | 5 ++- .../mage/filter/common/FilterLandCard.java | 9 ------ .../token/InsectBlackGreenFlyingToken.java | 31 +++++++++++++++++++ 21 files changed, 68 insertions(+), 35 deletions(-) create mode 100644 Mage/src/main/java/mage/game/permanent/token/InsectBlackGreenFlyingToken.java diff --git a/Mage.Sets/src/mage/cards/a/AltanakTheThriceCalled.java b/Mage.Sets/src/mage/cards/a/AltanakTheThriceCalled.java index f409438d279..66c2ab87934 100644 --- a/Mage.Sets/src/mage/cards/a/AltanakTheThriceCalled.java +++ b/Mage.Sets/src/mage/cards/a/AltanakTheThriceCalled.java @@ -16,6 +16,7 @@ import mage.constants.SubType; import mage.constants.SuperType; import mage.constants.Zone; import mage.filter.StaticFilters; +import mage.filter.common.FilterLandCard; import mage.target.common.TargetCardInYourGraveyard; import java.util.UUID; @@ -25,6 +26,8 @@ import java.util.UUID; */ public final class AltanakTheThriceCalled extends CardImpl { + private static final FilterLandCard filter = new FilterLandCard("land card from your graveyard"); + public AltanakTheThriceCalled(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{G}{G}"); @@ -47,7 +50,7 @@ public final class AltanakTheThriceCalled extends CardImpl { Zone.HAND, new ReturnFromGraveyardToBattlefieldTargetEffect(true), new ManaCostsImpl<>("{1}{G}") ); ability.addCost(new DiscardSourceCost()); - ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_LAND)); + ability.addTarget(new TargetCardInYourGraveyard(filter)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/a/ArabellaAbandonedDoll.java b/Mage.Sets/src/mage/cards/a/ArabellaAbandonedDoll.java index 2c27141f7f5..3dd73aba730 100644 --- a/Mage.Sets/src/mage/cards/a/ArabellaAbandonedDoll.java +++ b/Mage.Sets/src/mage/cards/a/ArabellaAbandonedDoll.java @@ -28,9 +28,7 @@ public final class ArabellaAbandonedDoll extends CardImpl { filter.add(new PowerPredicate(ComparisonType.OR_LESS, 2)); } - private static final DynamicValue xValue = new PermanentsOnBattlefieldCount( - filter, null - ); + private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(filter, 1); private static final Hint hint = new ValueHint("Creatures you control with power 2 or less", xValue); public ArabellaAbandonedDoll(UUID ownerId, CardSetInfo setInfo) { diff --git a/Mage.Sets/src/mage/cards/b/BalustradeWurm.java b/Mage.Sets/src/mage/cards/b/BalustradeWurm.java index 61d168fa705..320e73ec35f 100644 --- a/Mage.Sets/src/mage/cards/b/BalustradeWurm.java +++ b/Mage.Sets/src/mage/cards/b/BalustradeWurm.java @@ -2,6 +2,7 @@ package mage.cards.b; import mage.MageInt; import mage.abilities.common.ActivateIfConditionActivatedAbility; +import mage.abilities.common.CantBeCounteredSourceAbility; import mage.abilities.condition.common.DeliriumCondition; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldWithCounterEffect; @@ -28,6 +29,8 @@ public final class BalustradeWurm extends CardImpl { this.toughness = new MageInt(5); // This spell can't be countered. + this.addAbility(new CantBeCounteredSourceAbility()); + // Trample this.addAbility(TrampleAbility.getInstance()); diff --git a/Mage.Sets/src/mage/cards/b/Broodspinner.java b/Mage.Sets/src/mage/cards/b/Broodspinner.java index 638644dbff2..16addb8ab7f 100644 --- a/Mage.Sets/src/mage/cards/b/Broodspinner.java +++ b/Mage.Sets/src/mage/cards/b/Broodspinner.java @@ -16,6 +16,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; +import mage.game.permanent.token.InsectBlackGreenFlyingToken; import mage.game.permanent.token.IzoniInsectToken; import java.util.UUID; @@ -40,7 +41,7 @@ public final class Broodspinner extends CardImpl { // {4}{B}{G}, {T}, Sacrifice Broodspinner: Create a number of 1/1 black and green Insect creature tokens with flying equal to the number of card types among cards in your graveyard. Ability ability = new SimpleActivatedAbility(new CreateTokenEffect( - new IzoniInsectToken(), CardTypesInGraveyardCount.YOU + new InsectBlackGreenFlyingToken(), CardTypesInGraveyardCount.YOU ), new ManaCostsImpl<>("{4}{B}{G}")); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); diff --git a/Mage.Sets/src/mage/cards/c/CaduceusStaffOfHermes.java b/Mage.Sets/src/mage/cards/c/CaduceusStaffOfHermes.java index c1ba0d65c32..414cd73e90d 100644 --- a/Mage.Sets/src/mage/cards/c/CaduceusStaffOfHermes.java +++ b/Mage.Sets/src/mage/cards/c/CaduceusStaffOfHermes.java @@ -48,7 +48,7 @@ public final class CaduceusStaffOfHermes extends CardImpl { new PreventDamageToSourceEffect(Duration.WhileOnBattlefield, Integer.MAX_VALUE) .setText("Prevent all damage that would be dealt to this creature") ), AttachmentType.EQUIPMENT), condition, - "and has \"Prevent all damage that would be dealt to this creature.\"" + "and \"Prevent all damage that would be dealt to this creature.\"" )); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/c/ClockworkPercussionist.java b/Mage.Sets/src/mage/cards/c/ClockworkPercussionist.java index 9138006153b..854bc36feff 100644 --- a/Mage.Sets/src/mage/cards/c/ClockworkPercussionist.java +++ b/Mage.Sets/src/mage/cards/c/ClockworkPercussionist.java @@ -29,7 +29,8 @@ public final class ClockworkPercussionist extends CardImpl { this.addAbility(HasteAbility.getInstance()); // When Clockwork Percussionist dies, exile the top card of your library. You may play it until the end of your next turn. - this.addAbility(new DiesSourceTriggeredAbility(new ExileTopXMayPlayUntilEffect(1, Duration.UntilEndOfYourNextTurn))); + this.addAbility(new DiesSourceTriggeredAbility(new ExileTopXMayPlayUntilEffect(1, Duration.UntilEndOfYourNextTurn) + .withTextOptions("it", true))); } private ClockworkPercussionist(final ClockworkPercussionist card) { diff --git a/Mage.Sets/src/mage/cards/c/CynicalLoner.java b/Mage.Sets/src/mage/cards/c/CynicalLoner.java index abff97e3ff3..de39d75ac90 100644 --- a/Mage.Sets/src/mage/cards/c/CynicalLoner.java +++ b/Mage.Sets/src/mage/cards/c/CynicalLoner.java @@ -33,7 +33,7 @@ public final class CynicalLoner extends CardImpl { this.addAbility(new SimpleStaticAbility(new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); // Survival -- At the beginning of your second main phase, if Cynical Loner is tapped, you may search your library for a card, put it into your graveyard, then shuffle. - this.addAbility(new SurvivalAbility(new SearchLibraryPutInGraveyardEffect(false))); + this.addAbility(new SurvivalAbility(new SearchLibraryPutInGraveyardEffect(false), true)); } private CynicalLoner(final CynicalLoner card) { diff --git a/Mage.Sets/src/mage/cards/d/DiversionSpecialist.java b/Mage.Sets/src/mage/cards/d/DiversionSpecialist.java index 0a40c60a35a..f2f64e9eaf3 100644 --- a/Mage.Sets/src/mage/cards/d/DiversionSpecialist.java +++ b/Mage.Sets/src/mage/cards/d/DiversionSpecialist.java @@ -33,7 +33,8 @@ public final class DiversionSpecialist extends CardImpl { this.addAbility(new MenaceAbility()); // {1}, Sacrifice another creature or enchantment: Exile the top card of your library. You may play it this turn. - Ability ability = new SimpleActivatedAbility(new ExileTopXMayPlayUntilEffect(1, Duration.EndOfTurn), new GenericManaCost(1)); + Ability ability = new SimpleActivatedAbility(new ExileTopXMayPlayUntilEffect(1, Duration.EndOfTurn) + .withTextOptions("it", true), new GenericManaCost(1)); ability.addCost(new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_ANOTHER_CREATURE_OR_ENCHANTMENT)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/g/GetOut.java b/Mage.Sets/src/mage/cards/g/GetOut.java index 1a33fed5315..23d1cd8a5ae 100644 --- a/Mage.Sets/src/mage/cards/g/GetOut.java +++ b/Mage.Sets/src/mage/cards/g/GetOut.java @@ -23,7 +23,7 @@ import java.util.UUID; public final class GetOut extends CardImpl { private static final FilterSpell filter = new FilterSpell("creature or enchantment spell"); - private static final FilterPermanent filter2 = new FilterPermanent("creatures and/or enchantments you own to your hand"); + private static final FilterPermanent filter2 = new FilterPermanent("creatures and/or enchantments you own"); private static final Predicate predicate = Predicates.or( CardType.CREATURE.getPredicate(), CardType.ENCHANTMENT.getPredicate() @@ -44,7 +44,7 @@ public final class GetOut extends CardImpl { this.getSpellAbility().addTarget(new TargetSpell(filter)); // * Return one or two target creatures and/or enchantments you own to your hand. - this.getSpellAbility().addMode(new Mode(new ReturnToHandTargetEffect()) + this.getSpellAbility().addMode(new Mode(new ReturnToHandTargetEffect().setText("return one or two target creatures and/or enchantments you own to your hand")) .addTarget(new TargetPermanent(1, 2, filter2))); } diff --git a/Mage.Sets/src/mage/cards/i/ImpossibleInferno.java b/Mage.Sets/src/mage/cards/i/ImpossibleInferno.java index e4bc140c07a..a3a1f0073d4 100644 --- a/Mage.Sets/src/mage/cards/i/ImpossibleInferno.java +++ b/Mage.Sets/src/mage/cards/i/ImpossibleInferno.java @@ -33,7 +33,6 @@ public final class ImpossibleInferno extends CardImpl { "four or more card types among cards in your graveyard, exile the top card of your library. " + "You may play it until the end of your next turn" )); - this.getSpellAbility().setAbilityWord(AbilityWord.DELIRIUM); this.getSpellAbility().addHint(CardTypesInGraveyardHint.YOU); } diff --git a/Mage.Sets/src/mage/cards/i/InfernalPhantom.java b/Mage.Sets/src/mage/cards/i/InfernalPhantom.java index 252d006332c..0f4328055c0 100644 --- a/Mage.Sets/src/mage/cards/i/InfernalPhantom.java +++ b/Mage.Sets/src/mage/cards/i/InfernalPhantom.java @@ -35,7 +35,8 @@ public final class InfernalPhantom extends CardImpl { this.addAbility(new EerieAbility(new BoostSourceEffect(2, 0, Duration.EndOfTurn))); // When Infernal Phantom dies, it deals damage equal to its power to any target. - Ability ability = new DiesSourceTriggeredAbility(new DamageTargetEffect(xValue, "it")); + Ability ability = new DiesSourceTriggeredAbility(new DamageTargetEffect(xValue, "it") + .setText("it deals damage equal to its power to any target")); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/r/RoshanHiddenMagister.java b/Mage.Sets/src/mage/cards/r/RoshanHiddenMagister.java index 888cf3e33d2..cd75a3282b6 100644 --- a/Mage.Sets/src/mage/cards/r/RoshanHiddenMagister.java +++ b/Mage.Sets/src/mage/cards/r/RoshanHiddenMagister.java @@ -44,7 +44,7 @@ public final class RoshanHiddenMagister extends CardImpl { // Other creatures you control are Assassins in addition to their other types. The same is true for creature spells you control and creature cards you own that aren't on the battlefield. this.addAbility(new SimpleStaticAbility(new AddCreatureSubTypeAllMultiZoneEffect( - StaticFilters.FILTER_CONTROLLED_CREATURES, + StaticFilters.FILTER_OTHER_CONTROLLED_CREATURES, filterSpells, filterCards, SubType.ASSASSIN diff --git a/Mage.Sets/src/mage/cards/s/SawbladeSkinripper.java b/Mage.Sets/src/mage/cards/s/SawbladeSkinripper.java index 442ff4cb294..eded8a073a5 100644 --- a/Mage.Sets/src/mage/cards/s/SawbladeSkinripper.java +++ b/Mage.Sets/src/mage/cards/s/SawbladeSkinripper.java @@ -103,12 +103,12 @@ enum SawbladeSkinripperValue implements DynamicValue { } @Override - public String getMessage() { + public String toString() { return "that much"; } @Override - public String toString() { + public String getMessage() { return ""; } } diff --git a/Mage.Sets/src/mage/cards/s/SplitskinDoll.java b/Mage.Sets/src/mage/cards/s/SplitskinDoll.java index 70ef402ebbe..c953c6c9c94 100644 --- a/Mage.Sets/src/mage/cards/s/SplitskinDoll.java +++ b/Mage.Sets/src/mage/cards/s/SplitskinDoll.java @@ -51,7 +51,7 @@ public final class SplitskinDoll extends CardImpl { // When Splitskin Doll enters, draw a card. Then discard a card unless you control another creature with power 2 or less. Ability ability = new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1)); ability.addEffect(new ConditionalOneShotEffect( - new DiscardControllerEffect(1), condition, "then discard " + + new DiscardControllerEffect(1), condition, "Then discard " + "a card unless you control another creature with power 2 or less" )); this.addAbility(ability.addHint(hint)); diff --git a/Mage.Sets/src/mage/cards/t/TheSwarmweaver.java b/Mage.Sets/src/mage/cards/t/TheSwarmweaver.java index 1d98df44b96..eb12ffe1b25 100644 --- a/Mage.Sets/src/mage/cards/t/TheSwarmweaver.java +++ b/Mage.Sets/src/mage/cards/t/TheSwarmweaver.java @@ -19,7 +19,7 @@ import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicate; import mage.filter.predicate.Predicates; import mage.game.permanent.Permanent; -import mage.game.permanent.token.IzoniInsectToken; +import mage.game.permanent.token.InsectBlackGreenFlyingToken; import java.util.UUID; @@ -49,7 +49,7 @@ public final class TheSwarmweaver extends CardImpl { this.toughness = new MageInt(3); // When The Swarmweaver enters, create two 1/1 black and green Insect creature tokens with flying. - this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new IzoniInsectToken()))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new InsectBlackGreenFlyingToken(), 2))); // Delirium -- As long as there are four or more card types among cards in your graveyard, Insects and Spiders you control get +1/+1 and have deathtouch. Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect( diff --git a/Mage.Sets/src/mage/cards/t/TheyCameFromThePipes.java b/Mage.Sets/src/mage/cards/t/TheyCameFromThePipes.java index 15df0cc0eb3..2d8b55b5a8c 100644 --- a/Mage.Sets/src/mage/cards/t/TheyCameFromThePipes.java +++ b/Mage.Sets/src/mage/cards/t/TheyCameFromThePipes.java @@ -31,7 +31,7 @@ public final class TheyCameFromThePipes extends CardImpl { // When They Came from the Pipes enters, manifest dread twice. Ability ability = new EntersBattlefieldTriggeredAbility(new ManifestDreadEffect()); - ability.addEffect(new ManifestDreadEffect().setText("twice")); + ability.addEffect(new ManifestDreadEffect().setText(" twice")); this.addAbility(ability); // Whenever a face-down creature you control enters, draw a card. diff --git a/Mage.Sets/src/mage/cards/u/UntimelyMalfunction.java b/Mage.Sets/src/mage/cards/u/UntimelyMalfunction.java index 67349e6ff21..d467e2dc3f1 100644 --- a/Mage.Sets/src/mage/cards/u/UntimelyMalfunction.java +++ b/Mage.Sets/src/mage/cards/u/UntimelyMalfunction.java @@ -8,9 +8,9 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.FilterSpell; +import mage.filter.FilterStackObject; import mage.filter.predicate.other.NumberOfTargetsPredicate; -import mage.target.TargetSpell; +import mage.target.TargetStackObject; import mage.target.common.TargetArtifactPermanent; import mage.target.common.TargetCreaturePermanent; @@ -21,7 +21,7 @@ import java.util.UUID; */ public final class UntimelyMalfunction extends CardImpl { - private static final FilterSpell filter = new FilterSpell("spell with a single target"); + private static final FilterStackObject filter = new FilterStackObject("spell or ability with a single target"); static { filter.add(new NumberOfTargetsPredicate(1)); @@ -36,7 +36,8 @@ public final class UntimelyMalfunction extends CardImpl { this.getSpellAbility().addTarget(new TargetArtifactPermanent()); // * Change the target of target spell or ability with a single target. - this.getSpellAbility().addMode(new Mode(new ChooseNewTargetsTargetEffect(true, true)).addTarget(new TargetSpell(filter))); + this.getSpellAbility().addMode(new Mode(new ChooseNewTargetsTargetEffect(true, true)) + .addTarget(new TargetStackObject(filter))); // * One or two target creatures can't block this turn. this.getSpellAbility().addMode(new Mode(new CantBlockTargetEffect(Duration.EndOfTurn)).addTarget(new TargetCreaturePermanent(1, 2))); diff --git a/Mage.Sets/src/mage/cards/v/VengefulPossession.java b/Mage.Sets/src/mage/cards/v/VengefulPossession.java index 762b91aad20..bca41c0428f 100644 --- a/Mage.Sets/src/mage/cards/v/VengefulPossession.java +++ b/Mage.Sets/src/mage/cards/v/VengefulPossession.java @@ -25,7 +25,7 @@ public final class VengefulPossession extends CardImpl { // Gain control of target creature until end of turn. Untap it. It gains haste until end of turn. You may discard a card. If you do, draw a card. this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.EndOfTurn)); - this.getSpellAbility().addEffect(new UntapTargetEffect().setText("Untap that creature")); + this.getSpellAbility().addEffect(new UntapTargetEffect().setText("Untap it")); this.getSpellAbility().addEffect(new GainAbilityTargetEffect( HasteAbility.getInstance(), Duration.EndOfTurn ).setText("It gains haste until end of turn.")); diff --git a/Mage/src/main/java/mage/abilities/decorator/ConditionalTriggeredAbility.java b/Mage/src/main/java/mage/abilities/decorator/ConditionalTriggeredAbility.java index 455af0a5f2a..cb12f7b2b66 100644 --- a/Mage/src/main/java/mage/abilities/decorator/ConditionalTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/decorator/ConditionalTriggeredAbility.java @@ -10,6 +10,7 @@ import mage.abilities.effects.Effects; import mage.constants.EffectType; import mage.game.Game; import mage.game.events.GameEvent; +import mage.util.CardUtil; import mage.watchers.Watcher; import java.util.List; @@ -71,7 +72,9 @@ public class ConditionalTriggeredAbility extends TriggeredAbilityImpl { if (abilityText == null || abilityText.isEmpty()) { return ability.getRule(); } - return abilityText; + return (flavorWord != null ? CardUtil.italicizeWithEmDash(flavorWord) : "") + + (abilityWord != null ? abilityWord.formatWord() : "") + + abilityText + (abilityText.endsWith(".") || abilityText.endsWith("\"") || abilityText.endsWith(">") ? "" : "."); } @Override diff --git a/Mage/src/main/java/mage/filter/common/FilterLandCard.java b/Mage/src/main/java/mage/filter/common/FilterLandCard.java index 12104450149..2fe2b9b82ac 100644 --- a/Mage/src/main/java/mage/filter/common/FilterLandCard.java +++ b/Mage/src/main/java/mage/filter/common/FilterLandCard.java @@ -1,9 +1,6 @@ - - package mage.filter.common; import mage.constants.CardType; -import mage.constants.SuperType; import mage.filter.FilterCard; /** @@ -20,12 +17,6 @@ public class FilterLandCard extends FilterCard { this.add(CardType.LAND.getPredicate()); } - public static FilterLandCard basicLandCard() { - FilterLandCard filter = new FilterLandCard("basic land card"); - filter.add(SuperType.BASIC.getPredicate()); - return filter; - } - protected FilterLandCard(final FilterLandCard filter) { super(filter); } diff --git a/Mage/src/main/java/mage/game/permanent/token/InsectBlackGreenFlyingToken.java b/Mage/src/main/java/mage/game/permanent/token/InsectBlackGreenFlyingToken.java new file mode 100644 index 00000000000..94c906461da --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/InsectBlackGreenFlyingToken.java @@ -0,0 +1,31 @@ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.abilities.keyword.FlyingAbility; +import mage.constants.CardType; +import mage.constants.SubType; + +/** + * @author TheElk801 + */ +public final class InsectBlackGreenFlyingToken extends TokenImpl { + + public InsectBlackGreenFlyingToken() { + super("Insect Token", "1/1 black and green Insect creature token with flying"); + cardType.add(CardType.CREATURE); + color.setBlack(true); + color.setGreen(true); + subtype.add(SubType.INSECT); + power = new MageInt(1); + toughness = new MageInt(1); + this.addAbility(FlyingAbility.getInstance()); + } + + private InsectBlackGreenFlyingToken(final InsectBlackGreenFlyingToken token) { + super(token); + } + + public InsectBlackGreenFlyingToken copy() { + return new InsectBlackGreenFlyingToken(this); + } +}