From 2c7a04b346d1115c280795c832a726666e34a4e2 Mon Sep 17 00:00:00 2001 From: Evan Kranzler <theelk801@gmail.com> Date: Fri, 11 Jun 2021 08:59:48 -0400 Subject: [PATCH] [MH2] Implemented Caprichrome --- Mage.Sets/src/mage/cards/c/Caprichrome.java | 45 +++++++ Mage.Sets/src/mage/sets/ModernHorizons2.java | 1 + .../effects/common/DevourEffect.java | 110 +++++++++++------- 3 files changed, 113 insertions(+), 43 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/c/Caprichrome.java diff --git a/Mage.Sets/src/mage/cards/c/Caprichrome.java b/Mage.Sets/src/mage/cards/c/Caprichrome.java new file mode 100644 index 0000000000..cd2e0cbd58 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/Caprichrome.java @@ -0,0 +1,45 @@ +package mage.cards.c; + +import mage.MageInt; +import mage.abilities.effects.common.DevourEffect; +import mage.abilities.keyword.DevourAbility; +import mage.abilities.keyword.FlashAbility; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class Caprichrome extends CardImpl { + + public Caprichrome(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}{W}"); + + this.subtype.add(SubType.GOAT); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // Devour artifact 1 + this.addAbility(new DevourAbility(DevourEffect.DevourFactor.DevourArtifact1)); + } + + private Caprichrome(final Caprichrome card) { + super(card); + } + + @Override + public Caprichrome copy() { + return new Caprichrome(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ModernHorizons2.java b/Mage.Sets/src/mage/sets/ModernHorizons2.java index d1d1918ea1..0c900b0adf 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons2.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons2.java @@ -68,6 +68,7 @@ public final class ModernHorizons2 extends ExpansionSet { cards.add(new SetCardInfo("Cabal Coffers", 301, Rarity.MYTHIC, mage.cards.c.CabalCoffers.class)); cards.add(new SetCardInfo("Cabal Initiate", 78, Rarity.COMMON, mage.cards.c.CabalInitiate.class)); cards.add(new SetCardInfo("Calibrated Blast", 118, Rarity.RARE, mage.cards.c.CalibratedBlast.class)); + cards.add(new SetCardInfo("Caprichrome", 9, Rarity.UNCOMMON, mage.cards.c.Caprichrome.class)); cards.add(new SetCardInfo("Captain Ripley Vance", 119, Rarity.UNCOMMON, mage.cards.c.CaptainRipleyVance.class)); cards.add(new SetCardInfo("Captured by Lagacs", 188, Rarity.COMMON, mage.cards.c.CapturedByLagacs.class)); cards.add(new SetCardInfo("Chainer, Nightmare Adept", 289, Rarity.RARE, mage.cards.c.ChainerNightmareAdept.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/DevourEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DevourEffect.java index 459df5ba06..62b88f4db0 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DevourEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DevourEffect.java @@ -3,10 +3,11 @@ package mage.abilities.effects.common; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.ReplacementEffectImpl; +import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.counters.CounterType; -import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.AnotherPredicate; import mage.game.Game; import mage.game.events.EntersTheBattlefieldEvent; @@ -14,7 +15,7 @@ import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.Target; -import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetControlledPermanent; import java.util.ArrayList; import java.util.Collections; @@ -35,12 +36,6 @@ import java.util.UUID; */ public class DevourEffect extends ReplacementEffectImpl { - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("creatures to devour"); - - static { - filter.add(AnotherPredicate.instance); - } - private final DevourFactor devourFactor; public DevourEffect(DevourFactor devourFactor) { @@ -77,49 +72,54 @@ public class DevourEffect extends ReplacementEffectImpl { public boolean replaceEvent(GameEvent event, Ability source, Game game) { Permanent creature = ((EntersTheBattlefieldEvent) event).getTarget(); Player controller = game.getPlayer(source.getControllerId()); - if (creature != null && controller != null) { - Target target = new TargetControlledCreaturePermanent(1, Integer.MAX_VALUE, filter, true); - target.setRequired(false); - if (!target.canChoose(source.getSourceId(), source.getControllerId(), game)) { - return false; - } - if (controller.chooseUse(Outcome.Detriment, "Devour creatures?", source, game)) { - controller.chooseTarget(Outcome.Detriment, target, source, game); - if (!target.getTargets().isEmpty()) { - List<Permanent> creaturesDevoured = new ArrayList<>(); - int devouredCreatures = 0; - for (UUID targetId : target.getTargets()) { - Permanent targetCreature = game.getPermanent(targetId); - if (targetCreature != null && targetCreature.sacrifice(source, game)) { - creaturesDevoured.add(targetCreature); - devouredCreatures++; - } - } - if (!game.isSimulation()) { - game.informPlayers(creature.getLogName() + " devours " + devouredCreatures + " creatures"); - } - game.getState().processAction(game); // need for multistep effects - - int amountCounters; - if (devourFactor == DevourFactor.DevourX) { - amountCounters = devouredCreatures * devouredCreatures; - } else { - amountCounters = devouredCreatures * devourFactor.getFactor(); - } - creature.addCounters(CounterType.P1P1.createInstance(amountCounters), source.getControllerId(), source, game); - game.getState().setValue(creature.getId().toString() + "devoured", creaturesDevoured); - } - + if (creature == null || controller == null) { + return false; + } + Target target = new TargetControlledPermanent(1, Integer.MAX_VALUE, devourFactor.getFilter(), true); + target.setRequired(false); + if (!target.canChoose(source.getSourceId(), source.getControllerId(), game)) { + return false; + } + if (!controller.chooseUse(Outcome.Detriment, "Devour " + devourFactor.getCardType().toString().toLowerCase() + "s?", source, game)) { + return false; + } + controller.chooseTarget(Outcome.Detriment, target, source, game); + if (target.getTargets().isEmpty()) { + return false; + } + List<Permanent> creaturesDevoured = new ArrayList<>(); + int devouredCreatures = 0; + for (UUID targetId : target.getTargets()) { + Permanent targetCreature = game.getPermanent(targetId); + if (targetCreature != null && targetCreature.sacrifice(source, game)) { + creaturesDevoured.add(targetCreature); + devouredCreatures++; } } + if (!game.isSimulation()) { + game.informPlayers(creature.getLogName() + " devours " + devouredCreatures + " " + devourFactor.getCardType().toString().toLowerCase() + "s"); + } + game.getState().processAction(game); // need for multistep effects + + int amountCounters; + if (devourFactor == DevourFactor.DevourX) { + amountCounters = devouredCreatures * devouredCreatures; + } else { + amountCounters = devouredCreatures * devourFactor.getFactor(); + } + creature.addCounters(CounterType.P1P1.createInstance(amountCounters), source.getControllerId(), source, game); + game.getState().setValue(creature.getId().toString() + "devoured", creaturesDevoured); return false; } @Override public String getText(Mode mode) { StringBuilder sb = new StringBuilder(devourFactor.toString()); - sb.append(" <i>(As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with "); - sb.append(devourFactor.getRuleText()).append(")</i>"); + sb.append(" <i>(As this enters the battlefield, you may sacrifice any number of "); + sb.append(devourFactor.getCardType()); + sb.append("s. This creature enters the battlefield with "); + sb.append(devourFactor.getRuleText()); + sb.append(")</i>"); return sb.toString(); } @@ -149,16 +149,25 @@ public class DevourEffect extends ReplacementEffectImpl { Devour1("Devour 1", "that many +1/+1 counters on it", 1), Devour2("Devour 2", "twice that many +1/+1 counters on it", 2), Devour3("Devour 3", "three times that many +1/+1 counters on it", 3), + DevourArtifact1("Devour artifact 1", "that many +1/+1 counters on it", 1, CardType.ARTIFACT), DevourX("Devour X, where X is the number of creatures devoured this way", "X +1/+1 counters on it for each of those creatures", Integer.MAX_VALUE); private final String text; private final String ruleText; private final int factor; + private final CardType cardType; + private final FilterControlledPermanent filter; DevourFactor(String text, String ruleText, int factor) { + this(text, ruleText, factor, CardType.CREATURE); + } + + DevourFactor(String text, String ruleText, int factor, CardType cardType) { this.text = text; this.ruleText = ruleText; this.factor = factor; + this.cardType = cardType; + this.filter = makeFilter(cardType); } @Override @@ -173,5 +182,20 @@ public class DevourEffect extends ReplacementEffectImpl { public int getFactor() { return factor; } + + public CardType getCardType() { + return cardType; + } + + public FilterControlledPermanent getFilter() { + return filter; + } + + private static final FilterControlledPermanent makeFilter(CardType cardType) { + FilterControlledPermanent filter = new FilterControlledPermanent(cardType.toString().toLowerCase() + "s to devour"); + filter.add(cardType.getPredicate()); + filter.add(AnotherPredicate.instance); + return filter; + } } }