From 3e650211507f7f4b01c843c425637c1efe047b44 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Thu, 19 Jun 2025 16:00:31 -0400 Subject: [PATCH] partially refactor TargetCreaturePermanent constructors --- .../utils/testers/BaseTestableDialog.java | 17 ++- .../src/mage/cards/a/AirCultElemental.java | 10 +- Mage.Sets/src/mage/cards/a/ArmTheCathars.java | 18 +-- Mage.Sets/src/mage/cards/a/AtraxiWarden.java | 5 +- Mage.Sets/src/mage/cards/b/Betray.java | 6 +- .../src/mage/cards/b/BetrayalAtTheVault.java | 6 +- .../src/mage/cards/b/BlessedAlliance.java | 26 +--- Mage.Sets/src/mage/cards/b/BlueDragon.java | 24 +--- .../mage/cards/b/BreakingOfTheFellowship.java | 11 +- Mage.Sets/src/mage/cards/b/BrokenDam.java | 15 +- .../src/mage/cards/c/CauldronOfSouls.java | 19 ++- .../src/mage/cards/c/CloudsLimitBreak.java | 5 +- Mage.Sets/src/mage/cards/c/ComboAttack.java | 12 +- .../src/mage/cards/c/CulturalExchange.java | 6 +- .../src/mage/cards/c/CurseOfTheWerefox.java | 23 +--- Mage.Sets/src/mage/cards/c/Cytoshape.java | 15 +- Mage.Sets/src/mage/cards/d/DeadRingers.java | 49 ++++--- .../src/mage/cards/d/DecimatorBeetle.java | 4 +- .../src/mage/cards/d/DihadaBinderOfWills.java | 4 +- .../mage/cards/d/DissensionInTheRanks.java | 24 ++-- Mage.Sets/src/mage/cards/d/DoOrDie.java | 7 +- .../src/mage/cards/d/DomineeringWill.java | 12 +- Mage.Sets/src/mage/cards/d/Duneblast.java | 41 +++--- .../src/mage/cards/f/FallOfTheImpostor.java | 69 +++++----- .../src/mage/cards/f/FeralEncounter.java | 4 +- Mage.Sets/src/mage/cards/f/FightOrFlight.java | 9 +- .../src/mage/cards/f/FleetingReflection.java | 15 +- Mage.Sets/src/mage/cards/f/Forcefield.java | 9 +- .../src/mage/cards/f/ForgottenAncient.java | 20 +-- Mage.Sets/src/mage/cards/f/Fumble.java | 14 +- .../mage/cards/g/GargosViciousWatcher.java | 11 +- .../src/mage/cards/g/GideonBattleForged.java | 3 +- Mage.Sets/src/mage/cards/g/GildedDrake.java | 13 +- Mage.Sets/src/mage/cards/g/GrindDust.java | 31 +++-- .../src/mage/cards/h/HostileTakeover.java | 30 ++-- .../mage/cards/h/HuatliDinosaurKnight.java | 22 +-- Mage.Sets/src/mage/cards/i/IdentityThief.java | 53 +++---- .../src/mage/cards/i/IllithidHarvester.java | 6 +- .../src/mage/cards/i/InfernalDenizen.java | 102 ++++++-------- .../mage/cards/j/JaceIngeniousMindMage.java | 9 +- .../src/mage/cards/j/JaddiLifestrider.java | 4 +- .../src/mage/cards/j/JaggedLightning.java | 8 +- .../src/mage/cards/j/JediStarfighter.java | 12 +- .../src/mage/cards/j/JoragaAuxiliary.java | 12 +- .../src/mage/cards/j/JubilantMascot.java | 12 +- .../src/mage/cards/k/KayaGhostAssassin.java | 13 +- .../src/mage/cards/k/KayaTheInexorable.java | 8 +- Mage.Sets/src/mage/cards/k/KyloRen.java | 9 +- Mage.Sets/src/mage/cards/l/LedevChampion.java | 33 ++--- .../mage/cards/l/LilianaTheNecromancer.java | 2 +- Mage.Sets/src/mage/cards/m/MabelsMettle.java | 4 +- Mage.Sets/src/mage/cards/m/MarthaJones.java | 4 +- .../src/mage/cards/m/MasterOfTheVeil.java | 10 +- .../src/mage/cards/m/MasterWarcraft.java | 4 +- .../src/mage/cards/m/MischiefAndMayhem.java | 7 +- Mage.Sets/src/mage/cards/m/ModifyMemory.java | 4 +- Mage.Sets/src/mage/cards/m/Mutiny.java | 4 +- .../src/mage/cards/n/NissasJudgment.java | 8 +- Mage.Sets/src/mage/cards/p/PhantomBlade.java | 4 +- .../src/mage/cards/p/PolymorphousRush.java | 5 +- .../src/mage/cards/p/ProfaneCommand.java | 16 +-- Mage.Sets/src/mage/cards/r/RallyManeuver.java | 27 ++-- .../mage/cards/r/RavenousTyrannosaurus.java | 6 +- .../src/mage/cards/r/RazorgrassInvoker.java | 4 +- Mage.Sets/src/mage/cards/r/RecklessSpite.java | 7 +- .../src/mage/cards/r/RestlessVinestalk.java | 4 +- Mage.Sets/src/mage/cards/r/Retribution.java | 130 ++++++++---------- Mage.Sets/src/mage/cards/r/RivalsDuel.java | 68 +++++---- .../src/mage/cards/r/RiverHeraldsBoon.java | 20 ++- .../src/mage/cards/r/RoamingGhostlight.java | 4 +- .../src/mage/cards/r/RunAwayTogether.java | 7 +- .../src/mage/cards/s/SaddlebackLagac.java | 10 +- Mage.Sets/src/mage/cards/s/SeismicShift.java | 8 +- .../src/mage/cards/s/ShelteringAncient.java | 16 +-- Mage.Sets/src/mage/cards/s/SiegeStriker.java | 38 ++--- .../src/mage/cards/s/SigardianPriest.java | 12 +- Mage.Sets/src/mage/cards/s/SmellFear.java | 4 +- Mage.Sets/src/mage/cards/s/SplitTheParty.java | 13 +- Mage.Sets/src/mage/cards/s/SpyNetwork.java | 4 +- Mage.Sets/src/mage/cards/s/StandOrFall.java | 6 +- .../src/mage/cards/s/StruggleForSkemfar.java | 6 +- .../src/mage/cards/s/SwayOfIllusion.java | 14 +- .../mage/cards/t/TamiyoFieldResearcher.java | 2 +- .../src/mage/cards/t/ThisIsHowItEnds.java | 65 +++++---- Mage.Sets/src/mage/cards/t/TidalSurge.java | 14 +- Mage.Sets/src/mage/cards/t/TrickShot.java | 3 +- Mage.Sets/src/mage/cards/t/Twigwalker.java | 9 +- Mage.Sets/src/mage/cards/u/UrgeToFeed.java | 23 ++-- .../src/mage/cards/v/VesuvanShapeshifter.java | 17 +-- Mage.Sets/src/mage/cards/w/WeaverOfLies.java | 11 +- .../src/mage/cards/w/WerefoxBodyguard.java | 4 +- Mage.Sets/src/mage/cards/w/WickedPact.java | 10 +- .../src/mage/cards/z/ZndrspltsJudgment.java | 13 +- .../effects/keyword/SupportEffect.java | 3 +- .../abilities/keyword/SupportAbility.java | 25 ++-- .../mage/game/command/planes/BantPlane.java | 4 +- .../command/planes/FeedingGroundsPlane.java | 4 +- .../common/TargetCreaturePermanent.java | 9 +- ...etCreaturePermanentWithDifferentTypes.java | 49 ------- 99 files changed, 724 insertions(+), 911 deletions(-) delete mode 100644 Mage/src/main/java/mage/target/common/TargetCreaturePermanentWithDifferentTypes.java diff --git a/Mage.Common/src/main/java/mage/utils/testers/BaseTestableDialog.java b/Mage.Common/src/main/java/mage/utils/testers/BaseTestableDialog.java index 2b605187fe4..2ae8d4cae79 100644 --- a/Mage.Common/src/main/java/mage/utils/testers/BaseTestableDialog.java +++ b/Mage.Common/src/main/java/mage/utils/testers/BaseTestableDialog.java @@ -1,11 +1,12 @@ package mage.utils.testers; -import mage.constants.SubType; -import mage.filter.common.FilterCreaturePermanent; +import mage.constants.ComparisonType; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.players.Player; import mage.target.Target; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import mage.target.common.TargetPermanentOrPlayer; /** @@ -79,12 +80,14 @@ abstract class BaseTestableDialog implements TestableDialog { return new TargetPermanentOrPlayer(min, max).withNotTarget(notTarget); } - static Target createImpossibleTarget(int min, int max) { - return createImpossibleTarget(min, max, false); + private static final FilterPermanent impossibleFilter = new FilterPermanent(); + + static { + impossibleFilter.add(new ManaValuePredicate(ComparisonType.OR_LESS, -1)); } - private static Target createImpossibleTarget(int min, int max, boolean notTarget) { - return new TargetCreaturePermanent(min, max, new FilterCreaturePermanent(SubType.TROOPER, "rare type"), notTarget); + static Target createImpossibleTarget(int min, int max) { + return new TargetPermanent(min, max, impossibleFilter); } @Override diff --git a/Mage.Sets/src/mage/cards/a/AirCultElemental.java b/Mage.Sets/src/mage/cards/a/AirCultElemental.java index 173b62f090d..f7689e5385c 100644 --- a/Mage.Sets/src/mage/cards/a/AirCultElemental.java +++ b/Mage.Sets/src/mage/cards/a/AirCultElemental.java @@ -1,21 +1,21 @@ package mage.cards.a; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.common.ReturnToHandTargetEffect; -import mage.constants.SubType; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.AnotherPredicate; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; + +import java.util.UUID; /** - * * @author weirddan455 */ public final class AirCultElemental extends CardImpl { @@ -38,7 +38,7 @@ public final class AirCultElemental extends CardImpl { // Whirlwind — When Air-Cult Elemental enters the battlefield, return up to one other target creature to its owner's hand. Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect()); - ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false)); + ability.addTarget(new TargetPermanent(0, 1, filter)); this.addAbility(ability.withFlavorWord("Whirlwind")); } diff --git a/Mage.Sets/src/mage/cards/a/ArmTheCathars.java b/Mage.Sets/src/mage/cards/a/ArmTheCathars.java index f81384f8255..13d4cf1d25f 100644 --- a/Mage.Sets/src/mage/cards/a/ArmTheCathars.java +++ b/Mage.Sets/src/mage/cards/a/ArmTheCathars.java @@ -8,7 +8,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.other.AnotherTargetPredicate; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.SecondTargetPointer; import mage.target.targetpointer.ThirdTargetPointer; @@ -35,28 +35,22 @@ public final class ArmTheCathars extends CardImpl { // Until end of turn, target creature gets +3/+3, up to one other target creature gets +2/+2, and up to one other target creature gets +1/+1. Those creatures gain vigilance until end of turn. this.getSpellAbility().addEffect(new BoostTargetEffect(3, 3) .setText("until end of turn, target creature gets +3/+3")); - TargetCreaturePermanent target1 = new TargetCreaturePermanent(filter1); - target1.setTargetTag(1); - this.getSpellAbility().addTarget(target1.withChooseHint("+3/+3")); + this.getSpellAbility().addTarget(new TargetPermanent(filter1).setTargetTag(1).withChooseHint("+3/+3")); this.getSpellAbility().addEffect(new BoostTargetEffect(2, 2) .setTargetPointer(new SecondTargetPointer()) .setText(", up to one other target creature gets +2/+2")); - TargetCreaturePermanent target2 = new TargetCreaturePermanent(0, 1, filter2, false); - target2.setTargetTag(2); - this.getSpellAbility().addTarget(target2.withChooseHint("+2/+2")); + this.getSpellAbility().addTarget(new TargetPermanent(0, 1, filter2).setTargetTag(2).withChooseHint("+2/+2")); this.getSpellAbility().addEffect(new BoostTargetEffect(1, 1) .setTargetPointer(new ThirdTargetPointer()) .setText(", and up to one other target creature gets +1/+1")); - TargetCreaturePermanent target3 = new TargetCreaturePermanent(0, 1, filter3, false); - target3.setTargetTag(3); - this.getSpellAbility().addTarget(target3.withChooseHint("+1/+1")); + this.getSpellAbility().addTarget(new TargetPermanent(0, 1, filter3).setTargetTag(3).withChooseHint("+1/+1")); this.getSpellAbility().addEffect( new GainAbilityTargetEffect(VigilanceAbility.getInstance()) - .setTargetPointer(new EachTargetPointer()) - .setText("Those creatures gain vigilance until end of turn")); + .setTargetPointer(new EachTargetPointer()) + .setText("Those creatures gain vigilance until end of turn")); } private ArmTheCathars(final ArmTheCathars card) { diff --git a/Mage.Sets/src/mage/cards/a/AtraxiWarden.java b/Mage.Sets/src/mage/cards/a/AtraxiWarden.java index 00c4b0e3474..8103813cf06 100644 --- a/Mage.Sets/src/mage/cards/a/AtraxiWarden.java +++ b/Mage.Sets/src/mage/cards/a/AtraxiWarden.java @@ -13,7 +13,7 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.TappedPredicate; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import java.util.UUID; @@ -28,7 +28,6 @@ public final class AtraxiWarden extends CardImpl { filter.add(TappedPredicate.TAPPED); } - public AtraxiWarden(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}{W}"); @@ -42,7 +41,7 @@ public final class AtraxiWarden extends CardImpl { // When Atraxi Warden enters the battlefield, exile up to one target tapped creature. Ability ability = new EntersBattlefieldTriggeredAbility(new ExileTargetEffect()); - ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false)); + ability.addTarget(new TargetPermanent(0, 1, filter)); this.addAbility(ability); // Suspend 5--{1}{W} diff --git a/Mage.Sets/src/mage/cards/b/Betray.java b/Mage.Sets/src/mage/cards/b/Betray.java index 3043c4c4709..b89dc0cb507 100644 --- a/Mage.Sets/src/mage/cards/b/Betray.java +++ b/Mage.Sets/src/mage/cards/b/Betray.java @@ -10,7 +10,7 @@ import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import java.util.UUID; @@ -18,13 +18,13 @@ import java.util.UUID; * @author Merlingilb */ public class Betray extends CardImpl { + public Betray(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{R}"); //Target creature an opponent controls deals damage to its controller equal to that creature's power. this.getSpellAbility().addEffect(new BetrayEffect()); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(1, 1, - StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE, false)); + this.getSpellAbility().addTarget(new TargetPermanent(StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE)); } private Betray(final Betray card) { diff --git a/Mage.Sets/src/mage/cards/b/BetrayalAtTheVault.java b/Mage.Sets/src/mage/cards/b/BetrayalAtTheVault.java index 206c7c0f4ee..764f21e7d54 100644 --- a/Mage.Sets/src/mage/cards/b/BetrayalAtTheVault.java +++ b/Mage.Sets/src/mage/cards/b/BetrayalAtTheVault.java @@ -11,8 +11,8 @@ import mage.filter.predicate.other.AnotherTargetPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.Target; +import mage.target.TargetPermanent; import mage.target.common.TargetControlledCreaturePermanent; -import mage.target.common.TargetCreaturePermanent; import java.util.List; import java.util.Objects; @@ -35,7 +35,7 @@ public final class BetrayalAtTheVault extends CardImpl { // Target creature you control deals damage equal to its power to each of two other target creatures. this.getSpellAbility().addEffect(new BetrayalAtTheVaultEffect()); this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent().setTargetTag(1)); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(2, 2, filter, false).setTargetTag(2)); + this.getSpellAbility().addTarget(new TargetPermanent(2, filter).setTargetTag(2)); } private BetrayalAtTheVault(final BetrayalAtTheVault card) { @@ -81,4 +81,4 @@ class BetrayalAtTheVaultEffect extends OneShotEffect { .forEach(p -> p.damage(creature.getPower().getValue(), creature.getId(), source, game)); return true; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/b/BlessedAlliance.java b/Mage.Sets/src/mage/cards/b/BlessedAlliance.java index 1edb08eed24..3c99a3b6cad 100644 --- a/Mage.Sets/src/mage/cards/b/BlessedAlliance.java +++ b/Mage.Sets/src/mage/cards/b/BlessedAlliance.java @@ -2,7 +2,6 @@ package mage.cards.b; import mage.abilities.Mode; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.GainLifeTargetEffect; import mage.abilities.effects.common.SacrificeEffect; import mage.abilities.effects.common.UntapTargetEffect; @@ -10,10 +9,7 @@ import mage.abilities.keyword.EscalateAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.TargetController; -import mage.filter.FilterPlayer; import mage.filter.common.FilterAttackingCreature; -import mage.filter.common.FilterCreaturePermanent; import mage.target.TargetPlayer; import mage.target.common.TargetCreaturePermanent; @@ -24,14 +20,6 @@ import java.util.UUID; */ public final class BlessedAlliance extends CardImpl { - private static final FilterPlayer filterSacrifice = new FilterPlayer("opponent to sacrifice an attacking creature"); - private static final FilterCreaturePermanent filterCreature = new FilterCreaturePermanent("creatures to untap"); - private static final FilterPlayer filterGainLife = new FilterPlayer("player to gain life"); - - static { - filterSacrifice.add(TargetController.OPPONENT.getPlayerPredicate()); - } - public BlessedAlliance(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}"); @@ -43,21 +31,17 @@ public final class BlessedAlliance extends CardImpl { this.getSpellAbility().getModes().setMaxModes(3); // Target player gains 4 life. - Effect effect = new GainLifeTargetEffect(4); - effect.setText("Target player gains 4 life"); - this.getSpellAbility().addEffect(effect); - this.getSpellAbility().addTarget(new TargetPlayer(1, 1, false, filterGainLife).withChooseHint("player gains 4 life")); + this.getSpellAbility().addEffect(new GainLifeTargetEffect(4)); + this.getSpellAbility().addTarget(new TargetPlayer().withChooseHint("player gains 4 life")); // Untap up to two target creatures. - effect = new UntapTargetEffect(); - effect.setText("Untap up to two target creatures"); - Mode mode = new Mode(effect); - mode.addTarget(new TargetCreaturePermanent(0, 2, filterCreature, false).withChooseHint("untap")); + Mode mode = new Mode(new UntapTargetEffect()); + mode.addTarget(new TargetCreaturePermanent(0, 2).withChooseHint("untap")); this.getSpellAbility().addMode(mode); // Target opponent sacrifices an attacking creature. mode = new Mode(new SacrificeEffect(new FilterAttackingCreature(), 1, "Target opponent")); - mode.addTarget(new TargetPlayer(1, 1, false, filterSacrifice).withChooseHint("sacrifices an attacking creature")); + mode.addTarget(new TargetPlayer().withChooseHint("sacrifices an attacking creature")); this.getSpellAbility().addMode(mode); } diff --git a/Mage.Sets/src/mage/cards/b/BlueDragon.java b/Mage.Sets/src/mage/cards/b/BlueDragon.java index 670d550e1b3..3ba5018301b 100644 --- a/Mage.Sets/src/mage/cards/b/BlueDragon.java +++ b/Mage.Sets/src/mage/cards/b/BlueDragon.java @@ -1,24 +1,24 @@ package mage.cards.b; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.ContinuousEffectImpl; -import mage.constants.*; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.*; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.other.AnotherTargetPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.Target; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import mage.target.common.TargetOpponentsCreaturePermanent; +import java.util.UUID; + /** - * * @author weirddan455 */ public final class BlueDragon extends CardImpl { @@ -43,19 +43,9 @@ public final class BlueDragon extends CardImpl { // Lightning Breath — When Blue Dragon enters the battlefield, until your next turn, target creature an opponent controls gets -3/-0, up to one other target creature gets -2/-0, and up to one other target creature gets -1/-0. Ability ability = new EntersBattlefieldTriggeredAbility(new BlueDragonEffect()); - - Target target = new TargetOpponentsCreaturePermanent(); - target.setTargetTag(1); - ability.addTarget(target.withChooseHint("-3/-0")); - - target = new TargetCreaturePermanent(0, 1, filter2, false); - target.setTargetTag(2); - ability.addTarget(target.withChooseHint("-2/-0")); - - target = new TargetCreaturePermanent(0, 1, filter3, false); - target.setTargetTag(3); - ability.addTarget(target.withChooseHint("-1/-0")); - + ability.addTarget(new TargetOpponentsCreaturePermanent().setTargetTag(1).withChooseHint("-3/-0")); + ability.addTarget(new TargetPermanent(0, 1, filter2).setTargetTag(2).withChooseHint("-2/-0")); + ability.addTarget(new TargetPermanent(0, 1, filter3).setTargetTag(3).withChooseHint("-1/-0")); this.addAbility(ability.withFlavorWord("Lightning Breath")); } diff --git a/Mage.Sets/src/mage/cards/b/BreakingOfTheFellowship.java b/Mage.Sets/src/mage/cards/b/BreakingOfTheFellowship.java index 2a4438cf23c..6b1449b7d2e 100644 --- a/Mage.Sets/src/mage/cards/b/BreakingOfTheFellowship.java +++ b/Mage.Sets/src/mage/cards/b/BreakingOfTheFellowship.java @@ -16,6 +16,7 @@ import mage.filter.predicate.permanent.PermanentIdPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -30,8 +31,8 @@ public final class BreakingOfTheFellowship extends CardImpl { // Target creature an opponent controls deals damage equal to its power to another target creature that player controls. this.getSpellAbility().addEffect(new BreakingOfTheFellowshipEffect()); - this.getSpellAbility().addTarget(new BreakingOfTheFellowshipFirstTarget(StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE)); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("another target creature that player controls"))); + this.getSpellAbility().addTarget(new BreakingOfTheFellowshipFirstTarget()); + this.getSpellAbility().addTarget(new TargetPermanent(new FilterCreaturePermanent("another target creature that player controls"))); // The Ring tempts you. this.getSpellAbility().addEffect(new TheRingTemptsYouEffect()); @@ -78,10 +79,10 @@ class BreakingOfTheFellowshipEffect extends OneShotEffect { } -class BreakingOfTheFellowshipFirstTarget extends TargetCreaturePermanent { +class BreakingOfTheFellowshipFirstTarget extends TargetPermanent { - public BreakingOfTheFellowshipFirstTarget(FilterCreaturePermanent filter) { - super(1, 1, filter, false); + public BreakingOfTheFellowshipFirstTarget() { + super(1, 1, StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE, false); } private BreakingOfTheFellowshipFirstTarget(final BreakingOfTheFellowshipFirstTarget target) { diff --git a/Mage.Sets/src/mage/cards/b/BrokenDam.java b/Mage.Sets/src/mage/cards/b/BrokenDam.java index 46f0f144bff..f55a0bb78cc 100644 --- a/Mage.Sets/src/mage/cards/b/BrokenDam.java +++ b/Mage.Sets/src/mage/cards/b/BrokenDam.java @@ -1,7 +1,5 @@ - package mage.cards.b; -import java.util.UUID; import mage.abilities.effects.common.TapTargetEffect; import mage.abilities.keyword.HorsemanshipAbility; import mage.cards.CardImpl; @@ -10,26 +8,27 @@ import mage.constants.CardType; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.AbilityPredicate; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; + +import java.util.UUID; /** - * * @author LoneFox */ public final class BrokenDam extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures without horsemanship"); static { filter.add(Predicates.not(new AbilityPredicate(HorsemanshipAbility.class))); } - public BrokenDam(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{U}"); + public BrokenDam(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{U}"); // Tap one or two target creatures without horsemanship. this.getSpellAbility().addEffect(new TapTargetEffect("tap one or two target creatures without horsemanship")); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(1, 2, filter, false)); + this.getSpellAbility().addTarget(new TargetPermanent(1, 2, filter)); } private BrokenDam(final BrokenDam card) { diff --git a/Mage.Sets/src/mage/cards/c/CauldronOfSouls.java b/Mage.Sets/src/mage/cards/c/CauldronOfSouls.java index 49d6eac6183..7c7add9d41f 100644 --- a/Mage.Sets/src/mage/cards/c/CauldronOfSouls.java +++ b/Mage.Sets/src/mage/cards/c/CauldronOfSouls.java @@ -1,23 +1,19 @@ - package mage.cards.c; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.PersistAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.constants.Zone; -import mage.filter.StaticFilters; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author jeffwadsworth */ public final class CauldronOfSouls extends CardImpl { @@ -26,12 +22,13 @@ public final class CauldronOfSouls extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{5}"); // {tap}: Choose any number of target creatures. Each of those creatures gains persist until end of turn. - Effect effect = new GainAbilityTargetEffect(new PersistAbility(), Duration.EndOfTurn); - effect.setText("choose any number of target creatures. Each of those creatures gains persist until end of turn"); - Ability ability = new SimpleActivatedAbility(effect, new TapSourceCost()); - ability.addTarget(new TargetCreaturePermanent(0, Integer.MAX_VALUE, StaticFilters.FILTER_PERMANENT_CREATURE, false)); + Ability ability = new SimpleActivatedAbility( + new GainAbilityTargetEffect(new PersistAbility(), Duration.EndOfTurn) + .setText("choose any number of target creatures. Each of those creatures gains persist until end of turn"), + new TapSourceCost() + ); + ability.addTarget(new TargetCreaturePermanent(0, Integer.MAX_VALUE)); this.addAbility(ability); - } private CauldronOfSouls(final CauldronOfSouls card) { diff --git a/Mage.Sets/src/mage/cards/c/CloudsLimitBreak.java b/Mage.Sets/src/mage/cards/c/CloudsLimitBreak.java index 25b96002dce..91b5eea84fd 100644 --- a/Mage.Sets/src/mage/cards/c/CloudsLimitBreak.java +++ b/Mage.Sets/src/mage/cards/c/CloudsLimitBreak.java @@ -16,7 +16,6 @@ import mage.filter.predicate.permanent.TappedPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.TargetPermanent; -import mage.target.common.TargetCreaturePermanent; import java.util.Objects; import java.util.UUID; @@ -67,9 +66,9 @@ public final class CloudsLimitBreak extends CardImpl { } } -class CloudsLimitBreakTarget extends TargetCreaturePermanent { +class CloudsLimitBreakTarget extends TargetPermanent { - private static final FilterCreaturePermanent filter + private static final FilterPermanent filter = new FilterCreaturePermanent("tapped creatures with different controllers"); CloudsLimitBreakTarget() { diff --git a/Mage.Sets/src/mage/cards/c/ComboAttack.java b/Mage.Sets/src/mage/cards/c/ComboAttack.java index 2b17b496161..8acc59d0cf4 100644 --- a/Mage.Sets/src/mage/cards/c/ComboAttack.java +++ b/Mage.Sets/src/mage/cards/c/ComboAttack.java @@ -1,30 +1,34 @@ package mage.cards.c; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; +import mage.filter.FilterPermanent; import mage.filter.common.FilterTeamCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class ComboAttack extends CardImpl { + private static final FilterPermanent filter = new FilterTeamCreaturePermanent("creatures your team controls"); + public ComboAttack(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{G}"); // Two target creatures your team controls each deal damage equal to their power to target creature. this.getSpellAbility().addEffect(new ComboAttackEffect()); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(2, 2, new FilterTeamCreaturePermanent(), false)); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(1)); + this.getSpellAbility().addTarget(new TargetPermanent(2, filter)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } private ComboAttack(final ComboAttack card) { diff --git a/Mage.Sets/src/mage/cards/c/CulturalExchange.java b/Mage.Sets/src/mage/cards/c/CulturalExchange.java index 8e6820e0200..b876d746db0 100644 --- a/Mage.Sets/src/mage/cards/c/CulturalExchange.java +++ b/Mage.Sets/src/mage/cards/c/CulturalExchange.java @@ -14,8 +14,8 @@ import mage.filter.predicate.permanent.ControllerIdPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.target.TargetPermanent; import mage.target.TargetPlayer; -import mage.target.common.TargetCreaturePermanent; import mage.target.targetpointer.FixedTarget; import java.util.UUID; @@ -79,10 +79,10 @@ class CulturalExchangeEffect extends OneShotEffect { if (creaturesToSwitch == 0) { return true; } - TargetCreaturePermanent target1 = new TargetCreaturePermanent(0, creaturesToSwitch, filter1, true); + TargetPermanent target1 = new TargetPermanent(0, creaturesToSwitch, filter1, true); if (target1.choose(Outcome.Benefit, controller.getId(), source.getSourceId(), source, game)) { int otherToSwitch = target1.getTargets().size(); - TargetCreaturePermanent target2 = new TargetCreaturePermanent(otherToSwitch, otherToSwitch, filter2, true); + TargetPermanent target2 = new TargetPermanent(otherToSwitch, otherToSwitch, filter2, true); if (target2.choose(Outcome.Benefit, controller.getId(), source.getSourceId(), source, game)) { for (UUID creatureId : target1.getTargets()) { Permanent creature = game.getPermanent(creatureId); diff --git a/Mage.Sets/src/mage/cards/c/CurseOfTheWerefox.java b/Mage.Sets/src/mage/cards/c/CurseOfTheWerefox.java index a9e2e82d4ed..fe41a93cba1 100644 --- a/Mage.Sets/src/mage/cards/c/CurseOfTheWerefox.java +++ b/Mage.Sets/src/mage/cards/c/CurseOfTheWerefox.java @@ -3,8 +3,6 @@ package mage.cards.c; import mage.abilities.Ability; import mage.abilities.common.delayed.ReflexiveTriggeredAbility; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.CreateRoleAttachedTargetEffect; -import mage.abilities.effects.common.FightTargetsEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -13,11 +11,9 @@ import mage.constants.RoleType; import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; import mage.target.common.TargetControlledCreaturePermanent; -import mage.target.common.TargetCreaturePermanent; -import mage.target.common.TargetOpponentsCreaturePermanent; import mage.target.targetpointer.FixedTarget; -import mage.util.GameLog; import java.util.UUID; @@ -64,24 +60,15 @@ class CurseOfTheWerefoxEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Permanent target = game.getPermanent(source.getFirstTarget()); - if (target == null) { - return false; - } - - boolean didCreate = - new CreateRoleAttachedTargetEffect(RoleType.MONSTER) - .setTargetPointer(new FixedTarget(target, game)) - .apply(game, source); - if (!didCreate) { + if (target == null || !RoleType.MONSTER.createToken(target, game, source).getLastAddedTokenIds().isEmpty()) { return false; } ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility( - new CurseOfTheWerefoxFightEffect(), false, - "that creature fights up to one target creature you don't control" + new CurseOfTheWerefoxFightEffect().setTargetPointer(new FixedTarget(target.getId(), game)), + false, "that creature fights up to one target creature you don't control" ); - ability.getEffects().setTargetPointer(new FixedTarget(target.getId(), game)); - ability.addTarget(new TargetCreaturePermanent(0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL, false)); + ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL)); game.fireReflexiveTriggeredAbility(ability, source); return true; } diff --git a/Mage.Sets/src/mage/cards/c/Cytoshape.java b/Mage.Sets/src/mage/cards/c/Cytoshape.java index bbbed0cfc4d..fb6807cd653 100644 --- a/Mage.Sets/src/mage/cards/c/Cytoshape.java +++ b/Mage.Sets/src/mage/cards/c/Cytoshape.java @@ -1,4 +1,3 @@ - package mage.cards.c; import mage.abilities.Ability; @@ -14,26 +13,22 @@ import mage.filter.predicate.Predicates; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.Target; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import mage.util.functions.EmptyCopyApplier; import java.util.UUID; /** - * * @author jeffwadsworth */ public final class Cytoshape extends CardImpl { - public Cytoshape(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{G}{U}"); // Choose a nonlegendary creature on the battlefield. Target creature becomes a copy of that creature until end of turn. this.getSpellAbility().addEffect(new CytoshapeEffect()); - - FilterCreaturePermanent filter = new FilterCreaturePermanent("target creature that will become a copy"); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); + this.getSpellAbility().addTarget(new TargetPermanent().withChooseHint("to become a copy")); } private Cytoshape(final Cytoshape card) { @@ -53,9 +48,11 @@ class CytoshapeEffect extends OneShotEffect { static { filter.add(Predicates.not(SuperType.LEGENDARY.getPredicate())); } + CytoshapeEffect() { super(Outcome.Copy); - this.staticText = "Choose a nonlegendary creature on the battlefield. Target creature becomes a copy of that creature until end of turn."; + this.staticText = "Choose a nonlegendary creature on the battlefield. " + + "Target creature becomes a copy of that creature until end of turn."; } private CytoshapeEffect(final CytoshapeEffect effect) { @@ -69,7 +66,7 @@ class CytoshapeEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability ability) { - Target target = new TargetCreaturePermanent(1, 1, filter, true); + Target target = new TargetPermanent(1, 1, filter, true); target.choose(Outcome.Copy, ability.getControllerId(), ability, game); Permanent copyFrom = game.getPermanent(target.getFirstTarget()); if (copyFrom != null) { diff --git a/Mage.Sets/src/mage/cards/d/DeadRingers.java b/Mage.Sets/src/mage/cards/d/DeadRingers.java index 125edf0b560..ba6077eea68 100644 --- a/Mage.Sets/src/mage/cards/d/DeadRingers.java +++ b/Mage.Sets/src/mage/cards/d/DeadRingers.java @@ -1,19 +1,22 @@ package mage.cards.d; -import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.Outcome; import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.target.Target; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; + +import java.util.List; +import java.util.Objects; +import java.util.UUID; +import java.util.stream.Collectors; /** - * * @author LoneFox */ public final class DeadRingers extends CardImpl { @@ -23,7 +26,7 @@ public final class DeadRingers extends CardImpl { // Destroy two target nonblack creatures unless either one is a color the other isn't. They can't be regenerated. this.getSpellAbility().addEffect(new DeadRingersEffect()); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(2, 2, StaticFilters.FILTER_PERMANENT_CREATURE_NON_BLACK, false)); + this.getSpellAbility().addTarget(new TargetPermanent(2, StaticFilters.FILTER_PERMANENT_CREATURE_NON_BLACK)); } private DeadRingers(final DeadRingers card) { @@ -36,11 +39,11 @@ public final class DeadRingers extends CardImpl { } } -class DeadRingersEffect extends DestroyTargetEffect { +class DeadRingersEffect extends OneShotEffect { DeadRingersEffect() { - super(true); - staticText = "Destroy two target nonblack creatures unless either one is a color the other isn't. They can't be regenerated."; + super(Outcome.DestroyPermanent); + staticText = "destroy two target nonblack creatures unless either one is a color the other isn't. They can't be regenerated."; } private DeadRingersEffect(final DeadRingersEffect effect) { @@ -54,17 +57,23 @@ class DeadRingersEffect extends DestroyTargetEffect { @Override public boolean apply(Game game, Ability source) { - Target target = source.getTargets().get(0); - if (target != null - && target.getTargets().size() > 1) { - Permanent first = game.getPermanentOrLKIBattlefield(target.getTargets().get(0)); - Permanent second = game.getPermanentOrLKIBattlefield(target.getTargets().get(1)); - if (first != null - && second != null - && first.getColor(game).equals(second.getColor(game))) { - return super.apply(game, source); - } + List permanents = this + .getTargetPointer() + .getTargets(game, source) + .stream() + .map(game::getPermanent) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + if (permanents.size() < 2) { + return false; } - return false; + Permanent first = permanents.get(0); + Permanent second = permanents.get(1); + if (!first.getColor(game).equals(second.getColor(game))) { + return false; + } + first.destroy(source, game, true); + second.destroy(source, game, true); + return true; } } diff --git a/Mage.Sets/src/mage/cards/d/DecimatorBeetle.java b/Mage.Sets/src/mage/cards/d/DecimatorBeetle.java index 29e3b1a0b2e..1b0d6459c4c 100644 --- a/Mage.Sets/src/mage/cards/d/DecimatorBeetle.java +++ b/Mage.Sets/src/mage/cards/d/DecimatorBeetle.java @@ -18,8 +18,8 @@ import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.DefendingPlayerControlsSourceAttackingPredicate; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; import mage.target.common.TargetControlledCreaturePermanent; -import mage.target.common.TargetCreaturePermanent; import mage.target.targetpointer.FixedTarget; import java.util.UUID; @@ -51,7 +51,7 @@ public final class DecimatorBeetle extends CardImpl { // Whenever Decimator Beetle attacks, remove a -1/-1 counter from target creature you control and put a -1/-1 counter on up to one target creature defending player controls. ability = new AttacksTriggeredAbility(new DecimatorBeetleEffect(), false); ability.addTarget(new TargetControlledCreaturePermanent()); - ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false)); + ability.addTarget(new TargetPermanent(0, 1, filter)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/d/DihadaBinderOfWills.java b/Mage.Sets/src/mage/cards/d/DihadaBinderOfWills.java index 9ea7e36b145..dc1696e2297 100644 --- a/Mage.Sets/src/mage/cards/d/DihadaBinderOfWills.java +++ b/Mage.Sets/src/mage/cards/d/DihadaBinderOfWills.java @@ -19,7 +19,7 @@ import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.token.TreasureToken; import mage.players.Player; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import java.util.UUID; @@ -51,7 +51,7 @@ public final class DihadaBinderOfWills extends CardImpl { ability.addEffect(new GainAbilityTargetEffect( IndestructibleAbility.getInstance(), Duration.UntilYourNextTurn ).setText(", and indestructible until your next turn.")); - ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false)); + ability.addTarget(new TargetPermanent(0, 1, filter)); this.addAbility(ability); // -3: Reveal the top four cards of your library. diff --git a/Mage.Sets/src/mage/cards/d/DissensionInTheRanks.java b/Mage.Sets/src/mage/cards/d/DissensionInTheRanks.java index 5c3567832f9..0aea464bfd5 100644 --- a/Mage.Sets/src/mage/cards/d/DissensionInTheRanks.java +++ b/Mage.Sets/src/mage/cards/d/DissensionInTheRanks.java @@ -1,7 +1,5 @@ - package mage.cards.d; -import java.util.UUID; import mage.abilities.effects.common.FightTargetsEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -9,35 +7,31 @@ import mage.constants.CardType; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.other.AnotherTargetPredicate; import mage.filter.predicate.permanent.BlockingPredicate; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; + +import java.util.UUID; /** - * * @author LevelX2 */ public final class DissensionInTheRanks extends CardImpl { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("blocking creature"); + private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent("another target blocking creature"); static { filter.add(BlockingPredicate.instance); + filter2.add(new AnotherTargetPredicate(2)); + filter2.add(BlockingPredicate.instance); } public DissensionInTheRanks(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{3}{R}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{R}{R}"); // Target blocking creature fights another target blocking creature. this.getSpellAbility().addEffect(new FightTargetsEffect(false)); - TargetCreaturePermanent target = new TargetCreaturePermanent(1, 1, filter, false); - target.setTargetTag(1); - this.getSpellAbility().addTarget(target); - - FilterCreaturePermanent filter2 = new FilterCreaturePermanent("another target blocking creature"); - filter2.add(new AnotherTargetPredicate(2)); - filter2.add(BlockingPredicate.instance); - TargetCreaturePermanent target2 = new TargetCreaturePermanent(filter2); - target2.setTargetTag(2); - this.getSpellAbility().addTarget(target2); + this.getSpellAbility().addTarget(new TargetPermanent(filter).setTargetTag(1)); + this.getSpellAbility().addTarget(new TargetPermanent(filter2).setTargetTag(2)); } private DissensionInTheRanks(final DissensionInTheRanks card) { diff --git a/Mage.Sets/src/mage/cards/d/DoOrDie.java b/Mage.Sets/src/mage/cards/d/DoOrDie.java index 0b95336936b..3eb90a3df48 100644 --- a/Mage.Sets/src/mage/cards/d/DoOrDie.java +++ b/Mage.Sets/src/mage/cards/d/DoOrDie.java @@ -12,21 +12,20 @@ import mage.filter.predicate.permanent.ControllerIdPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.target.TargetPermanent; import mage.target.TargetPlayer; -import mage.target.common.TargetCreaturePermanent; import java.util.ArrayList; import java.util.List; import java.util.UUID; /** - * * @author fireshoes */ public final class DoOrDie extends CardImpl { public DoOrDie(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{1}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}"); // Separate all creatures target player controls into two piles. Destroy all creatures in the pile of that player's choice. They can't be regenerated. this.getSpellAbility().addEffect(new DoOrDieEffect()); @@ -68,7 +67,7 @@ class DoOrDieEffect extends OneShotEffect { } FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures to put in the first pile"); filter.add(new ControllerIdPredicate(targetPlayer.getId())); - TargetCreaturePermanent creatures = new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, true); + TargetPermanent creatures = new TargetPermanent(0, Integer.MAX_VALUE, filter, true); List pile1 = new ArrayList<>(); if (player.choose(Outcome.Neutral, creatures, source, game)) { List targets = creatures.getTargets(); diff --git a/Mage.Sets/src/mage/cards/d/DomineeringWill.java b/Mage.Sets/src/mage/cards/d/DomineeringWill.java index 50e0a160ae4..f003a3215e4 100644 --- a/Mage.Sets/src/mage/cards/d/DomineeringWill.java +++ b/Mage.Sets/src/mage/cards/d/DomineeringWill.java @@ -1,7 +1,5 @@ - package mage.cards.d; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.Effect; @@ -20,12 +18,13 @@ import mage.filter.predicate.Predicates; import mage.filter.predicate.permanent.AttackingPredicate; import mage.game.Game; import mage.players.Player; +import mage.target.TargetPermanent; import mage.target.TargetPlayer; -import mage.target.common.TargetCreaturePermanent; import mage.target.targetpointer.SecondTargetPointer; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class DomineeringWill extends CardImpl { @@ -37,13 +36,12 @@ public final class DomineeringWill extends CardImpl { } public DomineeringWill(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{3}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{U}"); // Target player gains control of up to three target nonattacking creatures until end of turn. Untap those creatures. They block this turn if able. this.getSpellAbility().addEffect(new DomineeringWillEffect()); this.getSpellAbility().addTarget(new TargetPlayer()); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 3, filter, false)); - + this.getSpellAbility().addTarget(new TargetPermanent(0, 3, filter)); } private DomineeringWill(final DomineeringWill card) { diff --git a/Mage.Sets/src/mage/cards/d/Duneblast.java b/Mage.Sets/src/mage/cards/d/Duneblast.java index 606fdd89e55..618331f9450 100644 --- a/Mage.Sets/src/mage/cards/d/Duneblast.java +++ b/Mage.Sets/src/mage/cards/d/Duneblast.java @@ -1,8 +1,5 @@ - package mage.cards.d; -import java.util.Objects; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; @@ -10,26 +7,24 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.filter.StaticFilters; -import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.Target; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class Duneblast extends CardImpl { public Duneblast(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{4}{W}{B}{G}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{W}{B}{G}"); // Choose up to one creature. Destroy the rest. this.getSpellAbility().addEffect(new DuneblastEffect()); - } private Duneblast(final Duneblast card) { @@ -61,20 +56,22 @@ class DuneblastEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - Target target = new TargetCreaturePermanent(0,1,new FilterCreaturePermanent("creature to keep"), true); - target.setRequired(true); - Permanent creatureToKeep = null; - if (controller.choose(outcome, target, source, game)) { - creatureToKeep = game.getPermanent(target.getFirstTarget()); - } - for(Permanent creature: game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURES, source.getControllerId(), source, game)) { - if (!Objects.equals(creature, creatureToKeep)) { - creature.destroy(source, game, false); - } - } - return true; + if (controller == null) { + return false; } - return false; + Target target = new TargetCreaturePermanent(0, 1); + target.withNotTarget(true); + target.withChooseHint("to keep"); + target.setRequired(true); + controller.choose(outcome, target, source, game); + Permanent creatureToKeep = game.getPermanent(target.getFirstTarget()); + for (Permanent creature : game.getBattlefield().getActivePermanents( + StaticFilters.FILTER_PERMANENT_CREATURES, source.getControllerId(), source, game + )) { + if (!creature.equals(creatureToKeep)) { + creature.destroy(source, game, false); + } + } + return true; } } diff --git a/Mage.Sets/src/mage/cards/f/FallOfTheImpostor.java b/Mage.Sets/src/mage/cards/f/FallOfTheImpostor.java index 03896538e0a..b99c4a83d8e 100644 --- a/Mage.Sets/src/mage/cards/f/FallOfTheImpostor.java +++ b/Mage.Sets/src/mage/cards/f/FallOfTheImpostor.java @@ -1,16 +1,16 @@ package mage.cards.f; -import java.util.List; -import java.util.UUID; - +import mage.MageInt; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SagaAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; -import mage.constants.*; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.*; import mage.counters.CounterType; +import mage.filter.FilterPermanent; import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.PowerPredicate; @@ -18,11 +18,14 @@ import mage.filter.predicate.permanent.ControllerIdPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetOpponent; +import java.util.List; +import java.util.UUID; + /** - * * @author weirddan455 */ public final class FallOfTheImpostor extends CardImpl { @@ -77,33 +80,35 @@ class FallOfTheImpostorEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - Player opponent = game.getPlayer(source.getFirstTarget()); - if (controller != null && opponent != null) { - List permanents = game.getBattlefield().getAllActivePermanents( - StaticFilters.FILTER_PERMANENT_CREATURE, opponent.getId(), game - ); - Integer maxPower = null; - for (Permanent permanent : permanents) { - if (permanent != null) { - int power = permanent.getPower().getValue(); - if (maxPower == null || power > maxPower) { - maxPower = power; - } - } - } - if (maxPower != null) { - FilterCreaturePermanent filter = new FilterCreaturePermanent(); - filter.add(new ControllerIdPredicate(opponent.getId())); - filter.add(new PowerPredicate(ComparisonType.EQUAL_TO, maxPower)); - TargetCreaturePermanent target = new TargetCreaturePermanent(1, 1, filter, true); - controller.chooseTarget(outcome, target, source, game); - Permanent permanent = game.getPermanent(target.getFirstTarget()); - if (permanent != null) { - controller.moveCardsToExile(permanent, source, game, true, null, null); - return true; - } - } + Player opponent = game.getPlayer(getTargetPointer().getFirst(game, source)); + if (controller == null || opponent == null) { + return false; } - return false; + List permanents = game.getBattlefield().getActivePermanents( + StaticFilters.FILTER_CONTROLLED_CREATURE, opponent.getId(), game + ); + Permanent permanent; + switch (permanents.size()) { + case 0: + return false; + case 1: + permanent = permanents.get(0); + break; + default: + int power = permanents + .stream() + .map(MageObject::getPower) + .mapToInt(MageInt::getValue) + .max() + .orElse(Integer.MIN_VALUE); + FilterPermanent filter = new FilterCreaturePermanent(); + filter.add(new ControllerIdPredicate(opponent.getId())); + filter.add(new PowerPredicate(ComparisonType.OR_GREATER, power)); + TargetPermanent target = new TargetPermanent(filter); + target.withNotTarget(true); + controller.chooseTarget(outcome, target, source, game); + permanent = game.getPermanent(target.getFirstTarget()); + } + return permanent != null && controller.moveCards(permanent, Zone.EXILED, source, game); } } diff --git a/Mage.Sets/src/mage/cards/f/FeralEncounter.java b/Mage.Sets/src/mage/cards/f/FeralEncounter.java index 26c9885fb88..fc5c85bc6fe 100644 --- a/Mage.Sets/src/mage/cards/f/FeralEncounter.java +++ b/Mage.Sets/src/mage/cards/f/FeralEncounter.java @@ -17,8 +17,8 @@ import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.GameEvent; import mage.players.Player; +import mage.target.TargetPermanent; import mage.target.common.TargetControlledCreaturePermanent; -import mage.target.common.TargetCreaturePermanent; import mage.util.CardUtil; import java.util.UUID; @@ -36,7 +36,7 @@ public final class FeralEncounter extends CardImpl { DelayedTriggeredAbility delayed = new FeralEncounterDelayedTriggeredAbility(); delayed.addTarget(new TargetControlledCreaturePermanent()); - delayed.addTarget(new TargetCreaturePermanent(0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL, false)); + delayed.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL)); this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(delayed)); } diff --git a/Mage.Sets/src/mage/cards/f/FightOrFlight.java b/Mage.Sets/src/mage/cards/f/FightOrFlight.java index 55a1bcd9a6a..2a1a4f5ed9d 100644 --- a/Mage.Sets/src/mage/cards/f/FightOrFlight.java +++ b/Mage.Sets/src/mage/cards/f/FightOrFlight.java @@ -1,9 +1,9 @@ package mage.cards.f; import mage.abilities.Ability; -import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.combat.CantAttackAllEffect; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -18,7 +18,7 @@ import mage.filter.predicate.permanent.PermanentReferenceInCollectionPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import java.util.ArrayList; import java.util.List; @@ -26,13 +26,12 @@ import java.util.UUID; import java.util.stream.Collectors; /** - * * @author LevelX2 & L_J */ public final class FightOrFlight extends CardImpl { public FightOrFlight(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}"); // At the beginning of combat on each opponent’s turn, separate all creatures that player controls into two piles. Only creatures in the pile of their choice can attack this turn. this.addAbility(new BeginningOfCombatTriggeredAbility(TargetController.OPPONENT, new FightOrFlightEffect(), false)); @@ -73,7 +72,7 @@ class FightOrFlightEffect extends OneShotEffect { } FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures to put in the first pile"); filter.add(new ControllerIdPredicate(targetPlayer.getId())); - TargetCreaturePermanent creatures = new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, true); + TargetPermanent creatures = new TargetPermanent(0, Integer.MAX_VALUE, filter, true); List pile1 = new ArrayList<>(); if (player.choose(Outcome.Neutral, creatures, source, game)) { List targets = creatures.getTargets(); diff --git a/Mage.Sets/src/mage/cards/f/FleetingReflection.java b/Mage.Sets/src/mage/cards/f/FleetingReflection.java index 6f0fa97ed61..406ecddfbae 100644 --- a/Mage.Sets/src/mage/cards/f/FleetingReflection.java +++ b/Mage.Sets/src/mage/cards/f/FleetingReflection.java @@ -10,12 +10,11 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.other.AnotherTargetPredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; import mage.target.common.TargetControlledCreaturePermanent; -import mage.target.common.TargetCreaturePermanent; import mage.util.functions.EmptyCopyApplier; import java.util.UUID; @@ -25,18 +24,14 @@ import java.util.UUID; */ public final class FleetingReflection extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other target creature"); - - static { - filter.add(new AnotherTargetPredicate(2)); - } - public FleetingReflection(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}"); // Target creature you control gains hexproof until end of turn. Untap that creature. Until end of turn, it becomes a copy of up to one other target creature. this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent().setTargetTag(1)); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1, filter, false).setTargetTag(2)); + this.getSpellAbility().addTarget(new TargetPermanent( + 0, 1, StaticFilters.FILTER_ANOTHER_CREATURE_TARGET_2 + ).setTargetTag(2)); this.getSpellAbility().addEffect(new GainAbilityTargetEffect(HexproofAbility.getInstance(), Duration.EndOfTurn)); this.getSpellAbility().addEffect(new UntapTargetEffect().setText("Untap that creature")); this.getSpellAbility().addEffect(new FleetingReflectionEffect()); diff --git a/Mage.Sets/src/mage/cards/f/Forcefield.java b/Mage.Sets/src/mage/cards/f/Forcefield.java index 598a204c83b..8ef14e236d8 100644 --- a/Mage.Sets/src/mage/cards/f/Forcefield.java +++ b/Mage.Sets/src/mage/cards/f/Forcefield.java @@ -1,6 +1,5 @@ package mage.cards.f; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -13,7 +12,6 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; -import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.UnblockedPredicate; import mage.game.Game; @@ -21,11 +19,12 @@ import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.Target; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import mage.target.targetpointer.FixedTarget; +import java.util.UUID; + /** - * * @author emerald000 */ public final class Forcefield extends CardImpl { @@ -74,7 +73,7 @@ class ForcefieldEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = source.getSourceObject(game); if (controller != null && sourceObject != null) { - Target target = new TargetCreaturePermanent(1, 1, filter, true); + Target target = new TargetPermanent(1, 1, filter, true); if (controller.choose(Outcome.PreventDamage, target, source, game)) { Permanent creature = game.getPermanent(target.getFirstTarget()); if (creature != null) { diff --git a/Mage.Sets/src/mage/cards/f/ForgottenAncient.java b/Mage.Sets/src/mage/cards/f/ForgottenAncient.java index 748b0db0823..6256a3ffe3c 100644 --- a/Mage.Sets/src/mage/cards/f/ForgottenAncient.java +++ b/Mage.Sets/src/mage/cards/f/ForgottenAncient.java @@ -2,22 +2,24 @@ package mage.cards.f; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SpellCastAllTriggeredAbility; -import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; import mage.counters.CounterType; +import mage.filter.FilterPermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.AnotherPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.Target; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import java.util.ArrayList; import java.util.List; @@ -35,9 +37,9 @@ public final class ForgottenAncient extends CardImpl { this.toughness = new MageInt(3); // Whenever a player casts a spell, you may put a +1/+1 counter on Forgotten Ancient. - Effect effect = new AddCountersSourceEffect(CounterType.P1P1.createInstance()); - Ability ability = new SpellCastAllTriggeredAbility(effect, true); - this.addAbility(ability); + this.addAbility(new SpellCastAllTriggeredAbility( + new AddCountersSourceEffect(CounterType.P1P1.createInstance()), true + )); // At the beginning of your upkeep, you may move any number of +1/+1 counters from Forgotten Ancient onto other creatures. this.addAbility(new BeginningOfUpkeepTriggeredAbility(new ForgottenAncientEffect(), true)); @@ -56,7 +58,7 @@ public final class ForgottenAncient extends CardImpl { class ForgottenAncientEffect extends OneShotEffect { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature"); + private static final FilterPermanent filter = new FilterCreaturePermanent("another creature"); static { filter.add(AnotherPredicate.instance); @@ -98,7 +100,7 @@ class ForgottenAncientEffect extends OneShotEffect { List counterMovements = new ArrayList<>(); do { - Target target = new TargetCreaturePermanent(1, 1, filter, true); + Target target = new TargetPermanent(1, 1, filter, true); if (!target.canChoose(controller.getId(), source, game)) { break; } diff --git a/Mage.Sets/src/mage/cards/f/Fumble.java b/Mage.Sets/src/mage/cards/f/Fumble.java index e53fb2e3d89..b0ddcaa6973 100644 --- a/Mage.Sets/src/mage/cards/f/Fumble.java +++ b/Mage.Sets/src/mage/cards/f/Fumble.java @@ -1,8 +1,5 @@ package mage.cards.f; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; @@ -14,7 +11,6 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.SubType; -import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -22,8 +18,11 @@ import mage.target.Target; import mage.target.common.TargetCreaturePermanent; import mage.target.targetpointer.FixedTarget; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class Fumble extends CardImpl { @@ -80,11 +79,12 @@ class FumbleEffect extends OneShotEffect { } } } - + new ReturnToHandTargetEffect().apply(game, source); if (!attachments.isEmpty()) { - Target target = new TargetCreaturePermanent(1, 1, StaticFilters.FILTER_PERMANENT_CREATURE, true); + Target target = new TargetCreaturePermanent(); + target.withNotTarget(true); Permanent newCreature = null; if (player.choose(Outcome.BoostCreature, target, source, game)) { newCreature = game.getPermanent(target.getFirstTarget()); diff --git a/Mage.Sets/src/mage/cards/g/GargosViciousWatcher.java b/Mage.Sets/src/mage/cards/g/GargosViciousWatcher.java index 40e324de19b..abbc020b067 100644 --- a/Mage.Sets/src/mage/cards/g/GargosViciousWatcher.java +++ b/Mage.Sets/src/mage/cards/g/GargosViciousWatcher.java @@ -15,7 +15,7 @@ import mage.constants.SubType; import mage.constants.SuperType; import mage.filter.FilterCard; import mage.filter.StaticFilters; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import java.util.UUID; @@ -45,10 +45,11 @@ public final class GargosViciousWatcher extends CardImpl { this.addAbility(new SimpleStaticAbility(new SpellsCostReductionControllerEffect(filter, 4))); // Whenever a creature you control becomes the target of a spell, Gargos, Vicious Watcher fights up to one target creature you don't control. - TriggeredAbility ability = new BecomesTargetAnyTriggeredAbility(new FightTargetSourceEffect(), - StaticFilters.FILTER_CONTROLLED_A_CREATURE, StaticFilters.FILTER_SPELL_A, - SetTargetPointer.NONE, false); - ability.addTarget(new TargetCreaturePermanent(0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL, false)); + TriggeredAbility ability = new BecomesTargetAnyTriggeredAbility( + new FightTargetSourceEffect(), StaticFilters.FILTER_CONTROLLED_A_CREATURE, + StaticFilters.FILTER_SPELL_A, SetTargetPointer.NONE, false + ); + ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/g/GideonBattleForged.java b/Mage.Sets/src/mage/cards/g/GideonBattleForged.java index dc1422b1aa1..a2adb7e3c1a 100644 --- a/Mage.Sets/src/mage/cards/g/GideonBattleForged.java +++ b/Mage.Sets/src/mage/cards/g/GideonBattleForged.java @@ -18,6 +18,7 @@ import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.TokenImpl; +import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -46,7 +47,7 @@ public final class GideonBattleForged extends CardImpl { // +2: Up to one target creature an opponent controls attacks Gideon, Battle-Forged during its controller's next turn if able. LoyaltyAbility loyaltyAbility = new LoyaltyAbility(new GideonBattleForgedAttacksIfAbleTargetEffect(Duration.Custom), 2); - loyaltyAbility.addTarget(new TargetCreaturePermanent(0, 1, filter, false)); + loyaltyAbility.addTarget(new TargetPermanent(0, 1, filter)); this.addAbility(loyaltyAbility); // +1: Until your next turn, target creature gains indestructible. Untap that creature. diff --git a/Mage.Sets/src/mage/cards/g/GildedDrake.java b/Mage.Sets/src/mage/cards/g/GildedDrake.java index 20c836ec93d..07a9862b066 100644 --- a/Mage.Sets/src/mage/cards/g/GildedDrake.java +++ b/Mage.Sets/src/mage/cards/g/GildedDrake.java @@ -1,7 +1,5 @@ - package mage.cards.g; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; @@ -12,17 +10,17 @@ import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; import mage.constants.Outcome; -import mage.filter.StaticFilters; +import mage.constants.SubType; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; -import mage.target.common.TargetCreaturePermanent; +import mage.target.common.TargetOpponentsCreaturePermanent; + +import java.util.UUID; /** - * * @author LevelX2 */ public final class GildedDrake extends CardImpl { @@ -36,11 +34,12 @@ public final class GildedDrake extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); + // When Gilded Drake enters the battlefield, exchange control of Gilded Drake and up to one target creature an opponent controls. If you don't make an exchange, sacrifice Gilded Drake. // This ability can't be countered except by spells and abilities. Ability ability = new EntersBattlefieldTriggeredAbility(new GildedDrakeEffect()); ability.setCanFizzle(false); - ability.addTarget(new TargetCreaturePermanent(0, 1, StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE, false)); + ability.addTarget(new TargetOpponentsCreaturePermanent(0, 1)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/g/GrindDust.java b/Mage.Sets/src/mage/cards/g/GrindDust.java index 38b34a7fc46..7f11a2d869d 100644 --- a/Mage.Sets/src/mage/cards/g/GrindDust.java +++ b/Mage.Sets/src/mage/cards/g/GrindDust.java @@ -1,8 +1,5 @@ - package mage.cards.g; -import java.util.UUID; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.ExileTargetEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.abilities.keyword.AftermathAbility; @@ -11,34 +8,40 @@ import mage.cards.SplitCard; import mage.constants.CardType; import mage.constants.SpellAbilityType; import mage.counters.CounterType; +import mage.filter.FilterPermanent; import mage.filter.common.FilterCreaturePermanent; +import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class GrindDust extends SplitCard { + private static final FilterPermanent filter = new FilterCreaturePermanent("creatures that have -1/-1 counters on them"); + + static { + filter.add(CounterType.M1M1.getPredicate()); + } + public GrindDust(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, new CardType[]{CardType.SORCERY}, "{1}{B}", "{3}{W}", SpellAbilityType.SPLIT_AFTERMATH); // Grind // Put a -1/-1 counter on each of up to two target creatures. - Effect effect = new AddCountersTargetEffect(CounterType.M1M1.createInstance()); - effect.setText("Put a -1/-1 counter on each of up to two target creatures"); - getLeftHalfCard().getSpellAbility().addEffect(effect); - getLeftHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2)); + this.getLeftHalfCard().getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.M1M1.createInstance()) + .setText("Put a -1/-1 counter on each of up to two target creatures")); + this.getLeftHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2)); // Dust // Aftermath - getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true)); - // Exile any number of target creatures that have -1/-1 counters on them. - getRightHalfCard().getSpellAbility().addEffect(new ExileTargetEffect()); - FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures that have -1/-1 counters on them"); - filter.add(CounterType.M1M1.getPredicate()); - getRightHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, false)); + this.getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true)); + // Exile any number of target creatures that have -1/-1 counters on them. + this.getRightHalfCard().getSpellAbility().addEffect(new ExileTargetEffect()); + this.getRightHalfCard().getSpellAbility().addTarget(new TargetPermanent(0, Integer.MAX_VALUE, filter)); } private GrindDust(final GrindDust card) { diff --git a/Mage.Sets/src/mage/cards/h/HostileTakeover.java b/Mage.Sets/src/mage/cards/h/HostileTakeover.java index 1f46d00b90b..58bc4554208 100644 --- a/Mage.Sets/src/mage/cards/h/HostileTakeover.java +++ b/Mage.Sets/src/mage/cards/h/HostileTakeover.java @@ -1,7 +1,5 @@ package mage.cards.h; -import java.util.UUID; - import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.effects.common.continuous.SetBasePowerToughnessTargetEffect; import mage.cards.CardImpl; @@ -9,41 +7,33 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.filter.StaticFilters; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.other.AnotherTargetPredicate; +import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; import mage.target.targetpointer.SecondTargetPointer; +import java.util.UUID; + /** - * * @author weirddan455 */ public final class HostileTakeover extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other target creature"); - - static { - filter.add(new AnotherTargetPredicate(2)); - } - public HostileTakeover(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{U}{B}{R}"); // Up to one target creature has base power and toughness 1/1 until end of turn. Up to one other target creature has base power and toughness 4/4 until end of turn. Then Hostile Takeover deals 3 damage to each creature. this.getSpellAbility().addEffect(new SetBasePowerToughnessTargetEffect(1, 1, Duration.EndOfTurn)); - TargetCreaturePermanent target1 = new TargetCreaturePermanent(0, 1); - target1.setTargetTag(1); - this.getSpellAbility().addTarget(target1.withChooseHint("1/1")); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1).setTargetTag(1).withChooseHint("1/1")); this.getSpellAbility().addEffect(new SetBasePowerToughnessTargetEffect(4, 4, Duration.EndOfTurn) .setTargetPointer(new SecondTargetPointer()) .setText("up to one other target creature has base power and toughness 4/4 until end of turn")); - TargetCreaturePermanent target2 = new TargetCreaturePermanent(0, 1, filter, false); - target2.setTargetTag(2); - this.getSpellAbility().addTarget(target2.withChooseHint("4/4")); - - this.getSpellAbility().addEffect(new DamageAllEffect(3, StaticFilters.FILTER_PERMANENT_CREATURE) - .concatBy("Then")); + this.getSpellAbility().addTarget(new TargetPermanent( + 0, 1, StaticFilters.FILTER_ANOTHER_CREATURE_TARGET_2 + ).setTargetTag(2).withChooseHint("4/4")); + this.getSpellAbility().addEffect(new DamageAllEffect( + 3, StaticFilters.FILTER_PERMANENT_CREATURE + ).concatBy("Then")); } private HostileTakeover(final HostileTakeover card) { diff --git a/Mage.Sets/src/mage/cards/h/HuatliDinosaurKnight.java b/Mage.Sets/src/mage/cards/h/HuatliDinosaurKnight.java index 32a647c58cf..006656415d0 100644 --- a/Mage.Sets/src/mage/cards/h/HuatliDinosaurKnight.java +++ b/Mage.Sets/src/mage/cards/h/HuatliDinosaurKnight.java @@ -7,10 +7,16 @@ import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.SuperType; import mage.counters.CounterType; +import mage.filter.FilterPermanent; import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterCreaturePermanent; +import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -20,14 +26,8 @@ import java.util.UUID; */ public final class HuatliDinosaurKnight extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Dinosaur you control"); - private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent("Dinosaurs"); - - static { - filter.add(SubType.DINOSAUR.getPredicate()); - filter.add(TargetController.YOU.getControllerPredicate()); - filter2.add(SubType.DINOSAUR.getPredicate()); - } + private static final FilterPermanent filter = new FilterControlledPermanent(SubType.DINOSAUR); + private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent(SubType.DINOSAUR, "Dinosaurs"); public HuatliDinosaurKnight(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{4}{R}{W}"); @@ -41,12 +41,12 @@ public final class HuatliDinosaurKnight extends CardImpl { Ability ability = new LoyaltyAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance(2)) .setText("Put two +1/+1 counters on up to one target Dinosaur you control."), 2 ); - ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false)); + ability.addTarget(new TargetPermanent(0, 1, filter)); this.addAbility(ability); // -3: Target Dinosaur you control deals damage equal to its power to target creature you don't control. ability = new LoyaltyAbility(new DamageWithPowerFromOneToAnotherTargetEffect(), -3); - ability.addTarget(new TargetCreaturePermanent(filter)); + ability.addTarget(new TargetPermanent(filter)); ability.addTarget(new TargetCreaturePermanent(StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/i/IdentityThief.java b/Mage.Sets/src/mage/cards/i/IdentityThief.java index 1a9ecce99c8..437f949029b 100644 --- a/Mage.Sets/src/mage/cards/i/IdentityThief.java +++ b/Mage.Sets/src/mage/cards/i/IdentityThief.java @@ -3,26 +3,26 @@ package mage.cards.i; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; -import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CopyEffect; import mage.abilities.effects.common.ReturnToBattlefieldUnderOwnerControlTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; import mage.filter.predicate.permanent.TokenPredicate; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.players.Player; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; import java.util.UUID; -import mage.abilities.effects.ContinuousEffect; -import mage.abilities.effects.common.CopyEffect; -import mage.util.CardUtil; /** * @author spjspj @@ -32,6 +32,7 @@ public final class IdentityThief extends CardImpl { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("target nontoken creature"); static { + filter.add(AnotherPredicate.instance); filter.add(TokenPredicate.FALSE); } @@ -44,8 +45,8 @@ public final class IdentityThief extends CardImpl { // Whenever Identity Thief attacks, you may exile another target nontoken creature. // If you do, Identity Thief becomes a copy of that creature until end of turn. // Return the exiled card to the battlefield under its owner's control at the beginning of the next end step. - Ability ability = new IdentityThiefAbility(); - ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false)); + Ability ability = new AttacksTriggeredAbility(new IdentityThiefEffect(), true); + ability.addTarget(new TargetPermanent(0, 1, filter)); this.addAbility(ability); } @@ -101,26 +102,28 @@ class IdentityThiefEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent targetPermanent = getTargetPointer().getFirstTargetPermanentOrLKI(game, source); Player controller = game.getPlayer(source.getControllerId()); - Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); - if (controller != null - && targetPermanent != null - && sourcePermanent != null) { - ContinuousEffect copyEffect = new CopyEffect(Duration.EndOfTurn, targetPermanent, source.getSourceId()); - copyEffect.setTargetPointer(new FixedTarget(sourcePermanent.getId(), game)); - game.addEffect(copyEffect, source); - - UUID exileZoneId = CardUtil.getExileZoneId(game, source.getSourceId(), source.getSourceObjectZoneChangeCounter()); - if (controller.moveCardsToExile(targetPermanent, source, game, true, exileZoneId, sourcePermanent.getName())) { - Effect effect = new ReturnToBattlefieldUnderOwnerControlTargetEffect(false, true); - effect.setText("Return the exiled card to the battlefield under its owner's control at the beginning of the next end step"); - effect.setTargetPointer(new FixedTarget(source.getFirstTarget(), game)); - game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect), source); - } - return true; + Permanent targetPermanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (controller == null || targetPermanent == null) { + return false; } - return false; + controller.moveCardsToExile( + targetPermanent, source, game, true, + CardUtil.getExileZoneId(game, source), + CardUtil.getSourceName(game, source) + ); + game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility( + new ReturnToBattlefieldUnderOwnerControlTargetEffect(false, true) + .setText("Return the exiled card to the battlefield under its owner's control at the beginning of the next end step") + .setTargetPointer(new FixedTarget(source.getFirstTarget(), game)) + ), source); + Permanent sourcePermanent = source.getSourcePermanentIfItStillExists(game); + if (sourcePermanent != null) { + game.addEffect(new CopyEffect( + Duration.EndOfTurn, targetPermanent, source.getSourceId() + ).setTargetPointer(new FixedTarget(sourcePermanent.getId(), game)), source); + } + return true; } @Override diff --git a/Mage.Sets/src/mage/cards/i/IllithidHarvester.java b/Mage.Sets/src/mage/cards/i/IllithidHarvester.java index 3819725e282..06027dad520 100644 --- a/Mage.Sets/src/mage/cards/i/IllithidHarvester.java +++ b/Mage.Sets/src/mage/cards/i/IllithidHarvester.java @@ -14,6 +14,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.SubType; +import mage.filter.FilterPermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicate; import mage.filter.predicate.Predicates; @@ -23,6 +24,7 @@ import mage.filter.predicate.permanent.TokenPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.Target; +import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; import mage.target.targetadjustment.XTargetsCountAdjuster; @@ -34,7 +36,7 @@ import java.util.UUID; */ public final class IllithidHarvester extends AdventureCard { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("tapped nontoken creatures"); + private static final FilterPermanent filter = new FilterCreaturePermanent("tapped nontoken creatures"); static { filter.add(TappedPredicate.TAPPED); @@ -50,7 +52,7 @@ public final class IllithidHarvester extends AdventureCard { // Ceremorphosis — When Illithid Harvester enters the battlefield, turn any number // of target tapped nontoken creatures face down. They're 2/2 Horror creatures. Ability ability = new EntersBattlefieldTriggeredAbility(new IllithidHarvesterEffect()); - ability.addTarget(new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, false)); + ability.addTarget(new TargetPermanent(0, Integer.MAX_VALUE, filter)); this.addAbility(ability.withFlavorWord("Ceremorphosis")); // Plant Tadpoles diff --git a/Mage.Sets/src/mage/cards/i/InfernalDenizen.java b/Mage.Sets/src/mage/cards/i/InfernalDenizen.java index 1f2ce602ea9..8b9b07987c2 100644 --- a/Mage.Sets/src/mage/cards/i/InfernalDenizen.java +++ b/Mage.Sets/src/mage/cards/i/InfernalDenizen.java @@ -1,40 +1,36 @@ package mage.cards.i; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.condition.common.SourceOnBattlefieldCondition; -import mage.abilities.condition.common.SourceRemainsInZoneCondition; +import mage.abilities.costs.Cost; +import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.decorator.ConditionalContinuousEffect; -import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; -import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.SacrificeControllerEffect; import mage.abilities.effects.common.continuous.GainControlTargetEffect; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.SubType; -import mage.constants.TargetController; -import mage.constants.Zone; import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.ControllerIdPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.target.TargetPermanent; +import mage.target.TargetPlayer; import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetOpponent; import mage.target.targetpointer.FixedTarget; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class InfernalDenizen extends CardImpl { @@ -50,11 +46,11 @@ public final class InfernalDenizen extends CardImpl { this.addAbility(new BeginningOfUpkeepTriggeredAbility(new InfernalDenizenEffect())); // {tap}: Gain control of target creature for as long as Infernal Denizen remains on the battlefield. - ConditionalContinuousEffect effect = new ConditionalContinuousEffect( - new GainControlTargetEffect(Duration.Custom, true), - new SourceRemainsInZoneCondition(Zone.BATTLEFIELD), - "gain control of target creature for as long as {this} remains on the battlefield"); - Ability ability = new SimpleActivatedAbility(effect, new TapSourceCost()); + Ability ability = new SimpleActivatedAbility( + new GainControlTargetEffect(Duration.UntilSourceLeavesBattlefield, true) + .setText("gain control of target creature for as long as {this} remains on the battlefield"), + new TapSourceCost() + ); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } @@ -71,12 +67,7 @@ public final class InfernalDenizen extends CardImpl { class InfernalDenizenEffect extends OneShotEffect { - private static final FilterPermanent filter = new FilterPermanent(); - - static { - filter.add(SubType.SWAMP.getPredicate()); - filter.add(TargetController.YOU.getControllerPredicate()); - } + private static final FilterPermanent filter = new FilterControlledPermanent(SubType.SWAMP); InfernalDenizenEffect() { super(Outcome.Benefit); @@ -96,41 +87,36 @@ class InfernalDenizenEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent creature = game.getPermanent(source.getSourceId()); - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - DynamicValue swamps = new PermanentsOnBattlefieldCount(filter); - boolean canSac = swamps.calculate(game, source, this) > 1; - Effect effect = new SacrificeControllerEffect(filter, 2, "Sacrifice two Swamps"); - effect.apply(game, source); - if (!canSac) { - if (creature != null) { - creature.tap(source, game); - } - TargetOpponent targetOpp = new TargetOpponent(true); - if (targetOpp.canChoose(player.getId(), source, game) - && targetOpp.choose(Outcome.Detriment, player.getId(), source.getSourceId(), source, game)) { - Player opponent = game.getPlayer(targetOpp.getFirstTarget()); - if (opponent != null) { - FilterCreaturePermanent filter2 = new FilterCreaturePermanent("creature controlled by " + player.getLogName()); - filter2.add(new ControllerIdPredicate(player.getId())); - TargetCreaturePermanent targetCreature = new TargetCreaturePermanent(1, 1, filter2, true); - targetCreature.setTargetController(opponent.getId()); - if (targetCreature.canChoose(source.getControllerId(), source, game) - && opponent.chooseUse(Outcome.GainControl, "Gain control of a creature?", source, game) - && opponent.chooseTarget(Outcome.GainControl, targetCreature, source, game)) { - ConditionalContinuousEffect giveEffect = new ConditionalContinuousEffect( - new GainControlTargetEffect(Duration.Custom, true, opponent.getId()), - SourceOnBattlefieldCondition.instance, - ""); - giveEffect.setTargetPointer(new FixedTarget(targetCreature.getFirstTarget(), game)); - game.addEffect(giveEffect, source); - return true; - } - } - } - } + Cost cost = new SacrificeTargetCost(filter); + if (cost.canPay(source, source, source.getControllerId(), game) + && cost.pay(source, game, source, source.getControllerId(), true)) { + return true; } - return false; + Permanent creature = source.getSourcePermanentIfItStillExists(game); + if (creature == null) { + return false; + } + creature.tap(source, game); + TargetPlayer targetPlayer = new TargetOpponent(true); + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return true; + } + player.choose(outcome, targetPlayer, source, game); + Player opponent = game.getPlayer(targetPlayer.getFirstTarget()); + if (opponent == null) { + return true; + } + FilterPermanent filterPermanent = new FilterCreaturePermanent("creature controlled by " + player.getName()); + filterPermanent.add(new ControllerIdPredicate(player.getId())); + TargetPermanent target = new TargetPermanent(0, 1, filterPermanent, true); + opponent.choose(outcome, target, source, game); + Permanent permanent = game.getPermanent(target.getFirstTarget()); + if (permanent != null) { + game.addEffect(new GainControlTargetEffect( + Duration.UntilSourceLeavesBattlefield, true, opponent.getId() + ).setTargetPointer(new FixedTarget(permanent, game)), source); + } + return true; } } diff --git a/Mage.Sets/src/mage/cards/j/JaceIngeniousMindMage.java b/Mage.Sets/src/mage/cards/j/JaceIngeniousMindMage.java index 65ac048d787..d3181fdce1c 100644 --- a/Mage.Sets/src/mage/cards/j/JaceIngeniousMindMage.java +++ b/Mage.Sets/src/mage/cards/j/JaceIngeniousMindMage.java @@ -1,7 +1,5 @@ - package mage.cards.j; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; @@ -10,14 +8,15 @@ import mage.abilities.effects.common.continuous.GainControlTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.SuperType; import mage.filter.StaticFilters; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class JaceIngeniousMindMage extends CardImpl { @@ -38,7 +37,7 @@ public final class JaceIngeniousMindMage extends CardImpl { // -9: Gain control of up to three target creatures. Ability ability = new LoyaltyAbility(new GainControlTargetEffect(Duration.Custom), -9); - ability.addTarget(new TargetCreaturePermanent(0, 3, StaticFilters.FILTER_PERMANENT_CREATURES, false)); + ability.addTarget(new TargetCreaturePermanent(0, 3)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/j/JaddiLifestrider.java b/Mage.Sets/src/mage/cards/j/JaddiLifestrider.java index 128d48d778b..7d95d82d972 100644 --- a/Mage.Sets/src/mage/cards/j/JaddiLifestrider.java +++ b/Mage.Sets/src/mage/cards/j/JaddiLifestrider.java @@ -15,7 +15,7 @@ import mage.filter.predicate.permanent.TappedPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import java.util.UUID; @@ -67,7 +67,7 @@ class JaddiLifestriderEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { int tappedAmount = 0; Player you = game.getPlayer(source.getControllerId()); - TargetCreaturePermanent target = new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, true); + TargetPermanent target = new TargetPermanent(0, Integer.MAX_VALUE, filter, true); if (target.canChoose(source.getControllerId(), source, game) && target.choose(Outcome.Tap, source.getControllerId(), source.getSourceId(), source, game)) { for (UUID creatureId : target.getTargets()) { Permanent creature = game.getPermanent(creatureId); diff --git a/Mage.Sets/src/mage/cards/j/JaggedLightning.java b/Mage.Sets/src/mage/cards/j/JaggedLightning.java index 490a278ec21..0da793f9011 100644 --- a/Mage.Sets/src/mage/cards/j/JaggedLightning.java +++ b/Mage.Sets/src/mage/cards/j/JaggedLightning.java @@ -1,16 +1,14 @@ - package mage.cards.j; -import java.util.UUID; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.StaticFilters; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author LoneFox */ public final class JaggedLightning extends CardImpl { @@ -20,7 +18,7 @@ public final class JaggedLightning extends CardImpl { // Jagged Lightning deals 3 damage to each of two target creatures. this.getSpellAbility().addEffect(new DamageTargetEffect(3, true, "each of two target creatures")); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(2, 2, StaticFilters.FILTER_PERMANENT_CREATURE, false)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(2)); } private JaggedLightning(final JaggedLightning card) { diff --git a/Mage.Sets/src/mage/cards/j/JediStarfighter.java b/Mage.Sets/src/mage/cards/j/JediStarfighter.java index 4d2935cbafb..906fb5824ef 100644 --- a/Mage.Sets/src/mage/cards/j/JediStarfighter.java +++ b/Mage.Sets/src/mage/cards/j/JediStarfighter.java @@ -1,7 +1,6 @@ package mage.cards.j; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; @@ -15,10 +14,11 @@ import mage.constants.Duration; import mage.constants.SubType; import mage.constants.TargetController; import mage.filter.common.FilterCreaturePermanent; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; + +import java.util.UUID; /** - * * @author Styxo */ public final class JediStarfighter extends CardImpl { @@ -27,11 +27,11 @@ public final class JediStarfighter extends CardImpl { static { filter.add(SubType.JEDI.getPredicate()); - filter.add(TargetController.YOU.getControllerPredicate()); + filter.add(TargetController.YOU.getControllerPredicate()); } public JediStarfighter(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{2}{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{2}{W}{W}"); this.subtype.add(SubType.JEDI); this.subtype.add(SubType.STARSHIP); this.power = new MageInt(2); @@ -42,7 +42,7 @@ public final class JediStarfighter extends CardImpl { // When Jedi Starfighter enters the battlefield, up to two Jedi creatures you control gain spaceflight until end of turn. EntersBattlefieldTriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new GainAbilityTargetEffect(SpaceflightAbility.getInstance(), Duration.EndOfTurn)); - ability.addTarget(new TargetCreaturePermanent(0, 2, filter, true)); + ability.addTarget(new TargetPermanent(0, 2, filter, true)); this.addAbility(ability); // Meditate {1}{W} diff --git a/Mage.Sets/src/mage/cards/j/JoragaAuxiliary.java b/Mage.Sets/src/mage/cards/j/JoragaAuxiliary.java index e207271ca52..c2d5bbbce5b 100644 --- a/Mage.Sets/src/mage/cards/j/JoragaAuxiliary.java +++ b/Mage.Sets/src/mage/cards/j/JoragaAuxiliary.java @@ -1,7 +1,5 @@ - package mage.cards.j; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -11,13 +9,13 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.AnotherPredicate; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; + +import java.util.UUID; /** - * * @author fireshoes */ public final class JoragaAuxiliary extends CardImpl { @@ -29,7 +27,7 @@ public final class JoragaAuxiliary extends CardImpl { } public JoragaAuxiliary(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}{W}"); this.subtype.add(SubType.ELF); this.subtype.add(SubType.SOLDIER); this.subtype.add(SubType.ALLY); @@ -38,7 +36,7 @@ public final class JoragaAuxiliary extends CardImpl { // {4}{G}{W}: Support 2. (Put a +1/+1 counter on each of up to two other target creatures.) Ability ability = new SimpleActivatedAbility(new SupportEffect(this, 2, true), new ManaCostsImpl<>("{4}{G}{W}")); - ability.addTarget(new TargetCreaturePermanent(0, 2, filter, false)); + ability.addTarget(new TargetPermanent(0, 2, filter)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/j/JubilantMascot.java b/Mage.Sets/src/mage/cards/j/JubilantMascot.java index cceafa71a50..4f706c1c689 100644 --- a/Mage.Sets/src/mage/cards/j/JubilantMascot.java +++ b/Mage.Sets/src/mage/cards/j/JubilantMascot.java @@ -1,24 +1,24 @@ package mage.cards.j; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.DoIfCostPaid; import mage.abilities.effects.common.counter.AddCountersTargetEffect; -import mage.constants.SubType; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; import mage.counters.CounterType; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.AnotherPredicate; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; + +import java.util.UUID; /** - * * @author TheElk801 */ public final class JubilantMascot extends CardImpl { @@ -43,7 +43,7 @@ public final class JubilantMascot extends CardImpl { .setText("support 2"), new ManaCostsImpl<>("{3}{W}") )); - ability.addTarget(new TargetCreaturePermanent(0, 2, filter, false)); + ability.addTarget(new TargetPermanent(0, 2, filter)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/k/KayaGhostAssassin.java b/Mage.Sets/src/mage/cards/k/KayaGhostAssassin.java index c091b26812c..a3a1d8be781 100644 --- a/Mage.Sets/src/mage/cards/k/KayaGhostAssassin.java +++ b/Mage.Sets/src/mage/cards/k/KayaGhostAssassin.java @@ -13,7 +13,6 @@ import mage.abilities.effects.common.discard.DiscardEachPlayerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -27,8 +26,6 @@ import java.util.UUID; */ public final class KayaGhostAssassin extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("target creature to exile. Choose no targets to exile Kaya."); - public KayaGhostAssassin(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{W}{B}"); this.supertype.add(SuperType.LEGENDARY); @@ -39,21 +36,17 @@ public final class KayaGhostAssassin extends CardImpl { // 0: Exile Kaya, Ghost Assassin or up to one target creature. Return that card to the battlefield under its owner's control at the beginning of your next upkeep. // You lose 2 life. Ability ability = new LoyaltyAbility(new KayaGhostAssassinEffect(), 0); - ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false)); + ability.addTarget(new TargetCreaturePermanent(0, 1).withChooseHint("Choose no targets to exile Kaya")); this.addAbility(ability); // -1: Each opponent loses 2 life and you gain 2 life. ability = new LoyaltyAbility(new LoseLifeOpponentsEffect(2), -1); - Effect effect = new GainLifeEffect(2); - effect.setText("and you gain 2 life"); - ability.addEffect(effect); + ability.addEffect(new GainLifeEffect(2).setText("and you gain 2 life")); this.addAbility(ability); // -2: Each opponent discards a card and you draw a card. ability = new LoyaltyAbility(new DiscardEachPlayerEffect(TargetController.OPPONENT), -2); - effect = new DrawCardSourceControllerEffect(1); - effect.setText("and you draw a card"); - ability.addEffect(effect); + ability.addEffect(new DrawCardSourceControllerEffect(1).setText("and you draw a card")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/k/KayaTheInexorable.java b/Mage.Sets/src/mage/cards/k/KayaTheInexorable.java index cc1ab89fcaf..df3d529fd39 100644 --- a/Mage.Sets/src/mage/cards/k/KayaTheInexorable.java +++ b/Mage.Sets/src/mage/cards/k/KayaTheInexorable.java @@ -1,6 +1,5 @@ package mage.cards.k; -import mage.MageObject; import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; @@ -22,21 +21,20 @@ import mage.game.Game; import mage.game.command.emblems.KayaTheInexorableEmblem; import mage.game.events.GameEvent; import mage.game.events.ZoneChangeEvent; -import mage.game.permanent.Permanent; import mage.game.permanent.token.SpiritWhiteToken; import mage.players.Player; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import mage.target.common.TargetNonlandPermanent; import java.util.UUID; /** - * * @author weirddan455 */ public final class KayaTheInexorable extends CardImpl { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nontoken creature"); + static { filter.add(TokenPredicate.FALSE); } @@ -52,7 +50,7 @@ public final class KayaTheInexorable extends CardImpl { LoyaltyAbility ability = new LoyaltyAbility(new AddCountersTargetEffect(CounterType.GHOSTFORM.createInstance()), 1); ability.addEffect(new GainAbilityTargetEffect(new KayaTheInexorableTriggeredAbility(), Duration.WhileOnBattlefield, "It gains \"When this creature dies or is put into exile, return it to its owner's hand and create a 1/1 white Spirit creature token with flying.\"")); - ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false)); + ability.addTarget(new TargetPermanent(0, 1, filter)); this.addAbility(ability); // −3: Exile target nonland permanent. diff --git a/Mage.Sets/src/mage/cards/k/KyloRen.java b/Mage.Sets/src/mage/cards/k/KyloRen.java index 0ae7cc7dac3..b6074fbd302 100644 --- a/Mage.Sets/src/mage/cards/k/KyloRen.java +++ b/Mage.Sets/src/mage/cards/k/KyloRen.java @@ -6,7 +6,6 @@ import mage.abilities.common.AttacksEachCombatStaticAbility; import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; import mage.abilities.dynamicvalue.common.StaticValue; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.TapTargetEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.keyword.FirstStrikeAbility; @@ -23,7 +22,7 @@ import mage.filter.predicate.permanent.DefendingPlayerControlsSourceAttackingPre import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import java.util.UUID; @@ -58,11 +57,9 @@ public final class KyloRen extends CardImpl { // Whenever Kylo Ren attacks, it gets +1/+0 for each creature in your graveyard and you may tap target creature defending player controls. CardsInControllerGraveyardCount value = new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_CREATURE); - Effect effect = new BoostSourceEffect(value, StaticValue.get(0), Duration.WhileOnBattlefield); - effect.setText("it gets +1/+0 for each creature in your graveyard"); - Ability ability = new AttacksTriggeredAbility(effect, false); + Ability ability = new AttacksTriggeredAbility(new BoostSourceEffect(value, StaticValue.get(0), Duration.WhileOnBattlefield).setText("it gets +1/+0 for each creature in your graveyard")); ability.addEffect(new KyloRenTapTargetEffect()); - ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false)); + ability.addTarget(new TargetPermanent(0, 1, filter)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/l/LedevChampion.java b/Mage.Sets/src/mage/cards/l/LedevChampion.java index eef9be75efe..2a59b165cae 100644 --- a/Mage.Sets/src/mage/cards/l/LedevChampion.java +++ b/Mage.Sets/src/mage/cards/l/LedevChampion.java @@ -10,13 +10,15 @@ import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.permanent.TappedPredicate; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.SoldierLifelinkToken; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import java.util.UUID; @@ -57,13 +59,6 @@ public final class LedevChampion extends CardImpl { class LedevChampionEffect extends OneShotEffect { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("untapped creatures you control"); - - static { - filter.add(TargetController.YOU.getControllerPredicate()); - filter.add(TappedPredicate.UNTAPPED); - } - public LedevChampionEffect() { super(Outcome.GainLife); staticText = "you may tap any number of untapped creatures you control. " @@ -76,16 +71,14 @@ class LedevChampionEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { + TargetPermanent target = new TargetPermanent(0, Integer.MAX_VALUE, StaticFilters.FILTER_CONTROLLED_UNTAPPED_CREATURES, true); + target.choose(Outcome.Tap, source.getControllerId(), source.getSourceId(), source, game); int tappedAmount = 0; - TargetCreaturePermanent target = new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, true); - if (target.canChoose(source.getControllerId(), source, game) - && target.choose(Outcome.Tap, source.getControllerId(), source.getSourceId(), source, game)) { - for (UUID creatureId : target.getTargets()) { - Permanent creature = game.getPermanent(creatureId); - if (creature != null) { - creature.tap(source, game); - tappedAmount++; - } + for (UUID creatureId : target.getTargets()) { + Permanent creature = game.getPermanent(creatureId); + if (creature != null) { + creature.tap(source, game); + tappedAmount++; } } if (tappedAmount > 0) { diff --git a/Mage.Sets/src/mage/cards/l/LilianaTheNecromancer.java b/Mage.Sets/src/mage/cards/l/LilianaTheNecromancer.java index 10e768d736b..0f941198204 100644 --- a/Mage.Sets/src/mage/cards/l/LilianaTheNecromancer.java +++ b/Mage.Sets/src/mage/cards/l/LilianaTheNecromancer.java @@ -44,7 +44,7 @@ public final class LilianaTheNecromancer extends CardImpl { // −7: Destroy up to two target creatures. Put up to two creature cards from graveyards onto the battlefield under your control. ability = new LoyaltyAbility(new DestroyTargetEffect(), -7); - ability.addTarget(new TargetCreaturePermanent(0, 2, StaticFilters.FILTER_PERMANENT_CREATURES, false)); + ability.addTarget(new TargetCreaturePermanent(0, 2)); ability.addEffect(new LilianaTheNecromancerEffect()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/m/MabelsMettle.java b/Mage.Sets/src/mage/cards/m/MabelsMettle.java index 81f1690ff91..f19ce6ac47a 100644 --- a/Mage.Sets/src/mage/cards/m/MabelsMettle.java +++ b/Mage.Sets/src/mage/cards/m/MabelsMettle.java @@ -5,6 +5,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.StaticFilters; +import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; import mage.target.targetpointer.SecondTargetPointer; @@ -18,12 +19,11 @@ public final class MabelsMettle extends CardImpl { public MabelsMettle(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}"); - // Target creature gets +2/+2 until end of turn. Up to one other target creature gets +1/+1 until end of turn. this.getSpellAbility().addEffect(new BoostTargetEffect(2, 2)); this.getSpellAbility().addTarget(new TargetCreaturePermanent().setTargetTag(1)); this.getSpellAbility().addEffect(new BoostTargetEffect(1, 1).setTargetPointer(new SecondTargetPointer())); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1, StaticFilters.FILTER_ANOTHER_CREATURE_TARGET_2, false).setTargetTag(2)); + this.getSpellAbility().addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_ANOTHER_CREATURE_TARGET_2).setTargetTag(2)); } private MabelsMettle(final MabelsMettle card) { diff --git a/Mage.Sets/src/mage/cards/m/MarthaJones.java b/Mage.Sets/src/mage/cards/m/MarthaJones.java index 08363a2f3ee..cf8d6b3a06f 100644 --- a/Mage.Sets/src/mage/cards/m/MarthaJones.java +++ b/Mage.Sets/src/mage/cards/m/MarthaJones.java @@ -17,7 +17,7 @@ import mage.constants.SuperType; import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.AnotherPredicate; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import java.util.UUID; @@ -52,7 +52,7 @@ public final class MarthaJones extends CardImpl { ); ability.addEffect(new CantBeBlockedTargetEffect() .setText("and up to one other target creature can't be blocked this turn")); - ability.addTarget(new TargetCreaturePermanent(0, 1, filterOther, false)); + ability.addTarget(new TargetPermanent(0, 1, filterOther)); this.addAbility(ability); // Doctor's companion diff --git a/Mage.Sets/src/mage/cards/m/MasterOfTheVeil.java b/Mage.Sets/src/mage/cards/m/MasterOfTheVeil.java index 583aef98668..cee6f88e03b 100644 --- a/Mage.Sets/src/mage/cards/m/MasterOfTheVeil.java +++ b/Mage.Sets/src/mage/cards/m/MasterOfTheVeil.java @@ -1,11 +1,9 @@ package mage.cards.m; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility; -import mage.constants.SubType; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.BecomesFaceDownCreatureAllEffect; @@ -14,6 +12,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicate; import mage.filter.predicate.Predicates; @@ -21,10 +20,11 @@ import mage.filter.predicate.mageobject.AbilityPredicate; import mage.filter.predicate.permanent.PermanentIdPredicate; import mage.game.Game; import mage.target.Target; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; + +import java.util.UUID; /** - * * @author TheElk801 */ public final class MasterOfTheVeil extends CardImpl { @@ -48,7 +48,7 @@ public final class MasterOfTheVeil extends CardImpl { // When Master of the Veil is turned face up, you may turn target creature with a morph ability face down. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new MasterOfTheVeilEffect(), false, true); - ability.addTarget(new TargetCreaturePermanent(1, 1, filter, false)); + ability.addTarget(new TargetPermanent(filter)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/m/MasterWarcraft.java b/Mage.Sets/src/mage/cards/m/MasterWarcraft.java index 303eb9ed934..8a0c2335fb9 100644 --- a/Mage.Sets/src/mage/cards/m/MasterWarcraft.java +++ b/Mage.Sets/src/mage/cards/m/MasterWarcraft.java @@ -21,7 +21,7 @@ import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.Target; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import mage.target.targetpointer.FixedTarget; import mage.watchers.common.ControlCombatRedundancyWatcher; @@ -107,7 +107,7 @@ class MasterWarcraftChooseAttackersEffect extends ContinuousRuleModifyingEffectI if (controller == null || attackingPlayer == null || attackingPlayer.getAvailableAttackers(game).isEmpty()) { return false; // the attack declaration resumes for the active player as normal } - Target target = new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, true); + Target target = new TargetPermanent(0, Integer.MAX_VALUE, filter, true); if (!controller.chooseTarget(Outcome.Benefit, target, source, game)) { return false; // the attack declaration resumes for the active player as normal } diff --git a/Mage.Sets/src/mage/cards/m/MischiefAndMayhem.java b/Mage.Sets/src/mage/cards/m/MischiefAndMayhem.java index 3b2c2c39d2e..cf420f4d3f4 100644 --- a/Mage.Sets/src/mage/cards/m/MischiefAndMayhem.java +++ b/Mage.Sets/src/mage/cards/m/MischiefAndMayhem.java @@ -1,16 +1,15 @@ package mage.cards.m; -import java.util.UUID; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.StaticFilters; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class MischiefAndMayhem extends CardImpl { @@ -20,7 +19,7 @@ public final class MischiefAndMayhem extends CardImpl { // Up to two target creatures each get +4/+4 until end of turn. this.getSpellAbility().addEffect(new BoostTargetEffect(4, 4, Duration.EndOfTurn)); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2, StaticFilters.FILTER_PERMANENT_CREATURES, false)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2)); } private MischiefAndMayhem(final MischiefAndMayhem card) { diff --git a/Mage.Sets/src/mage/cards/m/ModifyMemory.java b/Mage.Sets/src/mage/cards/m/ModifyMemory.java index aaa41a8fb68..b41118ba499 100644 --- a/Mage.Sets/src/mage/cards/m/ModifyMemory.java +++ b/Mage.Sets/src/mage/cards/m/ModifyMemory.java @@ -14,7 +14,7 @@ import mage.game.Controllable; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.Target; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import mage.target.targetpointer.EachTargetPointer; import java.util.Collection; @@ -67,7 +67,7 @@ enum ModifyMemoryCondition implements Condition { } } -class ModifyMemoryTarget extends TargetCreaturePermanent { +class ModifyMemoryTarget extends TargetPermanent { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures controlled by different players"); diff --git a/Mage.Sets/src/mage/cards/m/Mutiny.java b/Mage.Sets/src/mage/cards/m/Mutiny.java index 23ab622d0ed..1ff7b50912a 100644 --- a/Mage.Sets/src/mage/cards/m/Mutiny.java +++ b/Mage.Sets/src/mage/cards/m/Mutiny.java @@ -15,6 +15,7 @@ import mage.filter.predicate.permanent.PermanentIdPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -31,7 +32,6 @@ public final class Mutiny extends CardImpl { this.getSpellAbility().addEffect(new MutinyEffect()); this.getSpellAbility().addTarget(new MutinyFirstTarget(StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE)); this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("another target creature that player controls"))); - } private Mutiny(final Mutiny card) { @@ -75,7 +75,7 @@ class MutinyEffect extends OneShotEffect { } -class MutinyFirstTarget extends TargetCreaturePermanent { +class MutinyFirstTarget extends TargetPermanent { public MutinyFirstTarget(FilterCreaturePermanent filter) { super(1, 1, filter, false); diff --git a/Mage.Sets/src/mage/cards/n/NissasJudgment.java b/Mage.Sets/src/mage/cards/n/NissasJudgment.java index 55e9a5bbf26..288b4560ca5 100644 --- a/Mage.Sets/src/mage/cards/n/NissasJudgment.java +++ b/Mage.Sets/src/mage/cards/n/NissasJudgment.java @@ -1,6 +1,5 @@ package mage.cards.n; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; @@ -13,11 +12,12 @@ import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; -import mage.target.common.TargetCreaturePermanent; +import mage.target.common.TargetOpponentsCreaturePermanent; import mage.target.targetpointer.SecondTargetPointer; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class NissasJudgment extends CardImpl { @@ -32,7 +32,7 @@ public final class NissasJudgment extends CardImpl { // Choose up to one target creature an opponent controls. Each creature you control with a +1/+1 counter on it deals damage equal to its power to that creature. effect = new NissasJudgmentEffect(); effect.setTargetPointer(new SecondTargetPointer()); // First target is used by Support - getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1, StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE, false)); + getSpellAbility().addTarget(new TargetOpponentsCreaturePermanent(0, 1)); getSpellAbility().addEffect(effect); } diff --git a/Mage.Sets/src/mage/cards/p/PhantomBlade.java b/Mage.Sets/src/mage/cards/p/PhantomBlade.java index 55f91727caa..1f79ccec1b5 100644 --- a/Mage.Sets/src/mage/cards/p/PhantomBlade.java +++ b/Mage.Sets/src/mage/cards/p/PhantomBlade.java @@ -16,8 +16,8 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; import mage.filter.StaticFilters; +import mage.target.TargetPermanent; import mage.target.common.TargetControlledCreaturePermanent; -import mage.target.common.TargetCreaturePermanent; import mage.target.targetpointer.SecondTargetPointer; import java.util.UUID; @@ -37,7 +37,7 @@ public final class PhantomBlade extends CardImpl { ability.addTarget(new TargetControlledCreaturePermanent(0, 1).setTargetTag(1)); ability.addEffect(new DestroyTargetEffect().setTargetPointer(new SecondTargetPointer())); - ability.addTarget(new TargetCreaturePermanent(0, 1, StaticFilters.FILTER_ANOTHER_CREATURE_TARGET_2, false).setTargetTag(2)); + ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_ANOTHER_CREATURE_TARGET_2).setTargetTag(2)); this.addAbility(ability); // Equipped creature gets +1/+1 and has menace. diff --git a/Mage.Sets/src/mage/cards/p/PolymorphousRush.java b/Mage.Sets/src/mage/cards/p/PolymorphousRush.java index 5819a2fc124..43d4c1b0953 100644 --- a/Mage.Sets/src/mage/cards/p/PolymorphousRush.java +++ b/Mage.Sets/src/mage/cards/p/PolymorphousRush.java @@ -8,12 +8,12 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; -import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.Target; +import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetCreaturePermanent; import mage.util.functions.EmptyCopyApplier; @@ -31,9 +31,8 @@ public final class PolymorphousRush extends CardImpl { this.addAbility(new StriveAbility("{1}{U}")); // Choose a creature on the battlefield. Any number of target creatures you control each become a copy of that creature until end of turn. - this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, Integer.MAX_VALUE, StaticFilters.FILTER_PERMANENT_CREATURE_CONTROLLED, false)); this.getSpellAbility().addEffect(new PolymorphousRushCopyEffect()); - + this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent(0, Integer.MAX_VALUE)); } private PolymorphousRush(final PolymorphousRush card) { diff --git a/Mage.Sets/src/mage/cards/p/ProfaneCommand.java b/Mage.Sets/src/mage/cards/p/ProfaneCommand.java index ebe372bff1c..984bba44788 100644 --- a/Mage.Sets/src/mage/cards/p/ProfaneCommand.java +++ b/Mage.Sets/src/mage/cards/p/ProfaneCommand.java @@ -21,6 +21,7 @@ import mage.filter.common.FilterCreatureCard; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; +import mage.target.TargetPermanent; import mage.target.TargetPlayer; import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetCreaturePermanent; @@ -37,13 +38,12 @@ public final class ProfaneCommand extends CardImpl { public ProfaneCommand(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{B}{B}"); - - DynamicValue xValue = GetXValue.instance; // Choose two - this.getSpellAbility().getModes().setMinModes(2); this.getSpellAbility().getModes().setMaxModes(2); + // * Target player loses X life. - this.getSpellAbility().addEffect(new LoseLifeTargetEffect(xValue)); + this.getSpellAbility().addEffect(new LoseLifeTargetEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetPlayer()); // * Return target creature card with converted mana cost X or less from your graveyard to the battlefield. @@ -52,15 +52,13 @@ public final class ProfaneCommand extends CardImpl { this.getSpellAbility().addMode(mode); // * Target creature gets -X/-X until end of turn. - DynamicValue minusValue = new SignInversionDynamicValue(xValue); + DynamicValue minusValue = new SignInversionDynamicValue(GetXValue.instance); mode = new Mode(new BoostTargetEffect(minusValue, minusValue, Duration.EndOfTurn)); mode.addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addMode(mode); // * Up to X target creatures gain fear until end of turn. - Effect effect = new GainAbilityTargetEffect(FearAbility.getInstance(), Duration.EndOfTurn); - effect.setText("Up to X target creatures gain fear until end of turn"); - mode = new Mode(effect); + mode = new Mode(new GainAbilityTargetEffect(FearAbility.getInstance(), Duration.EndOfTurn).setText("Up to X target creatures gain fear until end of turn")); mode.addTarget(new TargetCreaturePermanent(0, 1)); this.getSpellAbility().addMode(mode); @@ -95,8 +93,8 @@ enum ProfaneCommandAdjuster implements TargetAdjuster { if (effect instanceof GainAbilityTargetEffect) { mode.getTargets().clear(); FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures gain fear until end of turn"); - mode.addTarget(new TargetCreaturePermanent(0, xValue, filter, false)); + mode.addTarget(new TargetPermanent(0, xValue, filter)); } } } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/r/RallyManeuver.java b/Mage.Sets/src/mage/cards/r/RallyManeuver.java index fc7e7fbe24e..27f46357750 100644 --- a/Mage.Sets/src/mage/cards/r/RallyManeuver.java +++ b/Mage.Sets/src/mage/cards/r/RallyManeuver.java @@ -1,7 +1,5 @@ package mage.cards.r; -import java.util.UUID; - import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.FirstStrikeAbility; @@ -12,11 +10,13 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.other.AnotherTargetPredicate; +import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; import mage.target.targetpointer.SecondTargetPointer; +import java.util.UUID; + /** - * * @author weirddan455 */ public final class RallyManeuver extends CardImpl { @@ -31,25 +31,22 @@ public final class RallyManeuver extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{W}"); // Target creature gets +2/+0 and gains first strike until end of turn. Up to one other target creature gets +0/+2 and gains lifelink until end of turn. - TargetCreaturePermanent target = new TargetCreaturePermanent(); - target.setTargetTag(1); - this.getSpellAbility().addTarget(target.withChooseHint("+2/+0 and first strike")); + this.getSpellAbility().addTarget(new TargetCreaturePermanent().setTargetTag(1).withChooseHint("+2/+0 and first strike")); this.getSpellAbility().addEffect(new BoostTargetEffect(2, 0).setText("Target creature gets +2/+0")); this.getSpellAbility().addEffect(new GainAbilityTargetEffect( - FirstStrikeAbility.getInstance(), Duration.EndOfTurn, "and gains first strike until end of turn" + FirstStrikeAbility.getInstance(), Duration.EndOfTurn, + "and gains first strike until end of turn" )); - - target = new TargetCreaturePermanent(0, 1, filter2, false); - target.setTargetTag(2); - this.getSpellAbility().addTarget(target.withChooseHint("+0/+2 and lifelink")); + this.getSpellAbility().addTarget(new TargetPermanent(0, 1, filter2) + .setTargetTag(2).withChooseHint("+0/+2 and lifelink")); this.getSpellAbility().addEffect(new BoostTargetEffect(0, 2) .setText("Up to one other target creature gets +0/+2") .setTargetPointer(new SecondTargetPointer()) ); - this.getSpellAbility().addEffect( - new GainAbilityTargetEffect(LifelinkAbility.getInstance(), Duration.EndOfTurn, "and gains lifelink until end of turn") - .setTargetPointer(new SecondTargetPointer()) - ); + this.getSpellAbility().addEffect(new GainAbilityTargetEffect( + LifelinkAbility.getInstance(), Duration.EndOfTurn, + "and gains lifelink until end of turn" + ).setTargetPointer(new SecondTargetPointer())); } private RallyManeuver(final RallyManeuver card) { diff --git a/Mage.Sets/src/mage/cards/r/RavenousTyrannosaurus.java b/Mage.Sets/src/mage/cards/r/RavenousTyrannosaurus.java index 64b0cdab0ef..7460dc4fbfc 100644 --- a/Mage.Sets/src/mage/cards/r/RavenousTyrannosaurus.java +++ b/Mage.Sets/src/mage/cards/r/RavenousTyrannosaurus.java @@ -12,12 +12,11 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.AnotherPredicate; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import java.util.UUID; /** - * * @author notgreat */ public final class RavenousTyrannosaurus extends CardImpl { @@ -27,6 +26,7 @@ public final class RavenousTyrannosaurus extends CardImpl { static { filter.add(AnotherPredicate.instance); } + public RavenousTyrannosaurus(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{R}{G}"); this.subtype.add(SubType.DINOSAUR); @@ -39,7 +39,7 @@ public final class RavenousTyrannosaurus extends CardImpl { // Whenever Ravenous Tyrannosaurus attacks, it deals damage equal to its power to up to one other target creature. Excess damage is dealt to that creature's controller instead. Ability ability = new AttacksTriggeredAbility(new DamageWithExcessEffect(SourcePermanentPowerValue.NOT_NEGATIVE) .setText("it deals damage equal to its power to up to one other target creature. Excess damage is dealt to that creature's controller instead.")); - ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false)); + ability.addTarget(new TargetPermanent(0, 1, filter)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/r/RazorgrassInvoker.java b/Mage.Sets/src/mage/cards/r/RazorgrassInvoker.java index 0bbced7dc8e..2bcaeed45fb 100644 --- a/Mage.Sets/src/mage/cards/r/RazorgrassInvoker.java +++ b/Mage.Sets/src/mage/cards/r/RazorgrassInvoker.java @@ -13,7 +13,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; import mage.filter.StaticFilters; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import java.util.UUID; @@ -36,7 +36,7 @@ public final class RazorgrassInvoker extends CardImpl { // {8}: Razorgrass Invoker and up to one other target creature each get +3/+3 until end of turn. Ability ability = new SimpleActivatedAbility(new BoostSourceEffect(3, 3, Duration.EndOfTurn).setText("{this}"), new ManaCostsImpl<>("{8}")); ability.addEffect(new BoostTargetEffect(3, 3, Duration.EndOfTurn).setText("and up to one other target creature each get +3/+3 until end of turn")); - ability.addTarget(new TargetCreaturePermanent(0, 1, StaticFilters.FILTER_ANOTHER_TARGET_CREATURE, false)); + ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_ANOTHER_TARGET_CREATURE)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/r/RecklessSpite.java b/Mage.Sets/src/mage/cards/r/RecklessSpite.java index 280e0a92109..3948633a390 100644 --- a/Mage.Sets/src/mage/cards/r/RecklessSpite.java +++ b/Mage.Sets/src/mage/cards/r/RecklessSpite.java @@ -6,21 +6,20 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.StaticFilters; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import java.util.UUID; /** - * * @author Loki */ public final class RecklessSpite extends CardImpl { public RecklessSpite(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{B}{B}"); this.getSpellAbility().addEffect(new DestroyTargetEffect()); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(2, 2, StaticFilters.FILTER_PERMANENT_CREATURES_NON_BLACK, false)); + this.getSpellAbility().addTarget(new TargetPermanent(2, StaticFilters.FILTER_PERMANENT_CREATURES_NON_BLACK)); this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(5)); } diff --git a/Mage.Sets/src/mage/cards/r/RestlessVinestalk.java b/Mage.Sets/src/mage/cards/r/RestlessVinestalk.java index 8bc24640ea7..f9e66ba12e9 100644 --- a/Mage.Sets/src/mage/cards/r/RestlessVinestalk.java +++ b/Mage.Sets/src/mage/cards/r/RestlessVinestalk.java @@ -18,7 +18,7 @@ import mage.constants.SubType; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.AnotherPredicate; import mage.game.permanent.token.custom.CreatureToken; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import java.util.UUID; @@ -53,7 +53,7 @@ public final class RestlessVinestalk extends CardImpl { // Whenever Restless Vinestalk attacks, up to one other target creature has base power and toughness 3/3 until end of turn. Ability ability = new AttacksTriggeredAbility(new SetBasePowerToughnessTargetEffect(3, 3, Duration.EndOfTurn), false); - ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false)); + ability.addTarget(new TargetPermanent(0, 1, filter)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/r/Retribution.java b/Mage.Sets/src/mage/cards/r/Retribution.java index 6a26dec77ad..93205e96129 100644 --- a/Mage.Sets/src/mage/cards/r/Retribution.java +++ b/Mage.Sets/src/mage/cards/r/Retribution.java @@ -1,8 +1,6 @@ - package mage.cards.r; -import java.util.UUID; -import mage.MageObject; +import mage.MageItem; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; @@ -10,15 +8,23 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.counters.CounterType; +import mage.filter.FilterPermanent; import mage.filter.StaticFilters; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.PermanentIdPredicate; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetImpl; +import mage.target.TargetPermanent; +import mage.target.common.TargetPermanentSameController; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Collectors; /** - * * @author jeffwadsworth */ public final class Retribution extends CardImpl { @@ -28,8 +34,7 @@ public final class Retribution extends CardImpl { // Choose two target creatures an opponent controls. That player chooses and sacrifices one of those creatures. Put a -1/-1 counter on the other. this.getSpellAbility().addEffect(new RetributionEffect()); - this.getSpellAbility().addTarget(new TargetCreaturePermanentOpponentSameController(2, 2, StaticFilters.FILTER_PERMANENT_CREATURE, false)); - + this.getSpellAbility().addTarget(new TargetPermanentSameController(2, StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURES)); } private Retribution(final Retribution card) { @@ -60,66 +65,53 @@ class RetributionEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - MageObject sourceObject = source.getSourceObject(game); - if (sourceObject != null) { - boolean sacrificeDone = false; - int count = 0; - for (UUID targetId : getTargetPointer().getTargets(game, source)) { - Permanent creature = game.getPermanent(targetId); - if (creature != null) { - Player controllerOfCreature = game.getPlayer(creature.getControllerId()); - if ((count == 0 && controllerOfCreature != null - && controllerOfCreature.chooseUse(Outcome.Sacrifice, "Sacrifice " + creature.getLogName() + '?', source, game)) - || (count == 1 - && !sacrificeDone)) { - creature.sacrifice(source, game); - sacrificeDone = true; - } else { - creature.addCounters(CounterType.M1M1.createInstance(), source.getControllerId(), source, game); - } - count++; - } - } - return true; + List permanents = this + .getTargetPointer() + .getTargets(game, source) + .stream() + .map(game::getPermanent) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + List canSac = permanents + .stream() + .filter(Permanent::canBeSacrificed) + .collect(Collectors.toList()); + Permanent toSacrifice; + switch (canSac.size()) { + case 0: + toSacrifice = null; + break; + case 1: + toSacrifice = canSac.get(0); + break; + default: + toSacrifice = Optional + .ofNullable(canSac.get(0).getControllerId()) + .map(game::getPlayer) + .map(player -> { + FilterPermanent filter = new FilterPermanent(); + filter.add(Predicates.or( + canSac.stream() + .map(MageItem::getId) + .map(PermanentIdPredicate::new) + .collect(Collectors.toList()) + )); + TargetPermanent target = new TargetPermanent(filter); + target.withNotTarget(true); + player.choose(Outcome.Sacrifice, target, source, game); + return target; + }) + .map(TargetImpl::getFirstTarget) + .map(game::getPermanent) + .orElse(null); } - return false; - } -} - -class TargetCreaturePermanentOpponentSameController extends TargetCreaturePermanent { - - public TargetCreaturePermanentOpponentSameController(int minNumTargets, int maxNumTargets, FilterCreaturePermanent filter, boolean notTarget) { - super(minNumTargets, maxNumTargets, filter, notTarget); - } - - private TargetCreaturePermanentOpponentSameController(final TargetCreaturePermanentOpponentSameController target) { - super(target); - } - - @Override - public boolean canTarget(UUID controllerId, UUID id, Ability source, Game game) { - if (super.canTarget(controllerId, id, source, game)) { - Permanent firstTargetPermanent = game.getPermanent(id); - if (firstTargetPermanent != null - && game.getOpponents(controllerId).contains(firstTargetPermanent.getControllerId())) { - for (UUID targetId : getTargets()) { - Permanent targetPermanent = game.getPermanent(targetId); - if (targetPermanent != null) { - if (!firstTargetPermanent.getId().equals(targetPermanent.getId())) { - if (!firstTargetPermanent.isControlledBy(targetPermanent.getOwnerId())) { - return false; - } - } - } - } - return true; - } - } - return false; - } - - @Override - public TargetCreaturePermanentOpponentSameController copy() { - return new TargetCreaturePermanentOpponentSameController(this); + if (toSacrifice != null) { + permanents.remove(toSacrifice); + toSacrifice.sacrifice(source, game); + } + for (Permanent permanent : permanents) { + permanent.addCounters(CounterType.M1M1.createInstance(), source, game); + } + return true; } } diff --git a/Mage.Sets/src/mage/cards/r/RivalsDuel.java b/Mage.Sets/src/mage/cards/r/RivalsDuel.java index ce690c589b0..320c0b5a97e 100644 --- a/Mage.Sets/src/mage/cards/r/RivalsDuel.java +++ b/Mage.Sets/src/mage/cards/r/RivalsDuel.java @@ -1,19 +1,20 @@ package mage.cards.r; -import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.FightTargetsEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; -import mage.filter.StaticFilters; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.target.common.TargetCreaturePermanentWithDifferentTypes; +import mage.target.TargetPermanent; + +import java.util.Objects; +import java.util.UUID; /** - * * @author LevelX2 */ public final class RivalsDuel extends CardImpl { @@ -22,9 +23,9 @@ public final class RivalsDuel extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{R}"); // Choose two target creatures that share no creature types. Those creatures fight each other. - this.getSpellAbility().addEffect(new RivalsDuelFightTargetsEffect()); - this.getSpellAbility().addTarget(new TargetCreaturePermanentWithDifferentTypes(2, 2, StaticFilters.FILTER_PERMANENT_CREATURE, false)); - + this.getSpellAbility().addEffect(new FightTargetsEffect() + .setText("Choose two target creatures that share no creature types. Those creatures fight each other.")); + this.getSpellAbility().addTarget(new RivalsDuelTarget()); } private RivalsDuel(final RivalsDuel card) { @@ -37,42 +38,35 @@ public final class RivalsDuel extends CardImpl { } } -class RivalsDuelFightTargetsEffect extends OneShotEffect { +class RivalsDuelTarget extends TargetPermanent { - RivalsDuelFightTargetsEffect() { - super(Outcome.Damage); - staticText = "Choose two target creatures that share no creature types. " + - "Those creatures fight each other. (Each deals damage equal to its power to the other.)"; + private static final FilterPermanent filter = new FilterCreaturePermanent("creatures that share no creature types"); + + RivalsDuelTarget() { + super(2, 2, filter, false); } - private RivalsDuelFightTargetsEffect(final RivalsDuelFightTargetsEffect effect) { - super(effect); + private RivalsDuelTarget(final RivalsDuelTarget target) { + super(target); } @Override - public boolean apply(Game game, Ability source) { - Permanent creature1 = null; - Permanent creature2 = null; - for (UUID targetId : getTargetPointer().getTargets(game, source)) { - if (creature1 == null) { - creature1 = game.getPermanent(targetId); - } else { - creature2 = game.getPermanent(targetId); - } - } - - // 20110930 - 701.10 - if (creature1 != null - && creature2 != null) { - creature1.damage(creature2.getPower().getValue(), creature2.getId(), source, game, false, true); - creature2.damage(creature1.getPower().getValue(), creature1.getId(), source, game, false, true); - return true; - } - return false; + public RivalsDuelTarget copy() { + return new RivalsDuelTarget(this); } @Override - public RivalsDuelFightTargetsEffect copy() { - return new RivalsDuelFightTargetsEffect(this); + public boolean canTarget(UUID controllerId, UUID id, Ability source, Game game) { + if (!super.canTarget(controllerId, id, source, game)) { + return false; + } + Permanent creature = game.getPermanent(id); + return creature != null + && this + .getTargets() + .stream() + .map(game::getPermanent) + .filter(Objects::nonNull) + .noneMatch(permanent -> permanent.shareCreatureTypes(game, creature)); } } diff --git a/Mage.Sets/src/mage/cards/r/RiverHeraldsBoon.java b/Mage.Sets/src/mage/cards/r/RiverHeraldsBoon.java index 947e3f67893..6ae8b33d170 100644 --- a/Mage.Sets/src/mage/cards/r/RiverHeraldsBoon.java +++ b/Mage.Sets/src/mage/cards/r/RiverHeraldsBoon.java @@ -1,36 +1,34 @@ - package mage.cards.r; -import java.util.UUID; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.counters.CounterType; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.FilterPermanent; +import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; import mage.target.targetpointer.SecondTargetPointer; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class RiverHeraldsBoon extends CardImpl { + private static final FilterPermanent filter = new FilterPermanent(SubType.MERFOLK, "Merfolk"); + public RiverHeraldsBoon(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{G}"); // Put a +1/+1 counter on target creature and a +1/+1 counter on up to one target Merfolk. this.getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.P1P1.createInstance())); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - Effect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance()); - effect.setTargetPointer(new SecondTargetPointer()); - effect.setText("and a +1/+1 counter on up to one target Merfolk"); - this.getSpellAbility().addEffect(effect); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1, new FilterCreaturePermanent(SubType.MERFOLK, "Merfolk"), false)); - + this.getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.P1P1.createInstance()) + .setTargetPointer(new SecondTargetPointer()).setText("and a +1/+1 counter on up to one target Merfolk")); + this.getSpellAbility().addTarget(new TargetPermanent(0, 1, filter)); } private RiverHeraldsBoon(final RiverHeraldsBoon card) { diff --git a/Mage.Sets/src/mage/cards/r/RoamingGhostlight.java b/Mage.Sets/src/mage/cards/r/RoamingGhostlight.java index 3eb1a648a1b..7a127b1ac3a 100644 --- a/Mage.Sets/src/mage/cards/r/RoamingGhostlight.java +++ b/Mage.Sets/src/mage/cards/r/RoamingGhostlight.java @@ -11,7 +11,7 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import java.util.UUID; @@ -38,7 +38,7 @@ public final class RoamingGhostlight extends CardImpl { // When Roaming Ghostlight enters the battlefield, return up to one target non-Spirit creature to its owner's hand. Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect()); - ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false)); + ability.addTarget(new TargetPermanent(0, 1, filter)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/r/RunAwayTogether.java b/Mage.Sets/src/mage/cards/r/RunAwayTogether.java index 1c5857d2be3..d5107d33568 100644 --- a/Mage.Sets/src/mage/cards/r/RunAwayTogether.java +++ b/Mage.Sets/src/mage/cards/r/RunAwayTogether.java @@ -5,10 +5,11 @@ import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.filter.FilterPermanent; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import java.util.Objects; import java.util.UUID; @@ -39,9 +40,9 @@ public final class RunAwayTogether extends CardImpl { } } -class RunAwayTogetherTarget extends TargetCreaturePermanent { +class RunAwayTogetherTarget extends TargetPermanent { - private static final FilterCreaturePermanent filter + private static final FilterPermanent filter = new FilterCreaturePermanent("creatures controlled by different players"); RunAwayTogetherTarget() { diff --git a/Mage.Sets/src/mage/cards/s/SaddlebackLagac.java b/Mage.Sets/src/mage/cards/s/SaddlebackLagac.java index 2e1c3128667..d0d615ebdff 100644 --- a/Mage.Sets/src/mage/cards/s/SaddlebackLagac.java +++ b/Mage.Sets/src/mage/cards/s/SaddlebackLagac.java @@ -1,7 +1,5 @@ - package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; @@ -14,8 +12,9 @@ import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.AnotherPredicate; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class SaddlebackLagac extends CardImpl { @@ -27,16 +26,15 @@ public final class SaddlebackLagac extends CardImpl { } public SaddlebackLagac(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}"); this.subtype.add(SubType.LIZARD); this.power = new MageInt(3); this.toughness = new MageInt(1); // When Saddleback Lagac enters the battlefield, support 2. Ability ability = new EntersBattlefieldTriggeredAbility(new SupportEffect(this, 2, true), false); - ability.addTarget(new TargetCreaturePermanent(0, 2, FILTER, false)); + ability.addTarget(new TargetCreaturePermanent(0, 2)); this.addAbility(ability); - } private SaddlebackLagac(final SaddlebackLagac card) { diff --git a/Mage.Sets/src/mage/cards/s/SeismicShift.java b/Mage.Sets/src/mage/cards/s/SeismicShift.java index be1b13ab3b4..d97740b83f6 100644 --- a/Mage.Sets/src/mage/cards/s/SeismicShift.java +++ b/Mage.Sets/src/mage/cards/s/SeismicShift.java @@ -1,20 +1,18 @@ - package mage.cards.s; -import java.util.UUID; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.combat.CantBlockTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.StaticFilters; import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetLandPermanent; import mage.target.targetpointer.SecondTargetPointer; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class SeismicShift extends CardImpl { @@ -28,7 +26,7 @@ public final class SeismicShift extends CardImpl { this.getSpellAbility().addEffect(new CantBlockTargetEffect(Duration.EndOfTurn) .setText("Up to two target creatures can't block this turn") .setTargetPointer(new SecondTargetPointer())); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2, StaticFilters.FILTER_PERMANENT_CREATURES, false)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2)); } private SeismicShift(final SeismicShift card) { diff --git a/Mage.Sets/src/mage/cards/s/ShelteringAncient.java b/Mage.Sets/src/mage/cards/s/ShelteringAncient.java index a5c2d0743a8..7ecef3f4631 100644 --- a/Mage.Sets/src/mage/cards/s/ShelteringAncient.java +++ b/Mage.Sets/src/mage/cards/s/ShelteringAncient.java @@ -11,14 +11,13 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; -import mage.constants.TargetController; import mage.counters.CounterType; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.Target; -import mage.target.common.TargetCreaturePermanent; +import mage.target.common.TargetOpponentsCreaturePermanent; import java.util.UUID; @@ -52,12 +51,6 @@ public final class ShelteringAncient extends CardImpl { class ShelteringAncientCost extends CostImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); - - static { - filter.add(TargetController.OPPONENT.getControllerPredicate()); - } - ShelteringAncientCost() { this.text = "Put a +1/+1 counter on a creature an opponent controls"; } @@ -70,7 +63,8 @@ class ShelteringAncientCost extends CostImpl { public boolean pay(Ability ability, Game game, Ability source, UUID controllerId, boolean noMana, Cost costToPay) { Player controller = game.getPlayer(controllerId); if (controller != null) { - Target target = new TargetCreaturePermanent(1, 1, filter, true); + Target target = new TargetOpponentsCreaturePermanent(); + target.withNotTarget(true); if (target.choose(Outcome.BoostCreature, controllerId, source.getSourceId(), source, game)) { Permanent permanent = game.getPermanent(target.getFirstTarget()); if (permanent != null) { @@ -85,7 +79,7 @@ class ShelteringAncientCost extends CostImpl { @Override public boolean canPay(Ability ability, Ability source, UUID controllerId, Game game) { - return game.getBattlefield().contains(filter, source, game, 1); + return game.getBattlefield().contains(StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE, source, game, 1); } @Override diff --git a/Mage.Sets/src/mage/cards/s/SiegeStriker.java b/Mage.Sets/src/mage/cards/s/SiegeStriker.java index b1c7b928e93..666755d2a1e 100644 --- a/Mage.Sets/src/mage/cards/s/SiegeStriker.java +++ b/Mage.Sets/src/mage/cards/s/SiegeStriker.java @@ -8,12 +8,14 @@ import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.keyword.DoubleStrikeAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.permanent.TappedPredicate; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import java.util.UUID; @@ -34,10 +36,7 @@ public final class SiegeStriker extends CardImpl { this.addAbility(DoubleStrikeAbility.getInstance()); // Whenever Siege Striker attacks, you may tap any number of untapped creatures you control. Siege Striker gets +1/+1 until end of turn for each creature tapped this way. - this.addAbility(new AttacksTriggeredAbility( - new SiegeStrikerEffect(), true - )); - + this.addAbility(new AttacksTriggeredAbility(new SiegeStrikerEffect(), true)); } private SiegeStriker(final SiegeStriker card) { @@ -52,13 +51,6 @@ public final class SiegeStriker extends CardImpl { class SiegeStrikerEffect extends OneShotEffect { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("untapped creatures you control"); - - static { - filter.add(TargetController.YOU.getControllerPredicate()); - filter.add(TappedPredicate.UNTAPPED); - } - public SiegeStrikerEffect() { super(Outcome.GainLife); staticText = "you may tap any number of untapped creatures you control. " @@ -72,15 +64,13 @@ class SiegeStrikerEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { int tappedAmount = 0; - TargetCreaturePermanent target = new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, true); - if (target.canChoose(source.getControllerId(), source, game) - && target.choose(Outcome.Tap, source.getControllerId(), source.getSourceId(), source, game)) { - for (UUID creatureId : target.getTargets()) { - Permanent creature = game.getPermanent(creatureId); - if (creature != null) { - creature.tap(source, game); - tappedAmount++; - } + TargetPermanent target = new TargetPermanent(0, Integer.MAX_VALUE, StaticFilters.FILTER_CONTROLLED_UNTAPPED_CREATURES, true); + target.choose(Outcome.Tap, source.getControllerId(), source.getSourceId(), source, game); + for (UUID creatureId : target.getTargets()) { + Permanent creature = game.getPermanent(creatureId); + if (creature != null) { + creature.tap(source, game); + tappedAmount++; } } if (tappedAmount > 0) { diff --git a/Mage.Sets/src/mage/cards/s/SigardianPriest.java b/Mage.Sets/src/mage/cards/s/SigardianPriest.java index 16ebf8d4d88..99fa919a016 100644 --- a/Mage.Sets/src/mage/cards/s/SigardianPriest.java +++ b/Mage.Sets/src/mage/cards/s/SigardianPriest.java @@ -1,7 +1,5 @@ - package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -12,13 +10,13 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; + +import java.util.UUID; /** - * * @author LevelX2 */ public final class SigardianPriest extends CardImpl { @@ -30,7 +28,7 @@ public final class SigardianPriest extends CardImpl { } public SigardianPriest(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.CLERIC); this.power = new MageInt(1); @@ -39,7 +37,7 @@ public final class SigardianPriest extends CardImpl { // {1}, {T}: Tap target non-Human creature. Ability ability = new SimpleActivatedAbility(new TapTargetEffect(), new GenericManaCost(1)); ability.addCost(new TapSourceCost()); - ability.addTarget(new TargetCreaturePermanent(1, 1, filter, false)); + ability.addTarget(new TargetPermanent(filter)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/SmellFear.java b/Mage.Sets/src/mage/cards/s/SmellFear.java index 61d944332fe..17427d15649 100644 --- a/Mage.Sets/src/mage/cards/s/SmellFear.java +++ b/Mage.Sets/src/mage/cards/s/SmellFear.java @@ -6,8 +6,8 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.StaticFilters; +import mage.target.TargetPermanent; import mage.target.common.TargetControlledCreaturePermanent; -import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -27,7 +27,7 @@ public final class SmellFear extends CardImpl { "
Target creature you control fights up to one target creature you don't control" )); this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent()); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL, false)); + this.getSpellAbility().addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL)); } private SmellFear(final SmellFear card) { diff --git a/Mage.Sets/src/mage/cards/s/SplitTheParty.java b/Mage.Sets/src/mage/cards/s/SplitTheParty.java index 21ab34362f1..3815306dc2c 100644 --- a/Mage.Sets/src/mage/cards/s/SplitTheParty.java +++ b/Mage.Sets/src/mage/cards/s/SplitTheParty.java @@ -1,9 +1,5 @@ package mage.cards.s; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; - import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; @@ -17,11 +13,14 @@ import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.ControllerIdPredicate; import mage.game.Game; import mage.players.Player; +import mage.target.TargetPermanent; import mage.target.TargetPlayer; -import mage.target.common.TargetCreaturePermanent; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; /** - * * @author weirddan455 */ public final class SplitTheParty extends CardImpl { @@ -72,7 +71,7 @@ class SplitThePartyEffect extends OneShotEffect { int halfCreatures = (numCreatures / 2) + (numCreatures % 2); FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures controlled by " + targetPlayer.getName()); filter.add(new ControllerIdPredicate(targetPlayer.getId())); - TargetCreaturePermanent target = new TargetCreaturePermanent(halfCreatures, halfCreatures, filter, true); + TargetPermanent target = new TargetPermanent(halfCreatures, halfCreatures, filter, true); if (controller.chooseTarget(outcome, target, source, game)) { Set cardsToHand = new HashSet<>(); for (UUID creatureId : target.getTargets()) { diff --git a/Mage.Sets/src/mage/cards/s/SpyNetwork.java b/Mage.Sets/src/mage/cards/s/SpyNetwork.java index 036591054f7..98f916d29df 100644 --- a/Mage.Sets/src/mage/cards/s/SpyNetwork.java +++ b/Mage.Sets/src/mage/cards/s/SpyNetwork.java @@ -16,8 +16,8 @@ import mage.filter.predicate.permanent.ControllerIdPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.target.TargetPermanent; import mage.target.TargetPlayer; -import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -103,7 +103,7 @@ class SpyNetworkFaceDownEffect extends OneShotEffect { FilterCreaturePermanent filter = new FilterCreaturePermanent("face down creature controlled by " + player.getLogName()); filter.add(FaceDownPredicate.instance); filter.add(new ControllerIdPredicate(player.getId())); - TargetCreaturePermanent target = new TargetCreaturePermanent(1, 1, filter, true); + TargetPermanent target = new TargetPermanent(1, 1, filter, true); if (target.canChoose(controller.getId(), source, game)) { while (controller.chooseUse(outcome, "Look at a face down creature controlled by " + player.getLogName() + "?", source, game)) { target.clearChosen(); diff --git a/Mage.Sets/src/mage/cards/s/StandOrFall.java b/Mage.Sets/src/mage/cards/s/StandOrFall.java index d9aa5f889b3..d17588f3ae2 100644 --- a/Mage.Sets/src/mage/cards/s/StandOrFall.java +++ b/Mage.Sets/src/mage/cards/s/StandOrFall.java @@ -1,9 +1,9 @@ package mage.cards.s; import mage.abilities.Ability; -import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.combat.CantBlockAllEffect; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -17,7 +17,7 @@ import mage.filter.predicate.permanent.PermanentReferenceInCollectionPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import java.util.ArrayList; import java.util.List; @@ -77,7 +77,7 @@ class StandOrFallEffect extends OneShotEffect { } FilterCreaturePermanent opponentFilter = new FilterCreaturePermanent(); opponentFilter.add(new ControllerIdPredicate(oppId)); - TargetCreaturePermanent creatures = new TargetCreaturePermanent(0, Integer.MAX_VALUE, opponentFilter, true); + TargetPermanent creatures = new TargetPermanent(0, Integer.MAX_VALUE, opponentFilter, true); List pile1 = new ArrayList<>(); if (player.choose(Outcome.Neutral, creatures, source, game)) { List targets = creatures.getTargets(); diff --git a/Mage.Sets/src/mage/cards/s/StruggleForSkemfar.java b/Mage.Sets/src/mage/cards/s/StruggleForSkemfar.java index 13f0055c916..37ed7ade191 100644 --- a/Mage.Sets/src/mage/cards/s/StruggleForSkemfar.java +++ b/Mage.Sets/src/mage/cards/s/StruggleForSkemfar.java @@ -8,8 +8,8 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.counters.CounterType; import mage.filter.StaticFilters; +import mage.target.TargetPermanent; import mage.target.common.TargetControlledCreaturePermanent; -import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -28,8 +28,8 @@ public final class StruggleForSkemfar extends CardImpl { "(Each deals damage equal to its power to the other.)" )); this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent()); - this.getSpellAbility().addTarget(new TargetCreaturePermanent( - 0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL, false + this.getSpellAbility().addTarget(new TargetPermanent( + 0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL )); // Foretell {G} diff --git a/Mage.Sets/src/mage/cards/s/SwayOfIllusion.java b/Mage.Sets/src/mage/cards/s/SwayOfIllusion.java index e312df45a2f..d5240b2134b 100644 --- a/Mage.Sets/src/mage/cards/s/SwayOfIllusion.java +++ b/Mage.Sets/src/mage/cards/s/SwayOfIllusion.java @@ -1,19 +1,16 @@ - package mage.cards.s; -import java.util.UUID; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.continuous.BecomesColorTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.StaticFilters; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author fireshoes */ public final class SwayOfIllusion extends CardImpl { @@ -22,10 +19,9 @@ public final class SwayOfIllusion extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}"); // Any number of target creatures become the color of your choice until end of turn. - Effect effect = new BecomesColorTargetEffect(Duration.EndOfTurn); - effect.setText("Any number of target creatures become the color of your choice until end of turn"); - this.getSpellAbility().addEffect(effect); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, Integer.MAX_VALUE, StaticFilters.FILTER_PERMANENT_CREATURE, false)); + this.getSpellAbility().addEffect(new BecomesColorTargetEffect(Duration.EndOfTurn) + .setText("Any number of target creatures become the color of your choice until end of turn")); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, Integer.MAX_VALUE)); // Draw a card. this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("
")); diff --git a/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java b/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java index 3fd3f65fb23..85f9c3e17f8 100644 --- a/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java +++ b/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java @@ -42,7 +42,7 @@ public final class TamiyoFieldResearcher extends CardImpl { // +1: Choose up to two target creatures. Until your next turn, whenever either of those creatures deals combat damage, you draw a card. Ability ability = new LoyaltyAbility(new TamiyoFieldResearcherEffect1(), 1); - ability.addTarget(new TargetCreaturePermanent(0, 2, StaticFilters.FILTER_PERMANENT_CREATURES, false)); + ability.addTarget(new TargetCreaturePermanent(0, 2)); this.addAbility(ability); // -2: Tap up to two target nonland permanents. They don't untap during their controller's next untap step. diff --git a/Mage.Sets/src/mage/cards/t/ThisIsHowItEnds.java b/Mage.Sets/src/mage/cards/t/ThisIsHowItEnds.java index 15b6ed745aa..b9aaf454eed 100644 --- a/Mage.Sets/src/mage/cards/t/ThisIsHowItEnds.java +++ b/Mage.Sets/src/mage/cards/t/ThisIsHowItEnds.java @@ -1,36 +1,40 @@ package mage.cards.t; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ShuffleIntoLibraryTargetEffect; -import mage.cards.*; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; import mage.choices.FaceVillainousChoice; import mage.choices.VillainousChoice; -import mage.constants.*; -import mage.game.Game; -import mage.filter.StaticFilters; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.TargetController; import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; import mage.players.Player; +import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * - * @author padfoothelix + * @author padfoothelix */ public final class ThisIsHowItEnds extends CardImpl { public ThisIsHowItEnds(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{B}"); - - // Target creature's owner shuffles it into their library, then faces a villainous choice -- They lose 5 life, or they shuffle another creature they own into their library. - this.getSpellAbility().addEffect( - new ShuffleIntoLibraryTargetEffect() - .setText("target creature's owner shuffles it into their library,") - ); - this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - this.getSpellAbility().addEffect(new ThisIsHowItEndsEffect()); + // Target creature's owner shuffles it into their library, then faces a villainous choice -- They lose 5 life, or they shuffle another creature they own into their library. + this.getSpellAbility().addEffect( + new ShuffleIntoLibraryTargetEffect() + .setText("target creature's owner shuffles it into their library,") + ); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addEffect(new ThisIsHowItEndsEffect()); } private ThisIsHowItEnds(final ThisIsHowItEnds card) { @@ -46,26 +50,26 @@ public final class ThisIsHowItEnds extends CardImpl { class ThisIsHowItEndsEffect extends OneShotEffect { private static final FaceVillainousChoice choice = new FaceVillainousChoice( - Outcome.Removal, new ThisIsHowItEndsFirstChoice(), new ThisIsHowItEndsSecondChoice() - ); + Outcome.Removal, new ThisIsHowItEndsFirstChoice(), new ThisIsHowItEndsSecondChoice() + ); ThisIsHowItEndsEffect() { - super(Outcome.Benefit); - staticText = "then " + choice.generateRule(); + super(Outcome.Benefit); + staticText = "then " + choice.generateRule(); } private ThisIsHowItEndsEffect(final ThisIsHowItEndsEffect effect) { - super(effect); + super(effect); } @Override public ThisIsHowItEndsEffect copy() { - return new ThisIsHowItEndsEffect(this); + return new ThisIsHowItEndsEffect(this); } @Override public boolean apply(Game game, Ability source) { - UUID targetOwnerId = game.getOwnerId(getTargetPointer().getFirst(game, source)); + UUID targetOwnerId = game.getOwnerId(getTargetPointer().getFirst(game, source)); Player targetOwner = game.getPlayer(targetOwnerId); choice.faceChoice(targetOwner, game, source); return true; @@ -74,13 +78,13 @@ class ThisIsHowItEndsEffect extends OneShotEffect { class ThisIsHowItEndsFirstChoice extends VillainousChoice { ThisIsHowItEndsFirstChoice() { - super("They lose 5 life","You lose 5 life"); + super("They lose 5 life", "You lose 5 life"); } @Override public boolean doChoice(Player player, Game game, Ability source) { player.loseLife(5, game, source, false); - return true; + return true; } } @@ -89,7 +93,7 @@ class ThisIsHowItEndsSecondChoice extends VillainousChoice { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature you own"); static { - filter.add(TargetController.YOU.getOwnerPredicate()); + filter.add(TargetController.YOU.getOwnerPredicate()); } ThisIsHowItEndsSecondChoice() { @@ -98,11 +102,12 @@ class ThisIsHowItEndsSecondChoice extends VillainousChoice { @Override public boolean doChoice(Player player, Game game, Ability source) { - TargetCreaturePermanent target = new TargetCreaturePermanent(1, 1, filter, true); - target.withChooseHint("to shuffle into your library"); + TargetPermanent target = new TargetPermanent(filter); + target.withNotTarget(true); + target.withChooseHint("to shuffle into your library"); player.chooseTarget(Outcome.Detriment, target, source, game); - Cards cards = new CardsImpl(target.getTargets()); - player.shuffleCardsToLibrary(cards, game, source); - return true; + Cards cards = new CardsImpl(target.getTargets()); + player.shuffleCardsToLibrary(cards, game, source); + return true; } } diff --git a/Mage.Sets/src/mage/cards/t/TidalSurge.java b/Mage.Sets/src/mage/cards/t/TidalSurge.java index 0a0b749abad..2651c81d2bb 100644 --- a/Mage.Sets/src/mage/cards/t/TidalSurge.java +++ b/Mage.Sets/src/mage/cards/t/TidalSurge.java @@ -1,7 +1,5 @@ - package mage.cards.t; -import java.util.UUID; import mage.abilities.effects.common.TapTargetEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -10,10 +8,11 @@ import mage.constants.CardType; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.AbilityPredicate; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; + +import java.util.UUID; /** - * * @author Quercitron */ public final class TidalSurge extends CardImpl { @@ -23,14 +22,13 @@ public final class TidalSurge extends CardImpl { static { filter.add(Predicates.not(new AbilityPredicate(FlyingAbility.class))); } - - public TidalSurge(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{1}{U}"); + public TidalSurge(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{U}"); // Tap up to three target creatures without flying. this.getSpellAbility().addEffect(new TapTargetEffect("tap up to three target creatures without flying")); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 3, filter, false)); + this.getSpellAbility().addTarget(new TargetPermanent(0, 3, filter)); } private TidalSurge(final TidalSurge card) { diff --git a/Mage.Sets/src/mage/cards/t/TrickShot.java b/Mage.Sets/src/mage/cards/t/TrickShot.java index 8bf34ed7989..9eeb2b6385f 100644 --- a/Mage.Sets/src/mage/cards/t/TrickShot.java +++ b/Mage.Sets/src/mage/cards/t/TrickShot.java @@ -7,6 +7,7 @@ import mage.constants.CardType; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.other.AnotherTargetPredicate; import mage.filter.predicate.permanent.TokenPredicate; +import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; import mage.target.targetpointer.SecondTargetPointer; @@ -29,7 +30,7 @@ public final class TrickShot extends CardImpl { // Trick Shot deals 6 damage to target creature and 2 damage to up to one other target creature token. this.getSpellAbility().addTarget(new TargetCreaturePermanent().setTargetTag(1)); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1, filter, false).setTargetTag(2)); + this.getSpellAbility().addTarget(new TargetPermanent(0, 1, filter).setTargetTag(2)); this.getSpellAbility().addEffect(new DamageTargetEffect(6, true, "", true)); this.getSpellAbility().addEffect( new DamageTargetEffect(2, true, "", true) diff --git a/Mage.Sets/src/mage/cards/t/Twigwalker.java b/Mage.Sets/src/mage/cards/t/Twigwalker.java index 3951117db70..423bbc45daa 100644 --- a/Mage.Sets/src/mage/cards/t/Twigwalker.java +++ b/Mage.Sets/src/mage/cards/t/Twigwalker.java @@ -1,22 +1,21 @@ package mage.cards.t; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.continuous.BoostTargetEffect; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.StaticFilters; +import mage.constants.SubType; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class Twigwalker extends CardImpl { @@ -31,7 +30,7 @@ public final class Twigwalker extends CardImpl { // {1}{G}, Sacrifice Twigwalker: Two target creatures each get +2/+2 until end of turn. Ability ability = new SimpleActivatedAbility(new BoostTargetEffect(2, 2, Duration.EndOfTurn), new ManaCostsImpl<>("{1}{G}")); ability.addCost(new SacrificeSourceCost()); - ability.addTarget(new TargetCreaturePermanent(2, 2, StaticFilters.FILTER_PERMANENT_CREATURES, false)); + ability.addTarget(new TargetCreaturePermanent(2)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/u/UrgeToFeed.java b/Mage.Sets/src/mage/cards/u/UrgeToFeed.java index bc572bc69ed..1d5f88995f1 100644 --- a/Mage.Sets/src/mage/cards/u/UrgeToFeed.java +++ b/Mage.Sets/src/mage/cards/u/UrgeToFeed.java @@ -1,7 +1,5 @@ - package mage.cards.u; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; @@ -13,17 +11,19 @@ import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.TappedPredicate; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author jeffwadsworth */ public final class UrgeToFeed extends CardImpl { public UrgeToFeed(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{B}{B}"); // Target creature gets -3/-3 until end of turn. You may tap any number of untapped Vampire creatures you control. If you do, put a +1/+1 counter on each of those Vampires. this.getSpellAbility().addEffect(new BoostTargetEffect(-3, -3, Duration.EndOfTurn)); @@ -62,14 +62,13 @@ class UrgeToFeedEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - TargetCreaturePermanent target = new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, true); - if (target.canChoose(source.getControllerId(), source, game) && target.choose(Outcome.Tap, source.getControllerId(), source.getSourceId(), source, game)) { - for (UUID vampireId : target.getTargets()) { - Permanent vampire = game.getPermanent(vampireId); - if (vampire != null) { - vampire.tap(source, game); - vampire.addCounters(CounterType.P1P1.createInstance(), source.getControllerId(), source, game); - } + TargetPermanent target = new TargetPermanent(0, Integer.MAX_VALUE, filter, true); + target.choose(Outcome.Tap, source.getControllerId(), source.getSourceId(), source, game); + for (UUID vampireId : target.getTargets()) { + Permanent vampire = game.getPermanent(vampireId); + if (vampire != null) { + vampire.tap(source, game); + vampire.addCounters(CounterType.P1P1.createInstance(), source.getControllerId(), source, game); } } return true; diff --git a/Mage.Sets/src/mage/cards/v/VesuvanShapeshifter.java b/Mage.Sets/src/mage/cards/v/VesuvanShapeshifter.java index 40f766221b7..bcab5c07bda 100644 --- a/Mage.Sets/src/mage/cards/v/VesuvanShapeshifter.java +++ b/Mage.Sets/src/mage/cards/v/VesuvanShapeshifter.java @@ -4,7 +4,6 @@ import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.AsEntersBattlefieldAbility; -import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.AsTurnedFaceUpEffect; @@ -13,16 +12,18 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CopyEffect; import mage.abilities.effects.common.CopyPermanentEffect; import mage.abilities.keyword.MorphAbility; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.SubType; import mage.filter.StaticFilters; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.AnotherPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import mage.util.functions.CopyApplier; import java.util.UUID; @@ -104,11 +105,7 @@ class VesuvanShapeshifterEffect extends OneShotEffect { Permanent copyToCreature = game.getPermanent(source.getSourceId()); if (copyToCreature != null) { - FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature"); - filter.add(AnotherPredicate.instance); - - TargetCreaturePermanent target = new TargetCreaturePermanent(0, 1, filter, true); - + TargetPermanent target = new TargetPermanent(0, 1, StaticFilters.FILTER_ANOTHER_CREATURE, true); if (controller != null && controller.chooseTarget(Outcome.BecomeCreature, target, source, game) && !target.getTargets().isEmpty()) { Permanent copyFromCreature = game.getPermanentOrLKIBattlefield(target.getFirstTarget()); if (copyFromCreature != null) { diff --git a/Mage.Sets/src/mage/cards/w/WeaverOfLies.java b/Mage.Sets/src/mage/cards/w/WeaverOfLies.java index e52eacded1b..23d2e47dd66 100644 --- a/Mage.Sets/src/mage/cards/w/WeaverOfLies.java +++ b/Mage.Sets/src/mage/cards/w/WeaverOfLies.java @@ -1,11 +1,8 @@ - package mage.cards.w; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility; -import mage.constants.SubType; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.BecomesFaceDownCreatureAllEffect; @@ -14,6 +11,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicate; import mage.filter.predicate.Predicates; @@ -22,10 +20,11 @@ import mage.filter.predicate.mageobject.AnotherPredicate; import mage.filter.predicate.permanent.PermanentIdPredicate; import mage.game.Game; import mage.target.Target; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; + +import java.util.UUID; /** - * * @author TheElk801 */ public final class WeaverOfLies extends CardImpl { @@ -49,7 +48,7 @@ public final class WeaverOfLies extends CardImpl { // When Weaver of Lies is turned face up, turn any number of target creatures with a morph ability other than Weaver of Lies face down. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new WeaverOfLiesEffect(), false, false); - ability.addTarget(new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, false)); + ability.addTarget(new TargetPermanent(0, Integer.MAX_VALUE, filter)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/w/WerefoxBodyguard.java b/Mage.Sets/src/mage/cards/w/WerefoxBodyguard.java index b41bed744a6..d1d4ca8a24d 100644 --- a/Mage.Sets/src/mage/cards/w/WerefoxBodyguard.java +++ b/Mage.Sets/src/mage/cards/w/WerefoxBodyguard.java @@ -16,7 +16,7 @@ import mage.constants.SubType; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.AnotherPredicate; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import java.util.UUID; @@ -46,7 +46,7 @@ public final class WerefoxBodyguard extends CardImpl { // When Werefox Bodyguard enters the battlefield, exile up to one other target non-Fox creature until Werefox Bodyguard leaves the battlefield. Ability ability = new EntersBattlefieldTriggeredAbility(new ExileUntilSourceLeavesEffect()); - ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false)); + ability.addTarget(new TargetPermanent(0, 1, filter)); this.addAbility(ability); // {1}{W}, Sacrifice Werefox Bodyguard: You gain 2 life. diff --git a/Mage.Sets/src/mage/cards/w/WickedPact.java b/Mage.Sets/src/mage/cards/w/WickedPact.java index 7af7624f848..c872ccf577c 100644 --- a/Mage.Sets/src/mage/cards/w/WickedPact.java +++ b/Mage.Sets/src/mage/cards/w/WickedPact.java @@ -1,26 +1,26 @@ package mage.cards.w; -import java.util.UUID; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.LoseLifeSourceControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.StaticFilters; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; + +import java.util.UUID; /** - * * @author fireshoes */ public final class WickedPact extends CardImpl { public WickedPact(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{1}{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}{B}"); // Destroy two target nonblack creatures. You lose 5 life. this.getSpellAbility().addEffect(new DestroyTargetEffect()); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(2, 2, StaticFilters.FILTER_PERMANENT_CREATURES_NON_BLACK, false)); + this.getSpellAbility().addTarget(new TargetPermanent(2, StaticFilters.FILTER_PERMANENT_CREATURES_NON_BLACK)); this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(5)); } diff --git a/Mage.Sets/src/mage/cards/z/ZndrspltsJudgment.java b/Mage.Sets/src/mage/cards/z/ZndrspltsJudgment.java index 7d894bfaee6..0ae82739bea 100644 --- a/Mage.Sets/src/mage/cards/z/ZndrspltsJudgment.java +++ b/Mage.Sets/src/mage/cards/z/ZndrspltsJudgment.java @@ -1,7 +1,5 @@ - package mage.cards.z; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; @@ -16,11 +14,12 @@ import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.ControllerIdPredicate; import mage.game.Game; import mage.players.Player; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import mage.target.targetpointer.FixedTarget; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class ZndrspltsJudgment extends CardImpl { @@ -72,7 +71,8 @@ class ZndrspltsJudgmentEffect extends OneShotEffect { } FilterCreaturePermanent filter = new FilterCreaturePermanent("creature you control"); filter.add(new ControllerIdPredicate(player.getId())); - TargetCreaturePermanent target = new TargetCreaturePermanent(1, 1, filter, true); + TargetPermanent target = new TargetPermanent(filter); + target.withNotTarget(true); if (!player.choose(Outcome.Copy, target, source, game)) { continue; } @@ -83,7 +83,8 @@ class ZndrspltsJudgmentEffect extends OneShotEffect { for (Player player : choice.getFoes()) { FilterCreaturePermanent filter = new FilterCreaturePermanent("creature you control"); filter.add(new ControllerIdPredicate(player.getId())); - TargetCreaturePermanent target = new TargetCreaturePermanent(1, 1, filter, true); + TargetPermanent target = new TargetPermanent(filter); + target.withNotTarget(true); if (!player.choose(Outcome.ReturnToHand, target, source, game)) { continue; } diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/SupportEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/SupportEffect.java index 1edcde3b5b1..5d44fbe1263 100644 --- a/Mage/src/main/java/mage/abilities/effects/keyword/SupportEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/keyword/SupportEffect.java @@ -6,7 +6,6 @@ import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.cards.Card; import mage.counters.CounterType; -import mage.filter.common.FilterCreaturePermanent; import mage.target.common.TargetCreaturePermanent; import mage.util.CardUtil; @@ -23,7 +22,7 @@ public class SupportEffect extends AddCountersTargetEffect { this.amountSupportTargets = StaticValue.get(amount); this.otherPermanent = otherPermanent; if (card.isInstantOrSorcery()) { - card.getSpellAbility().addTarget(new TargetCreaturePermanent(0, amount, new FilterCreaturePermanent("target creatures"), false)); + card.getSpellAbility().addTarget(new TargetCreaturePermanent(0, amount)); } staticText = setText(); } diff --git a/Mage/src/main/java/mage/abilities/keyword/SupportAbility.java b/Mage/src/main/java/mage/abilities/keyword/SupportAbility.java index 79b84114d31..24673729ef7 100644 --- a/Mage/src/main/java/mage/abilities/keyword/SupportAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/SupportAbility.java @@ -1,12 +1,13 @@ - package mage.abilities.keyword; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.keyword.SupportEffect; import mage.cards.Card; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.AnotherPredicate; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; /** * 701.32. Support @@ -19,19 +20,25 @@ import mage.target.common.TargetCreaturePermanent; */ public class SupportAbility extends EntersBattlefieldTriggeredAbility { + private static final FilterPermanent filter = new FilterCreaturePermanent("other target creatures"); + + static { + filter.add(AnotherPredicate.instance); + } + /* * For enchantments, the text should not include the word "other". * The otherPermanent choice removes the word "other" from rule text creation. */ public SupportAbility(Card card, int amount, boolean otherPermanent) { super(new SupportEffect(card, amount, otherPermanent)); - if (!card.isInstantOrSorcery()) { - FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures"); - if (card.isCreature()) { - filter.add(AnotherPredicate.instance); - filter.setMessage("other target creatures"); - } - addTarget(new TargetCreaturePermanent(0, amount, filter, false)); + if (card.isInstantOrSorcery()) { + return; + } + if (card.isCreature()) { + addTarget(new TargetPermanent(0, amount, StaticFilters.FILTER_PERMANENT_CREATURES)); + } else { + addTarget(new TargetPermanent(0, amount, filter)); } } diff --git a/Mage/src/main/java/mage/game/command/planes/BantPlane.java b/Mage/src/main/java/mage/game/command/planes/BantPlane.java index 0a8f555508e..4b5ec23f954 100644 --- a/Mage/src/main/java/mage/game/command/planes/BantPlane.java +++ b/Mage/src/main/java/mage/game/command/planes/BantPlane.java @@ -27,7 +27,7 @@ import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ColorPredicate; import mage.game.command.Plane; import mage.target.Target; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import mage.watchers.common.PlanarRollWatcher; import java.util.ArrayList; @@ -62,7 +62,7 @@ public class BantPlane extends Plane { // Active player can roll the planar die: Whenever you roll {CHAOS}, put a divinity counter on target green, white, or blue creature. That creature gains indestructible for as long as it has a divinity counter on it. Effect chaosEffect = new ConditionalContinuousEffect(new GainAbilityTargetEffect(IndestructibleAbility.getInstance(), Duration.Custom), new TargetHasCounterCondition(CounterType.DIVINITY), rule); - Target chaosTarget = new TargetCreaturePermanent(1, 1, filter2, false); + Target chaosTarget = new TargetPermanent(filter2); Effect chaosEffect2 = new AddCountersTargetEffect(CounterType.DIVINITY.createInstance()); List chaosEffects = new ArrayList(); diff --git a/Mage/src/main/java/mage/game/command/planes/FeedingGroundsPlane.java b/Mage/src/main/java/mage/game/command/planes/FeedingGroundsPlane.java index 2cf165b8343..f10bdc9ca9e 100644 --- a/Mage/src/main/java/mage/game/command/planes/FeedingGroundsPlane.java +++ b/Mage/src/main/java/mage/game/command/planes/FeedingGroundsPlane.java @@ -25,7 +25,7 @@ import mage.game.Game; import mage.game.command.Plane; import mage.game.stack.Spell; import mage.target.Target; -import mage.target.common.TargetCreaturePermanent; +import mage.target.TargetPermanent; import mage.util.CardUtil; import mage.watchers.common.PlanarRollWatcher; @@ -48,7 +48,7 @@ public class FeedingGroundsPlane extends Plane { // Active player can roll the planar die: Whenever you roll {CHAOS}, target red or green creature gets X +1/+1 counters Effect chaosEffect = new AddCountersTargetEffect(CounterType.P1P1.createInstance(), TargetManaValue.instance); - Target chaosTarget = new TargetCreaturePermanent(1, 1, StaticFilters.FILTER_PERMANENT_A_CREATURE, false); + Target chaosTarget = new TargetPermanent(StaticFilters.FILTER_PERMANENT_A_CREATURE); List chaosEffects = new ArrayList<>(); chaosEffects.add(chaosEffect); diff --git a/Mage/src/main/java/mage/target/common/TargetCreaturePermanent.java b/Mage/src/main/java/mage/target/common/TargetCreaturePermanent.java index c7028a67508..b6625374533 100644 --- a/Mage/src/main/java/mage/target/common/TargetCreaturePermanent.java +++ b/Mage/src/main/java/mage/target/common/TargetCreaturePermanent.java @@ -1,4 +1,3 @@ - package mage.target.common; import mage.filter.StaticFilters; @@ -15,7 +14,7 @@ public class TargetCreaturePermanent extends TargetPermanent { } public TargetCreaturePermanent(FilterCreaturePermanent filter) { - this(1, 1, filter, false); + super(1, 1, filter, false); } public TargetCreaturePermanent(int numTargets) { @@ -23,11 +22,7 @@ public class TargetCreaturePermanent extends TargetPermanent { } public TargetCreaturePermanent(int minNumTargets, int maxNumTargets) { - this(minNumTargets, maxNumTargets, maxNumTargets > 1 ? StaticFilters.FILTER_PERMANENT_CREATURES : StaticFilters.FILTER_PERMANENT_CREATURE, false); - } - - public TargetCreaturePermanent(int minNumTargets, int maxNumTargets, FilterCreaturePermanent filter, boolean notTarget) { - super(minNumTargets, maxNumTargets, filter, notTarget); + super(minNumTargets, maxNumTargets, maxNumTargets > 1 ? StaticFilters.FILTER_PERMANENT_CREATURES : StaticFilters.FILTER_PERMANENT_CREATURE, false); } protected TargetCreaturePermanent(final TargetCreaturePermanent target) { diff --git a/Mage/src/main/java/mage/target/common/TargetCreaturePermanentWithDifferentTypes.java b/Mage/src/main/java/mage/target/common/TargetCreaturePermanentWithDifferentTypes.java deleted file mode 100644 index 74013310160..00000000000 --- a/Mage/src/main/java/mage/target/common/TargetCreaturePermanentWithDifferentTypes.java +++ /dev/null @@ -1,49 +0,0 @@ - -package mage.target.common; - -import mage.abilities.Ability; -import mage.filter.common.FilterCreaturePermanent; -import mage.game.Game; -import mage.game.permanent.Permanent; - -import java.util.UUID; - -/** - * @author LevelX2 - */ -public class TargetCreaturePermanentWithDifferentTypes extends TargetCreaturePermanent { - - public TargetCreaturePermanentWithDifferentTypes(int minNumTargets, int maxNumTargets, FilterCreaturePermanent filter, boolean notTarget) { - super(minNumTargets, maxNumTargets, filter, notTarget); - } - - protected TargetCreaturePermanentWithDifferentTypes(final TargetCreaturePermanentWithDifferentTypes target) { - super(target); - } - - @Override - public TargetCreaturePermanentWithDifferentTypes copy() { - return new TargetCreaturePermanentWithDifferentTypes(this); - } - - @Override - public boolean canTarget(UUID controllerId, UUID id, Ability source, Game game) { - if (super.canTarget(controllerId, id, source, game)) { - Permanent creature = game.getPermanent(id); - if (creature != null) { - for (Object object : getTargets()) { - UUID targetId = (UUID) object; - Permanent selectedCreature = game.getPermanent(targetId); - if (selectedCreature != null - && !creature.getId().equals(selectedCreature.getId())) { - if (creature.shareCreatureTypes(game, selectedCreature)) { - return false; - } - } - } - return true; - } - } - return false; - } -}