From ad4b50464658c75d634d329e8703bac78a4bbc4c Mon Sep 17 00:00:00 2001 From: theelk801 Date: Thu, 8 Jan 2026 14:47:36 -0500 Subject: [PATCH] [ECL] Implement Pitiless Fists --- .../src/mage/cards/c/CartoucheOfStrength.java | 57 ++----------------- .../src/mage/cards/m/MeltstridersResolve.java | 35 +----------- Mage.Sets/src/mage/cards/p/PitilessFists.java | 54 ++++++++++++++++++ .../src/mage/cards/w/WarbriarBlessing.java | 38 +------------ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + .../common/FightEnchantedTargetEffect.java | 48 ++++++++++++++++ 6 files changed, 111 insertions(+), 122 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/p/PitilessFists.java create mode 100644 Mage/src/main/java/mage/abilities/effects/common/FightEnchantedTargetEffect.java diff --git a/Mage.Sets/src/mage/cards/c/CartoucheOfStrength.java b/Mage.Sets/src/mage/cards/c/CartoucheOfStrength.java index ba2f234c7de..62251146d16 100644 --- a/Mage.Sets/src/mage/cards/c/CartoucheOfStrength.java +++ b/Mage.Sets/src/mage/cards/c/CartoucheOfStrength.java @@ -2,12 +2,11 @@ package mage.cards.c; import mage.abilities.Ability; -import mage.abilities.Mode; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.Effect; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.FightEnchantedTargetEffect; import mage.abilities.effects.common.continuous.BoostEnchantedEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.keyword.EnchantAbility; @@ -15,8 +14,6 @@ import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.game.Game; -import mage.game.permanent.Permanent; import mage.target.TargetPermanent; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetOpponentsCreaturePermanent; @@ -24,14 +21,13 @@ import mage.target.common.TargetOpponentsCreaturePermanent; import java.util.UUID; /** - * * @author stravant */ public final class CartoucheOfStrength extends CardImpl { public CartoucheOfStrength(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}"); - + this.subtype.add(SubType.AURA, SubType.CARTOUCHE); // Enchant creature you control @@ -42,7 +38,8 @@ public final class CartoucheOfStrength extends CardImpl { this.addAbility(ability); // When Cartouche of Strength enters the battlefield, you may have enchanted creature fight target creature an opponent controls. - ability = new EntersBattlefieldTriggeredAbility(new FightEnchantedTargetEffect(), /* optional = */true); + ability = new EntersBattlefieldTriggeredAbility(new FightEnchantedTargetEffect() + .setText("enchanted creature fight target creature an opponent controls"), true); ability.addTarget(new TargetOpponentsCreaturePermanent()); this.addAbility(ability); @@ -63,49 +60,3 @@ public final class CartoucheOfStrength extends CardImpl { return new CartoucheOfStrength(this); } } - -/** - * - * @author stravant - */ -class FightEnchantedTargetEffect extends OneShotEffect { - - FightEnchantedTargetEffect() { - super(Outcome.Damage); - this.staticText = "you may have enchanted creature fight target creature an opponent controls. " + - "(Each deals damage equal to its power to the other.)"; - } - - private FightEnchantedTargetEffect(final FightEnchantedTargetEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent sourcePermanent = game.getPermanent(source.getSourceId()); - if (sourcePermanent != null) { - Permanent originalCreature = game.getPermanentOrLKIBattlefield(sourcePermanent.getAttachedTo()); - if (originalCreature != null) { - Permanent enchantedCreature = game.getPermanent(sourcePermanent.getAttachedTo()); - // only if target is legal the effect will be applied - if (source.getTargets().get(0).isLegal(source, game)) { - Permanent creature1 = game.getPermanent(source.getTargets().get(0).getFirstTarget()); - // 20110930 - 701.10 - if (creature1 != null && enchantedCreature != null) { - if (creature1.isCreature(game) && enchantedCreature.isCreature(game)) { - return enchantedCreature.fight(creature1, source, game); - } - } - } - if (!game.isSimulation()) - game.informPlayers(originalCreature.getLogName() + ": Fighting effect has been fizzled."); - } - } - return false; - } - - @Override - public FightEnchantedTargetEffect copy() { - return new FightEnchantedTargetEffect(this); - } -} diff --git a/Mage.Sets/src/mage/cards/m/MeltstridersResolve.java b/Mage.Sets/src/mage/cards/m/MeltstridersResolve.java index 88fbff5be93..20a88112d62 100644 --- a/Mage.Sets/src/mage/cards/m/MeltstridersResolve.java +++ b/Mage.Sets/src/mage/cards/m/MeltstridersResolve.java @@ -3,8 +3,8 @@ package mage.cards.m; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.FightEnchantedTargetEffect; import mage.abilities.effects.common.combat.CantBeBlockedByMoreThanOneAttachedEffect; import mage.abilities.effects.common.continuous.BoostEnchantedEffect; import mage.abilities.keyword.EnchantAbility; @@ -14,13 +14,10 @@ import mage.constants.AttachmentType; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; -import mage.game.Game; -import mage.game.permanent.Permanent; import mage.target.TargetPermanent; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetOpponentsCreaturePermanent; -import java.util.Optional; import java.util.UUID; /** @@ -40,7 +37,7 @@ public final class MeltstridersResolve extends CardImpl { this.addAbility(new EnchantAbility(auraTarget)); // When this Aura enters, enchanted creature fights up to one target creature an opponent controls. - Ability ability = new EntersBattlefieldTriggeredAbility(new MeltstridersResolveEffect()); + Ability ability = new EntersBattlefieldTriggeredAbility(new FightEnchantedTargetEffect()); ability.addTarget(new TargetOpponentsCreaturePermanent(0, 1)); this.addAbility(ability); @@ -60,31 +57,3 @@ public final class MeltstridersResolve extends CardImpl { return new MeltstridersResolve(this); } } - -class MeltstridersResolveEffect extends OneShotEffect { - - MeltstridersResolveEffect() { - super(Outcome.Benefit); - staticText = "enchanted creature fights up to one target creature an opponent controls"; - } - - private MeltstridersResolveEffect(final MeltstridersResolveEffect effect) { - super(effect); - } - - @Override - public MeltstridersResolveEffect copy() { - return new MeltstridersResolveEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = Optional - .ofNullable(source.getSourcePermanentOrLKI(game)) - .map(Permanent::getAttachedTo) - .map(game::getPermanent) - .orElse(null); - Permanent creature = game.getPermanent(getTargetPointer().getFirst(game, source)); - return permanent != null && creature != null && permanent.fight(creature, source, game); - } -} diff --git a/Mage.Sets/src/mage/cards/p/PitilessFists.java b/Mage.Sets/src/mage/cards/p/PitilessFists.java new file mode 100644 index 00000000000..a41322763c4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PitilessFists.java @@ -0,0 +1,54 @@ +package mage.cards.p; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.FightEnchantedTargetEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.target.TargetPermanent; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetOpponentsCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class PitilessFists extends CardImpl { + + public PitilessFists(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}"); + + this.subtype.add(SubType.AURA); + + // Enchant creature you control + TargetPermanent auraTarget = new TargetControlledCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + this.addAbility(new EnchantAbility(auraTarget)); + + // When this Aura enters, enchanted creature fights up to one target creature an opponent controls. + Ability ability = new EntersBattlefieldTriggeredAbility(new FightEnchantedTargetEffect()); + ability.addTarget(new TargetOpponentsCreaturePermanent(0, 1)); + this.addAbility(ability); + + // Enchanted creature gets +2/+2. + this.addAbility(new SimpleStaticAbility(new BoostEnchantedEffect(2, 2))); + } + + private PitilessFists(final PitilessFists card) { + super(card); + } + + @Override + public PitilessFists copy() { + return new PitilessFists(this); + } +} diff --git a/Mage.Sets/src/mage/cards/w/WarbriarBlessing.java b/Mage.Sets/src/mage/cards/w/WarbriarBlessing.java index ee17f2c4a7b..36c705727e2 100644 --- a/Mage.Sets/src/mage/cards/w/WarbriarBlessing.java +++ b/Mage.Sets/src/mage/cards/w/WarbriarBlessing.java @@ -3,8 +3,8 @@ package mage.cards.w; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.FightEnchantedTargetEffect; import mage.abilities.effects.common.continuous.BoostEnchantedEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; @@ -13,8 +13,6 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; import mage.filter.StaticFilters; -import mage.game.Game; -import mage.game.permanent.Permanent; import mage.target.TargetPermanent; import java.util.UUID; @@ -37,7 +35,7 @@ public final class WarbriarBlessing extends CardImpl { this.addAbility(ability); // When Warbriar Blessing enters the battlefield, enchanted creature fights up to one target creature you don't control. - ability = new EntersBattlefieldTriggeredAbility(new WarbriarBlessingEffect()); + ability = new EntersBattlefieldTriggeredAbility(new FightEnchantedTargetEffect()); ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL, false)); this.addAbility(ability); @@ -54,35 +52,3 @@ public final class WarbriarBlessing extends CardImpl { return new WarbriarBlessing(this); } } - -class WarbriarBlessingEffect extends OneShotEffect { - - WarbriarBlessingEffect() { - super(Outcome.Benefit); - staticText = "enchanted creature fights up to one target creature you don't control. " + - "(Each deals damage equal to its power to the other.)"; - } - - private WarbriarBlessingEffect(final WarbriarBlessingEffect effect) { - super(effect); - } - - @Override - public WarbriarBlessingEffect copy() { - return new WarbriarBlessingEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = source.getSourcePermanentIfItStillExists(game); - Permanent opponentsPermanent = game.getPermanent(source.getFirstTarget()); - if (permanent == null || opponentsPermanent == null) { - return false; - } - Permanent attach = game.getPermanent(permanent.getAttachedTo()); - if (attach == null) { - return false; - } - return attach.fight(opponentsPermanent, source, game); - } -} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index d4838f9b912..29534e5c5a0 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -177,6 +177,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Personify", 28, Rarity.UNCOMMON, mage.cards.p.Personify.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Personify", 402, Rarity.UNCOMMON, mage.cards.p.Personify.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Pestered Wellguard", 63, Rarity.UNCOMMON, mage.cards.p.PesteredWellguard.class)); + cards.add(new SetCardInfo("Pitiless Fists", 187, Rarity.UNCOMMON, mage.cards.p.PitilessFists.class)); cards.add(new SetCardInfo("Plains", 269, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Plains", 274, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Plains", 279, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/FightEnchantedTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/FightEnchantedTargetEffect.java new file mode 100644 index 00000000000..d51f26ee10a --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/FightEnchantedTargetEffect.java @@ -0,0 +1,48 @@ +package mage.abilities.effects.common; + +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.permanent.Permanent; + +import java.util.Optional; + +/** + * @author TheElk801 + */ +public class FightEnchantedTargetEffect extends OneShotEffect { + + public FightEnchantedTargetEffect() { + super(Outcome.Benefit); + } + + private FightEnchantedTargetEffect(final FightEnchantedTargetEffect effect) { + super(effect); + } + + @Override + public FightEnchantedTargetEffect copy() { + return new FightEnchantedTargetEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = Optional + .ofNullable(source.getSourcePermanentOrLKI(game)) + .map(Permanent::getAttachedTo) + .map(game::getPermanent) + .orElse(null); + Permanent creature = game.getPermanent(getTargetPointer().getFirst(game, source)); + return permanent != null && creature != null && permanent.fight(creature, source, game); + } + + @Override + public String getText(Mode mode) { + if (staticText != null && !staticText.isEmpty()) { + return staticText; + } + return "enchanted creature fights " + getTargetPointer().describeTargets(mode.getTargets(), "it"); + } +}