From d9ca387fadc3909dff1e63eae8fa69ab58ddc17d Mon Sep 17 00:00:00 2001 From: xenohedron Date: Sun, 1 Oct 2023 22:51:02 -0400 Subject: [PATCH] another batch of text gen improvements (#11247) * describe targets: UntapTargetEffect * describe targets: SetBasePowerToughnessTargetEffect * cleanup text * describe targets: RegenerateTargetEffect * describe targets: PhaseOutTargetEffect * adjust text * remove superfluous param * describe targets: TapAllTargetPlayerControlsEffect * describe targets: TurnFaceUpTargetEffect * describe targets: TransformTargetEffect * describe targets: RemoveFromCombatTargetEffect * describe targets: DetainTargetEffect * cleanup DiscardHandTargetEffect * describe targets: DrawCardTargetEffect * describe targets: GainLifeTargetEffect * describe targets: LoseLifeTargetEffect * describe targets: ExchangeLifeTargetEffect * describe targets: DamageTargetControllerEffect --- .../src/mage/cards/b/BrinkOfMadness.java | 33 ++------------ .../src/mage/cards/c/CleverConcealment.java | 13 ++++-- .../src/mage/cards/c/CurseOfObsession.java | 2 +- .../src/mage/cards/g/GuardianOfFaith.java | 10 ++--- Mage.Sets/src/mage/cards/h/HuntersFeast.java | 2 +- .../mage/cards/k/KingOfTheOathbreakers.java | 2 +- Mage.Sets/src/mage/cards/n/NicolBolas.java | 2 +- .../src/mage/cards/n/NissaWorldwaker.java | 3 +- .../src/mage/cards/s/SlipOutTheBack.java | 2 +- .../mage/cards/t/TeferiTemporalArchmage.java | 4 +- Mage.Sets/src/mage/cards/t/TeferisVeil.java | 3 +- .../src/mage/cards/t/TheBearsOfLittjara.java | 2 +- .../src/mage/cards/t/ThePhasingOfZhalfir.java | 5 +-- Mage.Sets/src/mage/cards/w/WitsEnd.java | 35 +-------------- .../common/DamageTargetControllerEffect.java | 10 ++--- .../effects/common/DetainTargetEffect.java | 44 +++++-------------- .../effects/common/DrawCardTargetEffect.java | 15 +------ .../ExchangeLifeControllerTargetEffect.java | 3 +- .../effects/common/GainLifeTargetEffect.java | 17 +++---- .../effects/common/LoseLifeTargetEffect.java | 14 ++---- .../effects/common/PhaseOutTargetEffect.java | 23 +--------- .../common/RegenerateTargetEffect.java | 16 +------ .../common/RemoveFromCombatTargetEffect.java | 3 +- .../TapAllTargetPlayerControlsEffect.java | 7 ++- .../effects/common/TransformTargetEffect.java | 24 +--------- .../common/TurnFaceUpTargetEffect.java | 5 ++- .../effects/common/UntapTargetEffect.java | 29 +----------- .../SetBasePowerToughnessTargetEffect.java | 33 +++----------- .../discard/DiscardHandTargetEffect.java | 36 ++++----------- .../common/TargetArtifactPermanent.java | 17 +++---- 30 files changed, 95 insertions(+), 319 deletions(-) diff --git a/Mage.Sets/src/mage/cards/b/BrinkOfMadness.java b/Mage.Sets/src/mage/cards/b/BrinkOfMadness.java index 7e383d8b838..520ec55815d 100644 --- a/Mage.Sets/src/mage/cards/b/BrinkOfMadness.java +++ b/Mage.Sets/src/mage/cards/b/BrinkOfMadness.java @@ -1,17 +1,14 @@ package mage.cards.b; -import mage.abilities.Ability; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.condition.common.CardsInHandCondition; import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.effects.common.discard.DiscardHandTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.game.Game; -import mage.players.Player; import mage.target.common.TargetOpponent; import java.util.UUID; @@ -26,10 +23,10 @@ public final class BrinkOfMadness extends CardImpl { // At the beginning of your upkeep, if you have no cards in hand, sacrifice Brink of Madness and target opponent discards their hand. TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new SacrificeSourceEffect(), TargetController.YOU, false); - ability.addEffect(new BrinkOfMadnessEffect()); + ability.addEffect(new DiscardHandTargetEffect()); ability.addTarget(new TargetOpponent()); - CardsInHandCondition contition = new CardsInHandCondition(ComparisonType.EQUAL_TO, 0); - this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, contition, "At the beginning of your upkeep, if you have no cards in hand, sacrifice {this} and target opponent discards their hand.")); + CardsInHandCondition condition = new CardsInHandCondition(ComparisonType.EQUAL_TO, 0); + this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, condition, "At the beginning of your upkeep, if you have no cards in hand, sacrifice {this} and target opponent discards their hand.")); } @@ -42,26 +39,4 @@ public final class BrinkOfMadness extends CardImpl { return new BrinkOfMadness(this); } - static class BrinkOfMadnessEffect extends OneShotEffect { - - private BrinkOfMadnessEffect() { - super(Outcome.Benefit); - this.staticText = "Target player discards their hand"; - } - - private BrinkOfMadnessEffect(final BrinkOfMadnessEffect effect) { - super(effect); - } - - @Override - public BrinkOfMadnessEffect copy() { - return new BrinkOfMadnessEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getFirstTarget()); - return player != null && !player.discard(player.getHand(), false, source, game).isEmpty(); - } - } } diff --git a/Mage.Sets/src/mage/cards/c/CleverConcealment.java b/Mage.Sets/src/mage/cards/c/CleverConcealment.java index fd613fb08e9..564ddd69245 100644 --- a/Mage.Sets/src/mage/cards/c/CleverConcealment.java +++ b/Mage.Sets/src/mage/cards/c/CleverConcealment.java @@ -5,7 +5,9 @@ import mage.abilities.keyword.ConvokeAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.StaticFilters; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.Predicates; import mage.target.TargetPermanent; import java.util.UUID; @@ -15,6 +17,11 @@ import java.util.UUID; */ public final class CleverConcealment extends CardImpl { + private static final FilterPermanent filter = new FilterControlledPermanent("nonland permanents you control"); + static { + filter.add(Predicates.not(CardType.LAND.getPredicate())); + } + public CleverConcealment(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{W}{W}"); @@ -22,8 +29,8 @@ public final class CleverConcealment extends CardImpl { this.addAbility(new ConvokeAbility()); // Any number of target nonland permanents you control phase out. - this.getSpellAbility().addEffect(new PhaseOutTargetEffect("any number of target nonland permanents you control")); - this.getSpellAbility().addTarget(new TargetPermanent(0, Integer.MAX_VALUE, StaticFilters.FILTER_CONTROLLED_PERMANENT_NON_LAND)); + this.getSpellAbility().addEffect(new PhaseOutTargetEffect()); + this.getSpellAbility().addTarget(new TargetPermanent(0, Integer.MAX_VALUE, filter)); } private CleverConcealment(final CleverConcealment card) { diff --git a/Mage.Sets/src/mage/cards/c/CurseOfObsession.java b/Mage.Sets/src/mage/cards/c/CurseOfObsession.java index acc326c384b..426e3405e6e 100644 --- a/Mage.Sets/src/mage/cards/c/CurseOfObsession.java +++ b/Mage.Sets/src/mage/cards/c/CurseOfObsession.java @@ -44,7 +44,7 @@ public final class CurseOfObsession extends CardImpl { // At the beginning of enchanted player's end step, that player discards their hand. this.addAbility(new BeginningOfEndStepTriggeredAbility( - new DiscardHandTargetEffect("that player"), + new DiscardHandTargetEffect(), TargetController.ENCHANTED, false )); } diff --git a/Mage.Sets/src/mage/cards/g/GuardianOfFaith.java b/Mage.Sets/src/mage/cards/g/GuardianOfFaith.java index d161282b49f..d3e8b8aea17 100644 --- a/Mage.Sets/src/mage/cards/g/GuardianOfFaith.java +++ b/Mage.Sets/src/mage/cards/g/GuardianOfFaith.java @@ -11,7 +11,7 @@ import mage.abilities.keyword.VigilanceAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledCreaturePermanent; import mage.target.common.TargetControlledCreaturePermanent; /** @@ -20,6 +20,8 @@ import mage.target.common.TargetControlledCreaturePermanent; */ public final class GuardianOfFaith extends CardImpl { + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("other target creatures you control"); + public GuardianOfFaith(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{W}"); @@ -35,10 +37,8 @@ public final class GuardianOfFaith extends CardImpl { this.addAbility(VigilanceAbility.getInstance()); // When Guardian of Faith enters the battlefield, any number of other target creatures you control phase out. - Ability ability = new EntersBattlefieldTriggeredAbility(new PhaseOutTargetEffect( - "any number of other target creatures you control" - )); - ability.addTarget(new TargetControlledCreaturePermanent(0, Integer.MAX_VALUE, StaticFilters.FILTER_OTHER_CONTROLLED_CREATURES, false)); + Ability ability = new EntersBattlefieldTriggeredAbility(new PhaseOutTargetEffect()); + ability.addTarget(new TargetControlledCreaturePermanent(0, Integer.MAX_VALUE, filter, false)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/h/HuntersFeast.java b/Mage.Sets/src/mage/cards/h/HuntersFeast.java index 0b84041c434..76aac0c0b87 100644 --- a/Mage.Sets/src/mage/cards/h/HuntersFeast.java +++ b/Mage.Sets/src/mage/cards/h/HuntersFeast.java @@ -18,7 +18,7 @@ public final class HuntersFeast extends CardImpl { // Any number of target players each gain 6 life. this.getSpellAbility().addTarget(new TargetPlayer(0, Integer.MAX_VALUE, false)); - this.getSpellAbility().addEffect(new GainLifeTargetEffect(6)); + this.getSpellAbility().addEffect(new GainLifeTargetEffect(6).setText("any number of target players each gain 6 life")); } private HuntersFeast(final HuntersFeast card) { diff --git a/Mage.Sets/src/mage/cards/k/KingOfTheOathbreakers.java b/Mage.Sets/src/mage/cards/k/KingOfTheOathbreakers.java index c9187f04f7f..2d675298ab6 100644 --- a/Mage.Sets/src/mage/cards/k/KingOfTheOathbreakers.java +++ b/Mage.Sets/src/mage/cards/k/KingOfTheOathbreakers.java @@ -44,7 +44,7 @@ public final class KingOfTheOathbreakers extends CardImpl { // Whenever King of the Oathbreakers or another Spirit you control becomes the target of a spell, it phases out. this.addAbility(new BecomesTargetAnyTriggeredAbility( - new PhaseOutTargetEffect("it"), + new PhaseOutTargetEffect(), filter, StaticFilters.FILTER_SPELL_A )); diff --git a/Mage.Sets/src/mage/cards/n/NicolBolas.java b/Mage.Sets/src/mage/cards/n/NicolBolas.java index 67a453a7b54..d513572bf5d 100644 --- a/Mage.Sets/src/mage/cards/n/NicolBolas.java +++ b/Mage.Sets/src/mage/cards/n/NicolBolas.java @@ -37,7 +37,7 @@ public final class NicolBolas extends CardImpl { this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ManaCostsImpl<>("{U}{B}{R}")), TargetController.YOU, false)); // Whenever Nicol Bolas deals damage to an opponent, that player discards their hand. - this.addAbility(new DealsDamageToOpponentTriggeredAbility(new DiscardHandTargetEffect("that player"), false, false, true)); + this.addAbility(new DealsDamageToOpponentTriggeredAbility(new DiscardHandTargetEffect(), false, false, true)); } private NicolBolas(final NicolBolas card) { diff --git a/Mage.Sets/src/mage/cards/n/NissaWorldwaker.java b/Mage.Sets/src/mage/cards/n/NissaWorldwaker.java index 0b134a88598..435058a0dd6 100644 --- a/Mage.Sets/src/mage/cards/n/NissaWorldwaker.java +++ b/Mage.Sets/src/mage/cards/n/NissaWorldwaker.java @@ -1,4 +1,3 @@ - package mage.cards.n; import mage.MageInt; @@ -32,7 +31,7 @@ import java.util.UUID; */ public final class NissaWorldwaker extends CardImpl { - private static final FilterPermanent filterForest = new FilterPermanent(SubType.FOREST, "Forest"); + private static final FilterPermanent filterForest = new FilterPermanent(SubType.FOREST, "Forests"); public NissaWorldwaker(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{3}{G}{G}"); diff --git a/Mage.Sets/src/mage/cards/s/SlipOutTheBack.java b/Mage.Sets/src/mage/cards/s/SlipOutTheBack.java index 15add8b4e47..4a32d4d4485 100644 --- a/Mage.Sets/src/mage/cards/s/SlipOutTheBack.java +++ b/Mage.Sets/src/mage/cards/s/SlipOutTheBack.java @@ -20,7 +20,7 @@ public final class SlipOutTheBack extends CardImpl { // Put a +1/+1 counter on target creature. It phases out. this.getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.P1P1.createInstance())); - this.getSpellAbility().addEffect(new PhaseOutTargetEffect("it")); + this.getSpellAbility().addEffect(new PhaseOutTargetEffect().setText("It phases out")); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } diff --git a/Mage.Sets/src/mage/cards/t/TeferiTemporalArchmage.java b/Mage.Sets/src/mage/cards/t/TeferiTemporalArchmage.java index e06b246b580..5b5f31a9424 100644 --- a/Mage.Sets/src/mage/cards/t/TeferiTemporalArchmage.java +++ b/Mage.Sets/src/mage/cards/t/TeferiTemporalArchmage.java @@ -12,7 +12,7 @@ import mage.constants.CardType; import mage.constants.PutCards; import mage.constants.SubType; import mage.constants.SuperType; -import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; import mage.game.command.emblems.TeferiTemporalArchmageEmblem; import mage.target.TargetPermanent; @@ -34,7 +34,7 @@ public final class TeferiTemporalArchmage extends CardImpl { // -1: Untap up to four target permanents. LoyaltyAbility loyaltyAbility = new LoyaltyAbility(new UntapTargetEffect(), -1); - loyaltyAbility.addTarget(new TargetPermanent(0, 4, new FilterPermanent(), false)); + loyaltyAbility.addTarget(new TargetPermanent(0, 4, StaticFilters.FILTER_PERMANENTS, false)); this.addAbility(loyaltyAbility); // -10: You get an emblem with "You may activate loyalty abilities of planeswalkers you control on any player's turn any time you could cast an instant." diff --git a/Mage.Sets/src/mage/cards/t/TeferisVeil.java b/Mage.Sets/src/mage/cards/t/TeferisVeil.java index 48c1c7df24c..a51798e948a 100644 --- a/Mage.Sets/src/mage/cards/t/TeferisVeil.java +++ b/Mage.Sets/src/mage/cards/t/TeferisVeil.java @@ -1,4 +1,3 @@ - package mage.cards.t; import java.util.UUID; @@ -21,7 +20,7 @@ public final class TeferisVeil extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); // Whenever a creature you control attacks, it phases out at end of combat. - Effect effect = new CreateDelayedTriggeredAbilityEffect(new AtTheEndOfCombatDelayedTriggeredAbility(new PhaseOutTargetEffect("it"))); + Effect effect = new CreateDelayedTriggeredAbilityEffect(new AtTheEndOfCombatDelayedTriggeredAbility(new PhaseOutTargetEffect())); effect.setText("it phases out at end of combat"); this.addAbility(new AttacksCreatureYouControlTriggeredAbility(effect, false, true)); } diff --git a/Mage.Sets/src/mage/cards/t/TheBearsOfLittjara.java b/Mage.Sets/src/mage/cards/t/TheBearsOfLittjara.java index fd94bc7310e..60d94ae6d33 100644 --- a/Mage.Sets/src/mage/cards/t/TheBearsOfLittjara.java +++ b/Mage.Sets/src/mage/cards/t/TheBearsOfLittjara.java @@ -25,7 +25,7 @@ import java.util.UUID; public final class TheBearsOfLittjara extends CardImpl { private static final FilterPermanent filter = new FilterControlledCreaturePermanent( - SubType.SHAPESHIFTER, "any number of target Shapeshifter creatures you control" + SubType.SHAPESHIFTER, "Shapeshifter creatures you control" ); public TheBearsOfLittjara(UUID ownerId, CardSetInfo setInfo) { diff --git a/Mage.Sets/src/mage/cards/t/ThePhasingOfZhalfir.java b/Mage.Sets/src/mage/cards/t/ThePhasingOfZhalfir.java index 45c81111255..cca8331a1a3 100644 --- a/Mage.Sets/src/mage/cards/t/ThePhasingOfZhalfir.java +++ b/Mage.Sets/src/mage/cards/t/ThePhasingOfZhalfir.java @@ -9,7 +9,6 @@ import mage.abilities.effects.common.PhaseOutTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.filter.FilterPermanent; import mage.filter.StaticFilters; import mage.filter.common.FilterNonlandPermanent; import mage.filter.predicate.mageobject.AnotherPredicate; @@ -30,7 +29,7 @@ import java.util.UUID; */ public final class ThePhasingOfZhalfir extends CardImpl { - private static final FilterPermanent filter = new FilterNonlandPermanent("another nonland permanent"); + private static final FilterNonlandPermanent filter = new FilterNonlandPermanent("another target nonland permanent"); static { filter.add(AnotherPredicate.instance); @@ -48,7 +47,7 @@ public final class ThePhasingOfZhalfir extends CardImpl { sagaAbility.addChapterEffect( this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II, new Effects( - new PhaseOutTargetEffect("another target nonland permanent"), + new PhaseOutTargetEffect(), new ThePhasingOfZhalfirPhaseEffect() ), new TargetPermanent(filter) ); diff --git a/Mage.Sets/src/mage/cards/w/WitsEnd.java b/Mage.Sets/src/mage/cards/w/WitsEnd.java index 898893d71c8..f7dfd907644 100644 --- a/Mage.Sets/src/mage/cards/w/WitsEnd.java +++ b/Mage.Sets/src/mage/cards/w/WitsEnd.java @@ -1,13 +1,9 @@ package mage.cards.w; -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.discard.DiscardHandTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; -import mage.game.Game; -import mage.players.Player; import mage.target.TargetPlayer; import java.util.UUID; @@ -21,7 +17,7 @@ public final class WitsEnd extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{5}{B}{B}"); // Target player discards their hand. - this.getSpellAbility().addEffect(new WitsEndEffect()); + this.getSpellAbility().addEffect(new DiscardHandTargetEffect()); this.getSpellAbility().addTarget(new TargetPlayer()); } @@ -34,30 +30,3 @@ public final class WitsEnd extends CardImpl { return new WitsEnd(this); } } - -class WitsEndEffect extends OneShotEffect { - - WitsEndEffect() { - super(Outcome.Benefit); - this.staticText = "Target player discards their hand"; - } - - private WitsEndEffect(final WitsEndEffect effect) { - super(effect); - } - - @Override - public WitsEndEffect copy() { - return new WitsEndEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getFirstTarget()); - if (player == null) { - return false; - } - player.discard(player.getHand(), false, source, game); - return true; - } -} diff --git a/Mage/src/main/java/mage/abilities/effects/common/DamageTargetControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DamageTargetControllerEffect.java index 51f2789b2ca..8fff32ca007 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DamageTargetControllerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DamageTargetControllerEffect.java @@ -65,11 +65,9 @@ public class DamageTargetControllerEffect extends OneShotEffect { if (staticText != null && !staticText.isEmpty()) { return staticText; } - String text = "{this} deals " + amount.getMessage() + " damage to target " - + mode.getTargets().get(0).getTargetName() + "'s controller"; - if (!preventable) { - text += ". The damage can't be prevented"; - } - return text; + return "{this} deals " + amount.getMessage() + " damage to " + + getTargetPointer().describeTargets(mode.getTargets(), "that creature") + + "'s controller" + + (preventable ? "" : ". The damage can't be prevented"); } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/DetainTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DetainTargetEffect.java index ce387af2e37..ee63ca1eaf1 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DetainTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DetainTargetEffect.java @@ -10,8 +10,6 @@ import mage.constants.PhaseStep; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.turn.Step; -import mage.target.Target; -import mage.target.common.TargetCreaturePermanent; import mage.util.CardUtil; import java.util.UUID; @@ -32,11 +30,6 @@ public class DetainTargetEffect extends OneShotEffect { super(Outcome.LoseAbility); } - public DetainTargetEffect(String ruleText) { - super(Outcome.LoseAbility); - staticText = ruleText; - } - protected DetainTargetEffect(final DetainTargetEffect effect) { super(effect); } @@ -56,8 +49,7 @@ public class DetainTargetEffect extends OneShotEffect { } } } - DetainRestrictionEffect effect = new DetainRestrictionEffect(); - game.addEffect(effect, source); + game.addEffect(new DetainRestrictionEffect(), source); return true; } @@ -66,40 +58,24 @@ public class DetainTargetEffect extends OneShotEffect { if (staticText != null && !staticText.isEmpty()) { return staticText; } - StringBuilder sb = new StringBuilder(); - Target target = mode.getTargets().get(0); - - if (target.getMaxNumberOfTargets() == target.getNumberOfTargets()) { - if (target.getMaxNumberOfTargets() == 1) { - sb.append("detain target ").append(target.getTargetName()); - } else { - sb.append("detain ").append(target.getMaxNumberOfTargets()).append(" target ").append(target.getTargetName()); - } - } else { - sb.append("detain up to ").append(CardUtil.numberToText(target.getMaxNumberOfTargets())).append(" target ").append(target.getTargetName()); - } - sb.append(". (Until your next turn, "); - boolean plural = target.getMaxNumberOfTargets() > 1; - sb.append(plural ? "those " : "that "); - sb.append(target.getTargetName().contains("creature") ? "creature" : "permanent"); - if (plural) { - sb.append('s'); - } - sb.append(" can't attack or block and "); - sb.append(plural ? "their" : "its"); - sb.append(" activated abilities can't be activated.)"); - return sb.toString(); + String description = getTargetPointer().describeTargets(mode.getTargets(), "that creature"); + boolean plural = getTargetPointer().isPlural(mode.getTargets()); + String reminder = ". (Until your next turn, " + (plural ? "those " : "that ") + + (description.contains("creature") ? "creature" : "permanent") + (plural ? "s" : "") + + " can't attack or block and " + (plural ? "their" : "its") + + " activated abilities can't be activated.)"; + return "detain " + description + reminder; } } class DetainRestrictionEffect extends RestrictionEffect { - public DetainRestrictionEffect() { + DetainRestrictionEffect() { super(Duration.Custom); staticText = ""; } - protected DetainRestrictionEffect(final DetainRestrictionEffect effect) { + private DetainRestrictionEffect(final DetainRestrictionEffect effect) { super(effect); } diff --git a/Mage/src/main/java/mage/abilities/effects/common/DrawCardTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DrawCardTargetEffect.java index 326336a9a56..baa6602d9de 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DrawCardTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DrawCardTargetEffect.java @@ -10,8 +10,6 @@ import mage.abilities.effects.OneShotEffect; import mage.constants.Outcome; import mage.game.Game; import mage.players.Player; -import mage.target.Target; -import mage.target.targetpointer.SecondTargetPointer; import mage.util.CardUtil; /** @@ -82,18 +80,7 @@ public class DrawCardTargetEffect extends OneShotEffect { if (staticText != null && !staticText.isEmpty()) { return staticText; } - StringBuilder sb = new StringBuilder(); - if (!mode.getTargets().isEmpty()) { - Target target; - if (targetPointer instanceof SecondTargetPointer && mode.getTargets().size() > 1) { - target = mode.getTargets().get(1); - } else { - target = mode.getTargets().get(0); - } - sb.append("target ").append(target.getTargetName()); - } else { - sb.append("that player"); - } + StringBuilder sb = new StringBuilder(getTargetPointer().describeTargets(mode.getTargets(), "that player")); if (optional) { sb.append(" may draw "); } else { diff --git a/Mage/src/main/java/mage/abilities/effects/common/ExchangeLifeControllerTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ExchangeLifeControllerTargetEffect.java index 843a45dddb4..46bfcc55255 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ExchangeLifeControllerTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ExchangeLifeControllerTargetEffect.java @@ -1,4 +1,3 @@ - package mage.abilities.effects.common; import mage.abilities.Ability; @@ -39,6 +38,6 @@ public class ExchangeLifeControllerTargetEffect extends OneShotEffect { @Override public String getText(Mode mode) { - return "Exchange life totals with target " + mode.getTargets().get(0).getTargetName(); + return "exchange life totals with " + getTargetPointer().describeTargets(mode.getTargets(), "that player"); } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/GainLifeTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/GainLifeTargetEffect.java index 36ff307dd03..761b0325869 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/GainLifeTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/GainLifeTargetEffect.java @@ -16,7 +16,7 @@ import mage.players.Player; */ public class GainLifeTargetEffect extends OneShotEffect { - private DynamicValue life; + private final DynamicValue life; public GainLifeTargetEffect(int life) { this(StaticValue.get(life)); @@ -50,20 +50,13 @@ public class GainLifeTargetEffect extends OneShotEffect { @Override public String getText(Mode mode) { - if (!staticText.isEmpty()) { + if (staticText != null && !staticText.isEmpty()) { return staticText; } - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(getTargetPointer().describeTargets(mode.getTargets(), "that player")); + sb.append(" gains "); String message = life.getMessage(); - - if (!mode.getTargets().isEmpty() && mode.getTargets().get(0).getMaxNumberOfTargets() == Integer.MAX_VALUE) { - sb.append("any number of target players each gain "); - } else if (!mode.getTargets().isEmpty()) { - sb.append("target ").append(mode.getTargets().get(0).getTargetName()).append(" gains "); - } else { - sb.append("that player gains "); - } - if (message.isEmpty() || !message.equals("1")) { + if (!message.equals("1")) { sb.append(life.toString()).append(' '); } sb.append("life"); diff --git a/Mage/src/main/java/mage/abilities/effects/common/LoseLifeTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/LoseLifeTargetEffect.java index cc4d078befd..1eaecdc0fc0 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/LoseLifeTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/LoseLifeTargetEffect.java @@ -52,19 +52,13 @@ public class LoseLifeTargetEffect extends OneShotEffect { @Override public String getText(Mode mode) { - if (!staticText.isEmpty()) { + if (staticText != null && !staticText.isEmpty()) { return staticText; } - StringBuilder sb = new StringBuilder(); - String message = amount.getMessage(); - - if (!mode.getTargets().isEmpty()) { - sb.append("target ").append(mode.getTargets().get(0).getTargetName()); - } else { - sb.append("that player"); - } + StringBuilder sb = new StringBuilder(getTargetPointer().describeTargets(mode.getTargets(), "that player")); sb.append(" loses "); - if (message.isEmpty() || !message.equals("1")) { + String message = amount.getMessage(); + if (!message.equals("1")) { sb.append(amount).append(' '); } sb.append("life"); diff --git a/Mage/src/main/java/mage/abilities/effects/common/PhaseOutTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/PhaseOutTargetEffect.java index 73f66434c7a..ef2e068327a 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/PhaseOutTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/PhaseOutTargetEffect.java @@ -14,20 +14,12 @@ import java.util.UUID; */ public class PhaseOutTargetEffect extends OneShotEffect { - protected final String targetDescription; - public PhaseOutTargetEffect() { - this((String) null); - } - - public PhaseOutTargetEffect(String targetDescription) { super(Outcome.Detriment); - this.targetDescription = targetDescription; } private PhaseOutTargetEffect(final PhaseOutTargetEffect effect) { super(effect); - this.targetDescription = effect.targetDescription; } @Override @@ -51,18 +43,7 @@ public class PhaseOutTargetEffect extends OneShotEffect { if (staticText != null && !staticText.isEmpty()) { return staticText; } - StringBuilder sb = new StringBuilder(); - if (targetDescription != null && !targetDescription.isEmpty()) { - sb.append(targetDescription); - } else { - sb.append("target ").append(mode.getTargets().get(0).getTargetName()); - } - sb.append(" phase"); - if (mode.getTargets().isEmpty() - || mode.getTargets().get(0).getMaxNumberOfTargets() <= 1) { - sb.append('s'); - } - sb.append(" out"); - return sb.toString(); + return getTargetPointer().describeTargets(mode.getTargets(), "it") + + (getTargetPointer().isPlural(mode.getTargets()) ? " phase out" : " phases out"); } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/RegenerateTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/RegenerateTargetEffect.java index ee188eb3dd2..7e1c9712b02 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/RegenerateTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/RegenerateTargetEffect.java @@ -9,9 +9,6 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; -import mage.target.Target; - -import java.util.Locale; /** * @author maurer.it_at_gmail.com @@ -40,7 +37,6 @@ public class RegenerateTargetEffect extends ReplacementEffectImpl { @Override public void init(Ability source, Game game) { super.init(source, game); - RegenerateSourceEffect.initRegenerationShieldInfo(game, source, targetPointer.getFirst(game, source)); } @@ -62,7 +58,6 @@ public class RegenerateTargetEffect extends ReplacementEffectImpl { @Override public boolean applies(GameEvent event, Ability source, Game game) { //20110204 - 701.11c - event.getAmount() is used to signal if regeneration is allowed - return event.getAmount() == 0 && event.getTargetId().equals(targetPointer.getFirst(game, source)) && !this.used; } @@ -71,15 +66,6 @@ public class RegenerateTargetEffect extends ReplacementEffectImpl { if (staticText != null && !staticText.isEmpty()) { return staticText; } - StringBuilder sb = new StringBuilder(); - sb.append("regenerate "); - Target target = mode.getTargets().get(0); - if (target != null) { - if (!target.getTargetName().toLowerCase(Locale.ENGLISH).startsWith("another")) { - sb.append("target "); - } - sb.append(target.getTargetName()); - } - return sb.toString(); + return "regenerate " + getTargetPointer().describeTargets(mode.getTargets(), "that creature"); } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/RemoveFromCombatTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/RemoveFromCombatTargetEffect.java index 31b92701a76..bd985c583f1 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/RemoveFromCombatTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/RemoveFromCombatTargetEffect.java @@ -1,4 +1,3 @@ - package mage.abilities.effects.common; import java.util.UUID; @@ -44,7 +43,7 @@ public class RemoveFromCombatTargetEffect extends OneShotEffect { if (staticText != null && !staticText.isEmpty()) { return staticText; } - return "Remove target " + mode.getTargets().get(0).getTargetName() + " from combat"; + return "remove " + getTargetPointer().describeTargets(mode.getTargets(), "that creature") + " from combat"; } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/TapAllTargetPlayerControlsEffect.java b/Mage/src/main/java/mage/abilities/effects/common/TapAllTargetPlayerControlsEffect.java index 2e9b4f0ede4..44baac8ce81 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/TapAllTargetPlayerControlsEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/TapAllTargetPlayerControlsEffect.java @@ -51,9 +51,8 @@ public class TapAllTargetPlayerControlsEffect extends OneShotEffect { if (staticText != null && !staticText.isEmpty()) { return staticText; } - - return "tap all " + filter.toString() + " target " + - (mode.getTargets().isEmpty() ? "player" : mode.getTargets().get(0).getTargetName()) + - " controls"; + return "tap all " + filter.getMessage() + ' ' + + getTargetPointer().describeTargets(mode.getTargets(), "that player") + + " controls"; } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/TransformTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/TransformTargetEffect.java index 783936fafcd..5d363990471 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/TransformTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/TransformTargetEffect.java @@ -6,8 +6,6 @@ import mage.abilities.effects.OneShotEffect; import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.target.Target; -import mage.util.CardUtil; import java.util.UUID; @@ -32,7 +30,7 @@ public class TransformTargetEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { for (UUID targetId : getTargetPointer().getTargets(game, source)) { - Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + Permanent permanent = game.getPermanent(targetId); if (permanent != null) { permanent.transform(source, game); } @@ -45,24 +43,6 @@ public class TransformTargetEffect extends OneShotEffect { if (staticText != null && !staticText.isEmpty()) { return staticText; } - StringBuilder sb = new StringBuilder("transform "); - Target target = mode.getTargets().get(0); - if (target.getMaxNumberOfTargets() == Integer.MAX_VALUE - && target.getMinNumberOfTargets() == 0) { - sb.append("any number of "); - } else if (target.getMaxNumberOfTargets() != target.getNumberOfTargets()) { - sb.append("up to "); - sb.append(CardUtil.numberToText(target.getMaxNumberOfTargets())); - sb.append(' '); - } else if (target.getMaxNumberOfTargets() > 1) { - sb.append(CardUtil.numberToText(target.getMaxNumberOfTargets())); - sb.append(' '); - } - String targetName = mode.getTargets().get(0).getTargetName(); - if (!targetName.contains("target ")) { - sb.append("target "); - } - sb.append(targetName); - return sb.toString(); + return "transform " + getTargetPointer().describeTargets(mode.getTargets(), "that creature"); } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/TurnFaceUpTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/TurnFaceUpTargetEffect.java index ec09fbf41b6..8fe0492d4e8 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/TurnFaceUpTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/TurnFaceUpTargetEffect.java @@ -33,6 +33,9 @@ public class TurnFaceUpTargetEffect extends OneShotEffect { @Override public String getText(Mode mode) { - return "turn target " + mode.getTargets().get(0).getTargetName() + " face up"; + if (staticText != null && !staticText.isEmpty()) { + return staticText; + } + return "turn " + getTargetPointer().describeTargets(mode.getTargets(), "it") + " face up"; } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java index a0a9719b7af..7487d2b8075 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java @@ -6,8 +6,6 @@ import mage.abilities.effects.OneShotEffect; import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.target.Target; -import mage.util.CardUtil; import java.util.UUID; @@ -52,31 +50,6 @@ public class UntapTargetEffect extends OneShotEffect { if (staticText != null && !staticText.isEmpty()) { return staticText; } - - if (mode.getTargets().isEmpty()) { - return "untap target permanent"; // TODO: add exeption about missing targets setup? - } - - Target target = mode.getTargets().get(0); - StringBuilder sb = new StringBuilder(); - sb.append("untap "); - if (target.getNumberOfTargets() == 0) { - sb.append("up to "); - } - - boolean haveTargetWord = target.getTargetName().contains("target"); - if (target.getMaxNumberOfTargets() > 1 || target.getNumberOfTargets() == 0) { - sb.append(CardUtil.numberToText(target.getMaxNumberOfTargets())); - sb.append(haveTargetWord ? " " : " target "); - sb.append(target.getTargetName()); - if (target.getMaxNumberOfTargets() > 1 && !target.getTargetName().endsWith("s")) { - sb.append('s'); - } - } else { - sb.append(haveTargetWord ? "" : "target "); - sb.append(target.getTargetName()); - } - - return sb.toString(); + return "untap " + getTargetPointer().describeTargets(mode.getTargets(), "that permanent"); } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/SetBasePowerToughnessTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/SetBasePowerToughnessTargetEffect.java index 649f6119a98..cbec7bc2cb0 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/SetBasePowerToughnessTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/SetBasePowerToughnessTargetEffect.java @@ -11,8 +11,6 @@ import mage.constants.Outcome; import mage.constants.SubLayer; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.target.Target; -import mage.util.CardUtil; import java.util.UUID; @@ -21,8 +19,8 @@ import java.util.UUID; */ public class SetBasePowerToughnessTargetEffect extends ContinuousEffectImpl { - private DynamicValue power; - private DynamicValue toughness; + private final DynamicValue power; + private final DynamicValue toughness; public SetBasePowerToughnessTargetEffect(DynamicValue power, DynamicValue toughness, Duration duration) { super(duration, Layer.PTChangingEffects_7, SubLayer.SetPT_7b, Outcome.BoostCreature); @@ -69,28 +67,9 @@ public class SetBasePowerToughnessTargetEffect extends ContinuousEffectImpl { if (staticText != null && !staticText.isEmpty()) { return staticText; } - StringBuilder sb = new StringBuilder(); - if (mode.getTargets().get(0).getMinNumberOfTargets() == 0) { - if (!mode.getTargets().get(0).getTargetName().startsWith("any")) { - sb.append("up to "); - sb.append(CardUtil.numberToText(mode.getTargets().get(0).getMaxNumberOfTargets())); - sb.append(' '); - } - } - if (!mode.getTargets().get(0).getTargetName().contains("target")) { - sb.append("target "); - } - sb.append(mode.getTargets().get(0).getTargetName()); - if (mode.getTargets().stream().mapToInt(Target::getMaxNumberOfTargets).max().orElse(0) > 1) { - sb.append(" have"); - } else { - sb.append(" has"); - } - sb.append(" base power and toughness "); - sb.append(power).append('/').append(toughness); - if (!duration.toString().isEmpty()) { - sb.append(' ').append(duration.toString()); - } - return sb.toString(); + return getTargetPointer().describeTargets(mode.getTargets(), "that creature") + + (getTargetPointer().isPlural(mode.getTargets()) ? " have" : " has") + + " base power and toughness " + power + '/' + toughness + + (duration.toString().isEmpty() ? "" : ' ' + duration.toString()); } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/discard/DiscardHandTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/discard/DiscardHandTargetEffect.java index a62ccb49b29..985dce94124 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/discard/DiscardHandTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/discard/DiscardHandTargetEffect.java @@ -1,5 +1,3 @@ - - package mage.abilities.effects.common.discard; import java.util.UUID; @@ -17,20 +15,12 @@ import mage.players.Player; public class DiscardHandTargetEffect extends OneShotEffect { - protected String targetDescription; - public DiscardHandTargetEffect() { - this(""); - } - - public DiscardHandTargetEffect(String targetDescription) { super(Outcome.Discard); - this.targetDescription = targetDescription; } protected DiscardHandTargetEffect(final DiscardHandTargetEffect effect) { super(effect); - this.targetDescription = effect.targetDescription; } @Override @@ -40,17 +30,13 @@ public class DiscardHandTargetEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - for (UUID playerId : getTargetPointer().getTargets(game, source)) { - Player player = game.getPlayer(playerId); - if (player != null) { - player.discard(player.getHand().size(), false, false, source, game); - } + for (UUID playerId : getTargetPointer().getTargets(game, source)) { + Player player = game.getPlayer(playerId); + if (player != null) { + player.discard(player.getHand().size(), false, false, source, game); } - return true; } - return false; + return true; } @Override @@ -58,13 +44,7 @@ public class DiscardHandTargetEffect extends OneShotEffect { if (staticText != null && !staticText.isEmpty()) { return staticText; } - StringBuilder sb = new StringBuilder(); - if (!targetDescription.isEmpty()) { - sb.append(targetDescription); - } else { - sb.append("target ").append(mode.getTargets().get(0).getTargetName()); - } - sb.append(" discards their hand"); - return sb.toString(); + return getTargetPointer().describeTargets(mode.getTargets(), "that player") + + " discards their hand"; } -} \ No newline at end of file +} diff --git a/Mage/src/main/java/mage/target/common/TargetArtifactPermanent.java b/Mage/src/main/java/mage/target/common/TargetArtifactPermanent.java index 2c10c2467a2..38387696f36 100644 --- a/Mage/src/main/java/mage/target/common/TargetArtifactPermanent.java +++ b/Mage/src/main/java/mage/target/common/TargetArtifactPermanent.java @@ -10,20 +10,21 @@ import mage.target.TargetPermanent; public class TargetArtifactPermanent extends TargetPermanent { public TargetArtifactPermanent() { - this(1, 1, StaticFilters.FILTER_PERMANENT_ARTIFACT, false); - } - - - public TargetArtifactPermanent(FilterArtifactPermanent filter) { - this(1, 1, filter, false); + this(1); } public TargetArtifactPermanent(int numTargets) { - this(numTargets, numTargets, StaticFilters.FILTER_PERMANENT_ARTIFACT, false); + this(numTargets, numTargets); } public TargetArtifactPermanent(int minNumTargets, int maxNumTargets) { - this(minNumTargets, maxNumTargets, StaticFilters.FILTER_PERMANENT_ARTIFACT, false); + this(minNumTargets, maxNumTargets, + (maxNumTargets > 1 ? StaticFilters.FILTER_PERMANENT_ARTIFACTS : StaticFilters.FILTER_PERMANENT_ARTIFACT), + false); + } + + public TargetArtifactPermanent(FilterArtifactPermanent filter) { + this(1, 1, filter, false); } public TargetArtifactPermanent(int minNumTargets, int maxNumTargets, FilterArtifactPermanent filter, boolean notTarget) {