diff --git a/Mage.Sets/src/mage/cards/c/ClayGolem.java b/Mage.Sets/src/mage/cards/c/ClayGolem.java new file mode 100644 index 00000000000..84ba183bfe8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ClayGolem.java @@ -0,0 +1,140 @@ +package mage.cards.c; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BecomesMonstrousSourceTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.CostImpl; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.hint.common.MonstrousHint; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ClayGolem extends CardImpl { + + public ClayGolem(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{4}"); + + this.subtype.add(SubType.GOLEM); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // {6}, Roll a d8: Monstrosity X, where X is the result. + Ability ability = new SimpleActivatedAbility(new ClayGolemEffect(), new GenericManaCost(6)); + ability.addCost(new ClayGolemCost()); + this.addAbility(ability.addHint(MonstrousHint.instance)); + + // Berserk — When Clay Golem becomes monstrous, destroy target permanent. + ability = new BecomesMonstrousSourceTriggeredAbility(new DestroyTargetEffect()); + ability.addTarget(new TargetPermanent()); + this.addAbility(ability.withFlavorWord("Berserk")); + } + + private ClayGolem(final ClayGolem card) { + super(card); + } + + @Override + public ClayGolem copy() { + return new ClayGolem(this); + } +} + +class ClayGolemCost extends CostImpl { + + private int lastRoll = 0; + + ClayGolemCost() { + super(); + text = "roll a d8"; + } + + private ClayGolemCost(final ClayGolemCost cost) { + super(cost); + this.lastRoll = cost.lastRoll; + } + + @Override + public boolean canPay(Ability ability, Ability source, UUID controllerId, Game game) { + return true; + } + + @Override + public boolean pay(Ability ability, Game game, Ability source, UUID controllerId, boolean noMana, Cost costToPay) { + Player player = game.getPlayer(controllerId); + if (player == null) { + return paid; + } + lastRoll = player.rollDice(source, game, 8); + paid = true; + return paid; + } + + @Override + public ClayGolemCost copy() { + return new ClayGolemCost(this); + } + + public int getLastRoll() { + return lastRoll; + } +} + +class ClayGolemEffect extends OneShotEffect { + ClayGolemEffect() { + super(Outcome.Benefit); + staticText = "monstrosity X, where X is the result"; + } + + private ClayGolemEffect(final ClayGolemEffect effect) { + super(effect); + } + + @Override + public ClayGolemEffect copy() { + return new ClayGolemEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = source.getSourcePermanentIfItStillExists(game); + if (permanent == null || permanent.isMonstrous()) { + return false; + } + int monstrosityValue = source + .getCosts() + .stream() + .filter(ClayGolemCost.class::isInstance) + .map(ClayGolemCost.class::cast) + .mapToInt(ClayGolemCost::getLastRoll) + .findFirst() + .orElse(0); + permanent.addCounters( + CounterType.P1P1.createInstance(monstrosityValue), + source.getControllerId(), source, game + ); + permanent.setMonstrous(true); + game.fireEvent(GameEvent.getEvent( + GameEvent.EventType.BECOMES_MONSTROUS, source.getSourceId(), + source, source.getControllerId(), monstrosityValue + )); + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/ForgottenRealmsCommander.java b/Mage.Sets/src/mage/sets/ForgottenRealmsCommander.java index 18484e3f9ab..74c7d308771 100644 --- a/Mage.Sets/src/mage/sets/ForgottenRealmsCommander.java +++ b/Mage.Sets/src/mage/sets/ForgottenRealmsCommander.java @@ -56,6 +56,7 @@ public final class ForgottenRealmsCommander extends ExpansionSet { cards.add(new SetCardInfo("Chittering Witch", 95, Rarity.RARE, mage.cards.c.ChitteringWitch.class)); cards.add(new SetCardInfo("Choked Estuary", 228, Rarity.RARE, mage.cards.c.ChokedEstuary.class)); cards.add(new SetCardInfo("Cinder Glade", 229, Rarity.RARE, mage.cards.c.CinderGlade.class)); + cards.add(new SetCardInfo("Clay Golem", 58, Rarity.UNCOMMON, mage.cards.c.ClayGolem.class)); cards.add(new SetCardInfo("Cloudblazer", 182, Rarity.UNCOMMON, mage.cards.c.Cloudblazer.class)); cards.add(new SetCardInfo("Cold-Eyed Selkie", 183, Rarity.RARE, mage.cards.c.ColdEyedSelkie.class)); cards.add(new SetCardInfo("Colossal Majesty", 154, Rarity.UNCOMMON, mage.cards.c.ColossalMajesty.class)); diff --git a/Mage/src/main/java/mage/abilities/keyword/MonstrosityAbility.java b/Mage/src/main/java/mage/abilities/keyword/MonstrosityAbility.java index 43d4f9b5394..8dfd4d7d0c1 100644 --- a/Mage/src/main/java/mage/abilities/keyword/MonstrosityAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/MonstrosityAbility.java @@ -1,12 +1,9 @@ - - package mage.abilities.keyword; import mage.abilities.Ability; import mage.abilities.ActivatedAbilityImpl; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.hint.common.MonstrousHint; import mage.constants.Outcome; import mage.constants.Zone; @@ -19,41 +16,40 @@ import mage.util.CardUtil; /** * Monstrosity - * + *

* 701.28. Monstrosity - * + *

* 701.28a “Monstrosity N” means “If this permanent isn't monstrous, put N +1/+1 counters on it - * and it becomes monstrous.” Monstrous is a condition of that permanent that can be - * referred to by other abilities. - * + * and it becomes monstrous.” Monstrous is a condition of that permanent that can be + * referred to by other abilities. + *

* 701.28b If a permanent's ability instructs a player to “monstrosity X,” other abilities of - * that permanent may also refer to X. The value of X in those abilities is equal to - * the value of X as that permanent became monstrous. - * + * that permanent may also refer to X. The value of X in those abilities is equal to + * the value of X as that permanent became monstrous. + *

* * Once a creature becomes monstrous, it can't become monstrous again. If the creature - * is already monstrous when the monstrosity ability resolves, nothing happens. - * + * is already monstrous when the monstrosity ability resolves, nothing happens. + *

* * Monstrous isn't an ability that a creature has. It's just something true about that - * creature. If the creature stops being a creature or loses its abilities, it will - * continue to be monstrous. - * + * creature. If the creature stops being a creature or loses its abilities, it will + * continue to be monstrous. + *

* * An ability that triggers when a creature becomes monstrous won't trigger if that creature - * isn't on the battlefield when its monstrosity ability resolves. + * isn't on the battlefield when its monstrosity ability resolves. * * @author LevelX2 */ public class MonstrosityAbility extends ActivatedAbilityImpl { - private int monstrosityValue; + private final int monstrosityValue; /** - * * @param manaString * @param monstrosityValue use Integer.MAX_VALUE for monstrosity X. */ public MonstrosityAbility(String manaString, int monstrosityValue) { - super(Zone.BATTLEFIELD, new BecomeMonstrousSourceEffect(monstrosityValue),new ManaCostsImpl(manaString)); + super(Zone.BATTLEFIELD, new BecomeMonstrousSourceEffect(monstrosityValue), new ManaCostsImpl<>(manaString)); this.monstrosityValue = monstrosityValue; this.addHint(MonstrousHint.instance); @@ -72,7 +68,6 @@ public class MonstrosityAbility extends ActivatedAbilityImpl { public int getMonstrosityValue() { return monstrosityValue; } - } @@ -94,28 +89,33 @@ class BecomeMonstrousSourceEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent != null && !permanent.isMonstrous() && source instanceof MonstrosityAbility) { - int monstrosityValue = ((MonstrosityAbility) source).getMonstrosityValue(); - // handle monstrosity = X - if (monstrosityValue == Integer.MAX_VALUE) { - monstrosityValue = source.getManaCostsToPay().getX(); - } - new AddCountersSourceEffect(CounterType.P1P1.createInstance(monstrosityValue)).apply(game, source); - permanent.setMonstrous(true); - game.fireEvent(GameEvent.getEvent(GameEvent.EventType.BECOMES_MONSTROUS, source.getSourceId(), source, source.getControllerId(), monstrosityValue)); - return true; + Permanent permanent = source.getSourcePermanentIfItStillExists(game); + if (permanent == null || permanent.isMonstrous()) { + return false; } - return false; + int monstrosityValue = ((MonstrosityAbility) source).getMonstrosityValue(); + // handle monstrosity = X + if (monstrosityValue == Integer.MAX_VALUE) { + monstrosityValue = source.getManaCostsToPay().getX(); + } + permanent.addCounters( + CounterType.P1P1.createInstance(monstrosityValue), + source.getControllerId(), source, game + ); + permanent.setMonstrous(true); + game.fireEvent(GameEvent.getEvent( + GameEvent.EventType.BECOMES_MONSTROUS, source.getSourceId(), + source, source.getControllerId(), monstrosityValue + )); + return true; } private String setText(int monstrosityValue) { StringBuilder sb = new StringBuilder("Monstrosity "); - sb.append(monstrosityValue == Integer.MAX_VALUE ? "X":monstrosityValue) + sb.append(monstrosityValue == Integer.MAX_VALUE ? "X" : monstrosityValue) .append(". (If this creature isn't monstrous, put ") - .append(monstrosityValue == Integer.MAX_VALUE ? "X":CardUtil.numberToText(monstrosityValue)) + .append(monstrosityValue == Integer.MAX_VALUE ? "X" : CardUtil.numberToText(monstrosityValue)) .append(" +1/+1 counters on it and it becomes monstrous.)").toString(); return sb.toString(); } - }