mirror of
https://github.com/correl/mage.git
synced 2025-01-12 11:08:01 +00:00
refactored exiletokensAtEndStep
This commit is contained in:
parent
dcd5c76bad
commit
311e41abd2
3 changed files with 66 additions and 13 deletions
|
@ -31,17 +31,14 @@ import java.util.UUID;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
|
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
|
||||||
import mage.abilities.common.DiesCreatureTriggeredAbility;
|
import mage.abilities.common.DiesCreatureTriggeredAbility;
|
||||||
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
|
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.effects.common.CreateTokenEffect;
|
import mage.abilities.effects.common.CreateTokenEffect;
|
||||||
import mage.abilities.effects.common.ExileTargetEffect;
|
|
||||||
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.constants.TargetController;
|
import mage.constants.TargetController;
|
||||||
import mage.constants.Zone;
|
|
||||||
import mage.counters.CounterType;
|
import mage.counters.CounterType;
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
import mage.filter.common.FilterCreaturePermanent;
|
||||||
import mage.filter.predicate.Predicates;
|
import mage.filter.predicate.Predicates;
|
||||||
|
@ -51,7 +48,6 @@ import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.game.permanent.token.ElementalToken;
|
import mage.game.permanent.token.ElementalToken;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.targetpointer.FixedTarget;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -114,14 +110,7 @@ class LightningCoilsEffect extends OneShotEffect {
|
||||||
effect.apply(game, source);
|
effect.apply(game, source);
|
||||||
|
|
||||||
// exile those tokens at next end step
|
// exile those tokens at next end step
|
||||||
for (UUID tokenId : effect.getLastAddedTokenIds()) {
|
effect.exileTokensCreatedAtNextEndStep(game, source);
|
||||||
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 true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,4 +46,54 @@ public class LightningCoilsTest extends CardTestPlayerBase {
|
||||||
assertCounterCount(playerA, lCoils, CounterType.CHARGE, 0);
|
assertCounterCount(playerA, lCoils, CounterType.CHARGE, 0);
|
||||||
assertPermanentCount(playerA, "Elemental", gnomeCount);
|
assertPermanentCount(playerA, "Elemental", gnomeCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void sacrificeSixCreaturesProducesSixElementalsExiledAtEnd() {
|
||||||
|
|
||||||
|
/*
|
||||||
|
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";
|
||||||
|
|
||||||
|
/*
|
||||||
|
Grand Melee {3}{R}
|
||||||
|
Enchantment
|
||||||
|
All creatures attack each turn if able.
|
||||||
|
All creatures block each turn if able.
|
||||||
|
*/
|
||||||
|
String gMelee = "Grand Melee";
|
||||||
|
|
||||||
|
int tokenCount = 5;
|
||||||
|
|
||||||
|
addCard(Zone.BATTLEFIELD, playerA, lCoils);
|
||||||
|
addCard(Zone.BATTLEFIELD, playerA, bGnomes, tokenCount);
|
||||||
|
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 4);
|
||||||
|
addCard(Zone.HAND, playerA, gMelee);
|
||||||
|
|
||||||
|
for (int i = 0; i < tokenCount; i++) // sac Gnomes 5 times
|
||||||
|
activateAbility(2, PhaseStep.POSTCOMBAT_MAIN, playerA, "Sacrifice");
|
||||||
|
|
||||||
|
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, gMelee);
|
||||||
|
setStopAt(3, PhaseStep.CLEANUP);
|
||||||
|
execute();
|
||||||
|
|
||||||
|
assertPermanentCount(playerA, gMelee, 1);
|
||||||
|
assertGraveyardCount(playerA, bGnomes, tokenCount);
|
||||||
|
assertPermanentCount(playerA, lCoils, 1);
|
||||||
|
assertCounterCount(playerA, lCoils, CounterType.CHARGE, 0);
|
||||||
|
assertPermanentCount(playerA, "Elemental", 0);
|
||||||
|
int remainingLife = 20 - (tokenCount * 3); // each elemental does 3 damage
|
||||||
|
assertLife(playerB, remainingLife);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,12 +30,16 @@ package mage.abilities.effects.common;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
|
||||||
import mage.abilities.dynamicvalue.DynamicValue;
|
import mage.abilities.dynamicvalue.DynamicValue;
|
||||||
import mage.abilities.dynamicvalue.common.StaticValue;
|
import mage.abilities.dynamicvalue.common.StaticValue;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
|
import mage.constants.Zone;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
|
import mage.game.permanent.Permanent;
|
||||||
import mage.game.permanent.token.Token;
|
import mage.game.permanent.token.Token;
|
||||||
|
import mage.target.targetpointer.FixedTarget;
|
||||||
import mage.util.CardUtil;
|
import mage.util.CardUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -108,6 +112,17 @@ public class CreateTokenEffect extends OneShotEffect {
|
||||||
public ArrayList<UUID> getLastAddedTokenIds() {
|
public ArrayList<UUID> getLastAddedTokenIds() {
|
||||||
return lastAddedTokenIds;
|
return lastAddedTokenIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void exileTokensCreatedAtNextEndStep(Game game, Ability source) {
|
||||||
|
for (UUID tokenId : this.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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void setText() {
|
private void setText() {
|
||||||
StringBuilder sb = new StringBuilder("create ");
|
StringBuilder sb = new StringBuilder("create ");
|
||||||
|
@ -144,5 +159,4 @@ public class CreateTokenEffect extends OneShotEffect {
|
||||||
sb.append(message);
|
sb.append(message);
|
||||||
staticText = sb.toString();
|
staticText = sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue