Implemented card Lightning Coils and test for it

This commit is contained in:
drmDev 2017-03-19 12:23:58 -04:00
parent 348faa345b
commit c109fc8a0e
4 changed files with 200 additions and 1 deletions

View file

@ -0,0 +1,135 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.cards.l;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.DiesCreatureTriggeredAbility;
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.ExileTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.permanent.ControllerPredicate;
import mage.filter.predicate.permanent.TokenPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.game.permanent.token.ElementalToken;
import mage.players.Player;
import mage.target.targetpointer.FixedTarget;
/**
*
* @author escplan9 - Derek Monturo
*/
public class LightningCoils extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a nontoken creature you control");
static {
filter.add(new ControllerPredicate(TargetController.YOU));
filter.add(Predicates.not(new TokenPredicate()));
}
public LightningCoils(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
// Whenever a nontoken creature you control dies, put a charge counter on Lightning Coils.
this.addAbility(
new DiesCreatureTriggeredAbility(
new AddCountersSourceEffect(CounterType.CHARGE.createInstance(), true),
false, filter));
// At the beginning of your upkeep, if Lightning Coils has five or more charge counters on it, remove all of them from it
// and put that many 3/1 red Elemental creature tokens with haste onto the battlefield.
// Exile them at the beginning of the next end step.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new LightningCoilsEffect(), TargetController.YOU, false));
}
public LightningCoils(final LightningCoils card) {
super(card);
}
@Override
public LightningCoils copy() {
return new LightningCoils(this);
}
}
class LightningCoilsEffect extends OneShotEffect {
LightningCoilsEffect() {
super(Outcome.Benefit);
staticText = "if {this} has five or more charge counters on it, remove all of them from it and put that man 3/1 red Elemental creature tokens with haste onto the battlefield. Exile them at the beginning of the next end step.";
}
LightningCoilsEffect(final LightningCoilsEffect effect) {
super(effect);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
Permanent p = game.getPermanent(source.getSourceId());
if (p != null && controller != null) {
int counters = p.getCounters(game).getCount(CounterType.CHARGE);
if (counters >= 5) {
// remove all the counters and create that many tokens
p.removeCounters(CounterType.CHARGE.getName(), p.getCounters(game).getCount(CounterType.CHARGE), game);
CreateTokenEffect effect = new CreateTokenEffect(new ElementalToken("CON", 1, true), counters);
effect.apply(game, source);
// exile those tokens at next end step
for (UUID tokenId : effect.getLastAddedTokenIds()) {
Permanent tokenPermanent = game.getPermanent(tokenId);
if (tokenPermanent != null) {
ExileTargetEffect exileEffect = new ExileTargetEffect(null, "", Zone.BATTLEFIELD);
exileEffect.setTargetPointer(new FixedTarget(tokenPermanent, game));
game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect), source);
}
}
return true;
}
}
return false;
}
@Override
public LightningCoilsEffect copy() {
return new LightningCoilsEffect(this);
}
}

View file

@ -142,6 +142,7 @@ public class Mirrodin extends ExpansionSet {
cards.add(new SetCardInfo("Leonin Sun Standard", 194, Rarity.RARE, mage.cards.l.LeoninSunStandard.class)); cards.add(new SetCardInfo("Leonin Sun Standard", 194, Rarity.RARE, mage.cards.l.LeoninSunStandard.class));
cards.add(new SetCardInfo("Leveler", 195, Rarity.RARE, mage.cards.l.Leveler.class)); cards.add(new SetCardInfo("Leveler", 195, Rarity.RARE, mage.cards.l.Leveler.class));
cards.add(new SetCardInfo("Lifespark Spellbomb", 197, Rarity.COMMON, mage.cards.l.LifesparkSpellbomb.class)); cards.add(new SetCardInfo("Lifespark Spellbomb", 197, Rarity.COMMON, mage.cards.l.LifesparkSpellbomb.class));
cards.add(new SetCardInfo("Lightning Coils", 198, Rarity.RARE, mage.cards.l.LightningCoils.class));
cards.add(new SetCardInfo("Lightning Greaves", 199, Rarity.UNCOMMON, mage.cards.l.LightningGreaves.class)); cards.add(new SetCardInfo("Lightning Greaves", 199, Rarity.UNCOMMON, mage.cards.l.LightningGreaves.class));
cards.add(new SetCardInfo("Living Hive", 124, Rarity.RARE, mage.cards.l.LivingHive.class)); cards.add(new SetCardInfo("Living Hive", 124, Rarity.RARE, mage.cards.l.LivingHive.class));
cards.add(new SetCardInfo("Lodestone Myr", 200, Rarity.RARE, mage.cards.l.LodestoneMyr.class)); cards.add(new SetCardInfo("Lodestone Myr", 200, Rarity.RARE, mage.cards.l.LodestoneMyr.class));

View file

@ -0,0 +1,49 @@
package org.mage.test.cards.single.mir;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.counters.CounterType;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author escplan9 (Derek Monturo)
*/
public class LightningCoilsTest extends CardTestPlayerBase {
@Test
public void sacrificeSixCreaturesProducesSixElementals() {
/*
Lightning Coils {3}
Artifact
Whenever a nontoken creature you control dies, put a charge counter on Lightning Coils.
At the beginning of your upkeep, if Lightning Coils has five or more charge counters on it, remove all of them from it
and create that many 3/1 red Elemental creature tokens with haste. Exile them at the beginning of the next end step.
*/
String lCoils = "Lightning Coils";
/*
Bottle Gnomes {3}
Artifact Creature Gnome
Sacrifice Bottle Gnomes: You gain 3 life.
*/
String bGnomes = "Bottle Gnomes";
int gnomeCount = 6;
addCard(Zone.BATTLEFIELD, playerA, lCoils);
addCard(Zone.BATTLEFIELD, playerA, bGnomes, gnomeCount);
for (int i = 0; i < gnomeCount; i++) // sac Gnomes 6 times
activateAbility(2, PhaseStep.POSTCOMBAT_MAIN, playerA, "Sacrifice");
setStopAt(3, PhaseStep.PRECOMBAT_MAIN);
execute();
assertGraveyardCount(playerA, bGnomes, gnomeCount);
assertPermanentCount(playerA, lCoils, 1);
assertCounterCount(playerA, lCoils, CounterType.CHARGE, 0);
assertPermanentCount(playerA, "Elemental", gnomeCount);
}
}

View file

@ -32,6 +32,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import mage.MageInt; import mage.MageInt;
import mage.abilities.keyword.HasteAbility;
import mage.constants.CardType; import mage.constants.CardType;
/** /**
@ -59,4 +60,17 @@ public class ElementalToken extends Token {
this.setOriginalExpansionSetCode("CON"); this.setOriginalExpansionSetCode("CON");
} }
public ElementalToken(String setCode, int tokenType, boolean hasHaste) {
super("Elemental", "3/1 red Elemental creature token");
setTokenType(tokenType);
availableImageSetCodes = tokenImageSets;
setOriginalExpansionSetCode(setCode);
cardType.add(CardType.CREATURE);
color.setRed(true);
subtype.add("Elemental");
power = new MageInt(3);
toughness = new MageInt(1);
if (hasHaste) this.addAbility(HasteAbility.getInstance());
}
} }