From 61aa1903c2f3fe3cbecae9f95ad751f687be5faf Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 10 Sep 2020 17:22:23 -0400 Subject: [PATCH] updated cards with cost adjusting activated abilities --- .../src/mage/cards/l/LoreseekersStone.java | 67 +++++-------------- .../src/mage/cards/n/NemesisOfMortals.java | 49 +++++--------- .../mage/cards/s/SanctumOfTranquilLight.java | 52 +++++++------- 3 files changed, 57 insertions(+), 111 deletions(-) diff --git a/Mage.Sets/src/mage/cards/l/LoreseekersStone.java b/Mage.Sets/src/mage/cards/l/LoreseekersStone.java index 784b468a7dd..ce1a04b8533 100644 --- a/Mage.Sets/src/mage/cards/l/LoreseekersStone.java +++ b/Mage.Sets/src/mage/cards/l/LoreseekersStone.java @@ -2,14 +2,14 @@ package mage.cards.l; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.CostAdjuster; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.abilities.effects.common.cost.CostModificationEffectImpl; +import mage.abilities.effects.common.InfoEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; import mage.game.Game; import mage.players.Player; import mage.util.CardUtil; @@ -17,7 +17,7 @@ import mage.util.CardUtil; import java.util.UUID; /** - * @author LevelX2 + * @author TheElk801 */ public final class LoreseekersStone extends CardImpl { @@ -25,8 +25,13 @@ public final class LoreseekersStone extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{6}"); // {3}, {T}: Draw three cards. This ability costs {1} more to activate for each card in your hand. - this.addAbility(new LoreseekersStoneActivatedAbility()); - this.addAbility(new SimpleStaticAbility(Zone.ALL, new LoreseekersStoneCostIncreasingEffect())); + Ability ability = new SimpleActivatedAbility( + new DrawCardSourceControllerEffect(3), new GenericManaCost(3) + ); + ability.addCost(new TapSourceCost()); + ability.addEffect(new InfoEffect("This ability costs {1} more to activate for each card in your hand.")); + ability.setCostAdjuster(LoreseekersStoneAdjuster.instance); + this.addAbility(ability); } private LoreseekersStone(final LoreseekersStone card) { @@ -39,52 +44,14 @@ public final class LoreseekersStone extends CardImpl { } } -class LoreseekersStoneActivatedAbility extends SimpleActivatedAbility { - - public LoreseekersStoneActivatedAbility() { - super(Zone.BATTLEFIELD, - new DrawCardSourceControllerEffect(3) - .setText("Draw three cards. This ability costs {1} more to activate for each card in your hand"), - new GenericManaCost(3)); - this.addCost(new TapSourceCost()); - } - - private LoreseekersStoneActivatedAbility(final LoreseekersStoneActivatedAbility ability) { - super(ability); - } +enum LoreseekersStoneAdjuster implements CostAdjuster { + instance; @Override - public LoreseekersStoneActivatedAbility copy() { - return new LoreseekersStoneActivatedAbility(this); - } -} - -class LoreseekersStoneCostIncreasingEffect extends CostModificationEffectImpl { - - LoreseekersStoneCostIncreasingEffect() { - super(Duration.EndOfGame, Outcome.Benefit, CostModificationType.INCREASE_COST); - } - - private LoreseekersStoneCostIncreasingEffect(final LoreseekersStoneCostIncreasingEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source, Ability abilityToModify) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - CardUtil.increaseCost(abilityToModify, controller.getHand().size()); + public void adjustCosts(Ability ability, Game game) { + Player player = game.getPlayer(ability.getControllerId()); + if (player != null) { + CardUtil.increaseCost(ability, player.getHand().size()); } - return true; - } - - @Override - public boolean applies(Ability abilityToModify, Ability source, Game game) { - return (abilityToModify instanceof LoreseekersStoneActivatedAbility) && abilityToModify.getSourceId().equals(source.getSourceId()); - } - - @Override - public LoreseekersStoneCostIncreasingEffect copy() { - return new LoreseekersStoneCostIncreasingEffect(this); } } diff --git a/Mage.Sets/src/mage/cards/n/NemesisOfMortals.java b/Mage.Sets/src/mage/cards/n/NemesisOfMortals.java index 4f96bbbc4c3..9ae86b05a68 100644 --- a/Mage.Sets/src/mage/cards/n/NemesisOfMortals.java +++ b/Mage.Sets/src/mage/cards/n/NemesisOfMortals.java @@ -3,16 +3,19 @@ package mage.cards.n; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.CostAdjuster; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.cost.CostModificationEffectImpl; import mage.abilities.effects.common.cost.SpellCostReductionForEachSourceEffect; +import mage.abilities.hint.Hint; import mage.abilities.hint.ValueHint; import mage.abilities.keyword.MonstrosityAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; @@ -25,6 +28,9 @@ import java.util.UUID; */ public final class NemesisOfMortals extends CardImpl { + private static final DynamicValue xValue = new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_CREATURE); + private static final Hint hint = new ValueHint("Creature card in your graveyard", xValue); + public NemesisOfMortals(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}{G}"); this.subtype.add(SubType.SNAKE); @@ -33,20 +39,18 @@ public final class NemesisOfMortals extends CardImpl { this.toughness = new MageInt(5); // Nemesis of Mortals costs {1} less to cast for each creature card in your graveyard. - DynamicValue xValue = new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_CREATURE); Ability ability = new SimpleStaticAbility(Zone.ALL, new SpellCostReductionForEachSourceEffect(1, xValue)); ability.setRuleAtTheTop(true); - ability.addHint(new ValueHint("Creature card in your graveyard", xValue)); + ability.addHint(hint); this.addAbility(ability); // {7}{G}{G}: Monstrosity 5. This ability costs {1} less to activate for each creature card in your graveyard. - // TODO: Make ability properly copiable ability = new MonstrosityAbility("{7}{G}{G}", 5); for (Effect effect : ability.getEffects()) { effect.setText("Monstrosity 5. This ability costs {1} less to activate for each creature card in your graveyard"); } + ability.setCostAdjuster(NemesisOfMortalsAdjuster.instance); this.addAbility(ability); - this.addAbility(new SimpleStaticAbility(Zone.ALL, new NemesisOfMortalsCostReducingEffect(ability.getOriginalId()))); } private NemesisOfMortals(final NemesisOfMortals card) { @@ -59,37 +63,14 @@ public final class NemesisOfMortals extends CardImpl { } } -class NemesisOfMortalsCostReducingEffect extends CostModificationEffectImpl { - - private final UUID originalId; - - NemesisOfMortalsCostReducingEffect(UUID originalId) { - super(Duration.EndOfGame, Outcome.Benefit, CostModificationType.REDUCE_COST); - this.originalId = originalId; - } - - private NemesisOfMortalsCostReducingEffect(final NemesisOfMortalsCostReducingEffect effect) { - super(effect); - this.originalId = effect.originalId; - } +enum NemesisOfMortalsAdjuster implements CostAdjuster { + instance; @Override - public boolean apply(Game game, Ability source, Ability abilityToModify) { - Player controller = game.getPlayer(source.getControllerId()); + public void adjustCosts(Ability ability, Game game) { + Player controller = game.getPlayer(ability.getControllerId()); if (controller != null) { - CardUtil.reduceCost(abilityToModify, controller.getGraveyard().count(StaticFilters.FILTER_CARD_CREATURE, game)); + CardUtil.reduceCost(ability, controller.getGraveyard().count(StaticFilters.FILTER_CARD_CREATURE, game)); } - return true; } - - @Override - public boolean applies(Ability abilityToModify, Ability source, Game game) { - return abilityToModify.getOriginalId().equals(originalId); - } - - @Override - public NemesisOfMortalsCostReducingEffect copy() { - return new NemesisOfMortalsCostReducingEffect(this); - } - } diff --git a/Mage.Sets/src/mage/cards/s/SanctumOfTranquilLight.java b/Mage.Sets/src/mage/cards/s/SanctumOfTranquilLight.java index 50ea1e8b8d0..6b318a6facc 100644 --- a/Mage.Sets/src/mage/cards/s/SanctumOfTranquilLight.java +++ b/Mage.Sets/src/mage/cards/s/SanctumOfTranquilLight.java @@ -2,51 +2,45 @@ package mage.cards.s; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.CostAdjuster; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.common.InfoEffect; import mage.abilities.effects.common.TapTargetEffect; -import mage.abilities.effects.common.cost.CostModificationSourceEffect; +import mage.abilities.hint.Hint; import mage.abilities.hint.ValueHint; 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.SuperType; -import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledPermanent; +import mage.game.Game; +import mage.players.Player; import mage.target.common.TargetCreaturePermanent; +import mage.util.CardUtil; import java.util.UUID; /** - * * @author htrajan */ public final class SanctumOfTranquilLight extends CardImpl { - private static final FilterPermanent filter = new FilterControlledPermanent("Shrine you control"); - private static final PermanentsOnBattlefieldCount count = new PermanentsOnBattlefieldCount(filter); - - static { - filter.add(SubType.SHRINE.getPredicate()); - } - public SanctumOfTranquilLight(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{W}"); - + this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.SHRINE); // {5}{W}: Tap target creature. This ability costs {1} less to activate for each Shrine you control. - Ability ability = new SimpleActivatedAbility(new SanctumOfTranquilLightActivatedAbility()); + Ability ability = new SimpleActivatedAbility(new TapTargetEffect(), new ManaCostsImpl<>("{5}{W}")); + ability.addEffect(new InfoEffect("This ability costs {1} less to activate for each Shrine you control")); ability.addTarget(new TargetCreaturePermanent()); - this.addAbility(ability); - this.addAbility(new SimpleStaticAbility(Zone.ALL, new CostModificationSourceEffect(Duration.EndOfGame, Outcome.Benefit, SanctumOfTranquilLightActivatedAbility.class, count, true).setText("")) - .addHint(new ValueHint("Shrines you control", count))); + ability.setCostAdjuster(SanctumOfTranquilLightAdjuster.instance); + this.addAbility(ability.addHint(SanctumOfTranquilLightAdjuster.getHint())); } private SanctumOfTranquilLight(final SanctumOfTranquilLight card) { @@ -59,18 +53,22 @@ public final class SanctumOfTranquilLight extends CardImpl { } } -class SanctumOfTranquilLightActivatedAbility extends SimpleActivatedAbility { +enum SanctumOfTranquilLightAdjuster implements CostAdjuster { + instance; - SanctumOfTranquilLightActivatedAbility() { - super(new TapTargetEffect().setText("target creature. This ability costs {1} less to activate for each Shrine you control"), new ManaCostsImpl<>("{5}{W}")); - } + private static final FilterPermanent filter = new FilterControlledPermanent(SubType.SHRINE); + private static final DynamicValue count = new PermanentsOnBattlefieldCount(filter); + private static final Hint hint = new ValueHint("Shrines you control", count); - private SanctumOfTranquilLightActivatedAbility(SanctumOfTranquilLightActivatedAbility ability) { - super(ability); + public static Hint getHint() { + return hint; } @Override - public SanctumOfTranquilLightActivatedAbility copy() { - return new SanctumOfTranquilLightActivatedAbility(this); + public void adjustCosts(Ability ability, Game game) { + Player controller = game.getPlayer(ability.getControllerId()); + if (controller != null) { + CardUtil.reduceCost(ability, count.calculate(game, ability, null)); + } } -} \ No newline at end of file +}