From 37d487464fc46016979bcecd7f8676f3335d604b Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 20 Nov 2012 01:22:48 +0100 Subject: [PATCH] Finished modular keyword ability from Darksteel. --- .../abilities/keyword/ModularAbility.java | 127 ++++++++++++++++++ .../keyword/ModularStaticAbility.java | 30 ----- 2 files changed, 127 insertions(+), 30 deletions(-) create mode 100644 Mage/src/mage/abilities/keyword/ModularAbility.java delete mode 100644 Mage/src/mage/abilities/keyword/ModularStaticAbility.java diff --git a/Mage/src/mage/abilities/keyword/ModularAbility.java b/Mage/src/mage/abilities/keyword/ModularAbility.java new file mode 100644 index 0000000000..2eddc9032c --- /dev/null +++ b/Mage/src/mage/abilities/keyword/ModularAbility.java @@ -0,0 +1,127 @@ +package mage.abilities.keyword; + +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Outcome; +import mage.Constants.Zone; +import mage.abilities.Ability; +import mage.abilities.StaticAbility; +import mage.abilities.common.DiesTriggeredAbility; +import mage.abilities.effects.EntersBattlefieldEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.Card; +import mage.counters.CounterType; +import mage.filter.common.FilterArtifactPermanent; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.Target; +import mage.target.common.TargetArtifactPermanent; + + +/** + * + * 702.41. Modular + * + * 702.41a Modular represents both a static ability and a triggered ability. + * "Modular N" means "This permanent enters the battlefield with N +1/+1 + * counters on it" and "When this permanent is put into a graveyard + * from the battlefield, you may put a +1/+1 counter on target artifact + * creature for each +1/+1 counter on this permanent." + * 702.41b If a creature has multiple instances of modular, each one works separately. + * + * + * @author Loki, LevelX2 + */ + +public class ModularAbility extends DiesTriggeredAbility { + private int amount; + + public ModularAbility(Card card, int amount) { + super(new ModularDistributeCounterEffect(), true); + this.amount = amount; + card.addAbility(new ModularStaticAbility(amount)); + } + + public ModularAbility(ModularAbility ability) { + super(ability); + this.amount = ability.amount; + } + + @Override + public ModularAbility copy() { + return new ModularAbility(this); + } + + @Override + public String getRule() { + return "Modular " + amount + " (This enters the battlefield with " + amount + " +1/+1 counter on it. When it dies, you may put its +1/+1 counters on target artifact creature.)"; + } + +} + +class ModularStaticAbility extends StaticAbility { + + public ModularStaticAbility(int amount) { + super(Constants.Zone.BATTLEFIELD, new EntersBattlefieldEffect(new AddCountersSourceEffect(CounterType.P1P1.createInstance(amount)))); + } + + public ModularStaticAbility(final ModularStaticAbility ability) { + super(ability); + } + + @Override + public ModularStaticAbility copy() { + return new ModularStaticAbility(this); + } + + @Override + public String getRule() { + return ""; + } +} + + +class ModularDistributeCounterEffect extends OneShotEffect { + private static final FilterArtifactPermanent filter = new FilterArtifactPermanent("artifact creature"); + static { + filter.add(new CardTypePredicate(CardType.CREATURE)); + } + + public ModularDistributeCounterEffect() { + super(Outcome.BoostCreature); + this.staticText = "you may put a +1/+1 counter on target artifact creature for each +1/+1 counter on this permanent"; + } + + public ModularDistributeCounterEffect(final ModularDistributeCounterEffect effect) { + super(effect); + } + + @Override + public ModularDistributeCounterEffect copy() { + return new ModularDistributeCounterEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent sourcePermanent = (Permanent) game.getLastKnownInformation(source.getSourceId(), Zone.BATTLEFIELD); + if (sourcePermanent != null) { + int numberOfCounters = sourcePermanent.getCounters().getCount(CounterType.P1P1); + if (numberOfCounters > 0) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + Target target = new TargetArtifactPermanent(filter); + player.chooseTarget(outcome, target, source, game); + Permanent targetArtifact = game.getPermanent(target.getFirstTarget()); + if (targetArtifact != null) { + targetArtifact.addCounters(CounterType.P1P1.createInstance(numberOfCounters), game); + return true; + } + } + } + } + return false; + } +} diff --git a/Mage/src/mage/abilities/keyword/ModularStaticAbility.java b/Mage/src/mage/abilities/keyword/ModularStaticAbility.java deleted file mode 100644 index 632f22f37f..0000000000 --- a/Mage/src/mage/abilities/keyword/ModularStaticAbility.java +++ /dev/null @@ -1,30 +0,0 @@ -package mage.abilities.keyword; - -import mage.Constants; -import mage.abilities.StaticAbility; -import mage.abilities.effects.EntersBattlefieldEffect; -import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.counters.CounterType; - -/** - * Modular keyword static part - * @author Loki - */ -public class ModularStaticAbility extends StaticAbility { - private int amount; - - public ModularStaticAbility(int amount) { - super(Constants.Zone.BATTLEFIELD, new EntersBattlefieldEffect(new AddCountersSourceEffect(CounterType.P1P1.createInstance(amount)))); - this.amount = amount; - } - - public ModularStaticAbility(final ModularStaticAbility ability) { - super(ability); - this.amount = ability.amount; - } - - @Override - public ModularStaticAbility copy() { - return new ModularStaticAbility(this); - } -}