updated cards with cost adjusting activated abilities

This commit is contained in:
Evan Kranzler 2020-09-10 17:22:23 -04:00
parent 5c0e7d6b2e
commit 61aa1903c2
3 changed files with 57 additions and 111 deletions

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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));
}
}
}
}