From 3b1b5cec9e57539afb0b3b83be222babe2b6c798 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 14 Feb 2022 17:34:46 -0500 Subject: [PATCH] [NEC] Implemented Ruthless Technomancer --- .../mage/cards/r/RuthlessTechnomancer.java | 124 ++++++++++++++++++ .../src/mage/sets/NeonDynastyCommander.java | 1 + .../costs/common/SacrificeXTargetCost.java | 16 ++- 3 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/r/RuthlessTechnomancer.java diff --git a/Mage.Sets/src/mage/cards/r/RuthlessTechnomancer.java b/Mage.Sets/src/mage/cards/r/RuthlessTechnomancer.java new file mode 100644 index 00000000000..957365f1689 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RuthlessTechnomancer.java @@ -0,0 +1,124 @@ +package mage.cards.r; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeXTargetCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.GetXValue; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledArtifactPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.common.FilterCreatureCard; +import mage.filter.predicate.mageobject.ManaValuePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.TreasureToken; +import mage.players.Player; +import mage.target.TargetPermanent; +import mage.target.common.TargetCardInYourGraveyard; +import mage.target.targetadjustment.TargetAdjuster; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class RuthlessTechnomancer extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledArtifactPermanent("artifacts"); + + public RuthlessTechnomancer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // When Ruthless Technomancer enters the battlefield, you may sacrifice another creature you control. If you do, create a number of Treasure tokens equal to that creature's power. + this.addAbility(new EntersBattlefieldTriggeredAbility(new RuthlessTechnomancerEffect())); + + // {2}{B}, Sacrifice X artifacts: Return target creature card with power X or less from your graveyard to the battlefield. X can't be 0. + Ability ability = new SimpleActivatedAbility( + new ReturnFromGraveyardToBattlefieldTargetEffect() + .setText("return target creature card with power X " + + "or less from your graveyard to the battlefield"), + new ManaCostsImpl<>("{2}{B}") + ); + ability.addCost(new SacrificeXTargetCost(filter, false, 1)); + this.addAbility(ability.setTargetAdjuster(RuthlessTechnomancerAdjuster.instance)); + } + + private RuthlessTechnomancer(final RuthlessTechnomancer card) { + super(card); + } + + @Override + public RuthlessTechnomancer copy() { + return new RuthlessTechnomancer(this); + } +} + +enum RuthlessTechnomancerAdjuster implements TargetAdjuster { + instance; + + @Override + public void adjustTargets(Ability ability, Game game) { + int xValue = GetXValue.instance.calculate(game, ability, null); + FilterCard filter = new FilterCreatureCard( + "creature card in your graveyard with mana value " + xValue + " or less" + ); + filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, xValue)); + ability.getTargets().clear(); + ability.addTarget(new TargetCardInYourGraveyard(filter)); + } +} + +class RuthlessTechnomancerEffect extends OneShotEffect { + + RuthlessTechnomancerEffect() { + super(Outcome.Benefit); + staticText = "you may sacrifice another creature you control. If you do, " + + "create a number of Treasure tokens equal to that creature's power. X can't be 0"; + } + + private RuthlessTechnomancerEffect(final RuthlessTechnomancerEffect effect) { + super(effect); + } + + @Override + public RuthlessTechnomancerEffect copy() { + return new RuthlessTechnomancerEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null || !game.getBattlefield().contains( + StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, source, game, 1 + )) { + return false; + } + TargetPermanent target = new TargetPermanent( + 0, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, true + ); + player.choose(outcome, target, source.getSourceId(), game); + Permanent permanent = game.getPermanent(target.getFirstTarget()); + if (permanent == null || !permanent.sacrifice(source, game)) { + return false; + } + int power = permanent.getPower().getValue(); + return power < 1 || new TreasureToken().putOntoBattlefield(power, game, source); + } +} diff --git a/Mage.Sets/src/mage/sets/NeonDynastyCommander.java b/Mage.Sets/src/mage/sets/NeonDynastyCommander.java index 5ef54ba2ad2..630d454918e 100644 --- a/Mage.Sets/src/mage/sets/NeonDynastyCommander.java +++ b/Mage.Sets/src/mage/sets/NeonDynastyCommander.java @@ -115,6 +115,7 @@ public final class NeonDynastyCommander extends ExpansionSet { cards.add(new SetCardInfo("Riddlesmith", 96, Rarity.UNCOMMON, mage.cards.r.Riddlesmith.class)); cards.add(new SetCardInfo("Rishkar's Expertise", 127, Rarity.RARE, mage.cards.r.RishkarsExpertise.class)); cards.add(new SetCardInfo("Rishkar, Peema Renegade", 126, Rarity.RARE, mage.cards.r.RishkarPeemaRenegade.class)); + cards.add(new SetCardInfo("Ruthless Technomancer", 35, Rarity.RARE, mage.cards.r.RuthlessTechnomancer.class)); cards.add(new SetCardInfo("Sai, Master Thopterist", 97, Rarity.RARE, mage.cards.s.SaiMasterThopterist.class)); cards.add(new SetCardInfo("Sakura-Tribe Elder", 128, Rarity.COMMON, mage.cards.s.SakuraTribeElder.class)); cards.add(new SetCardInfo("Shamanic Revelation", 129, Rarity.RARE, mage.cards.s.ShamanicRevelation.class)); diff --git a/Mage/src/main/java/mage/abilities/costs/common/SacrificeXTargetCost.java b/Mage/src/main/java/mage/abilities/costs/common/SacrificeXTargetCost.java index 27d6a1b3f46..fcc8b41a238 100644 --- a/Mage/src/main/java/mage/abilities/costs/common/SacrificeXTargetCost.java +++ b/Mage/src/main/java/mage/abilities/costs/common/SacrificeXTargetCost.java @@ -14,22 +14,29 @@ import mage.target.common.TargetControlledPermanent; */ public class SacrificeXTargetCost extends VariableCostImpl { - protected FilterControlledPermanent filter; + protected final FilterControlledPermanent filter; + private final int minValue; public SacrificeXTargetCost(FilterControlledPermanent filter) { this(filter, false); } public SacrificeXTargetCost(FilterControlledPermanent filter, boolean useAsAdditionalCost) { + this(filter, useAsAdditionalCost, 0); + } + + public SacrificeXTargetCost(FilterControlledPermanent filter, boolean useAsAdditionalCost, int minValue) { super(useAsAdditionalCost ? VariableCostType.ADDITIONAL : VariableCostType.NORMAL, filter.getMessage() + " to sacrifice"); this.text = (useAsAdditionalCost ? "as an additional cost to cast this spell, sacrifice " : "Sacrifice ") + xText + ' ' + filter.getMessage(); this.filter = filter; + this.minValue = minValue; } public SacrificeXTargetCost(final SacrificeXTargetCost cost) { super(cost); this.filter = cost.filter; + this.minValue = cost.minValue; } @Override @@ -37,6 +44,11 @@ public class SacrificeXTargetCost extends VariableCostImpl { return new SacrificeXTargetCost(this); } + @Override + public int getMinValue(Ability source, Game game) { + return minValue; + } + @Override public int getMaxValue(Ability source, Game game) { return game.getBattlefield().count(filter, source.getSourceId(), source.getControllerId(), game); @@ -47,7 +59,7 @@ public class SacrificeXTargetCost extends VariableCostImpl { TargetControlledPermanent target = new TargetControlledPermanent(xValue, xValue, filter, true); return new SacrificeTargetCost(target); } - + public Filter getFilter() { return filter; }