forked from External/mage
various text fixes
This commit is contained in:
parent
1d7ef1ed03
commit
5e83c3c3f0
39 changed files with 179 additions and 257 deletions
|
|
@ -2,18 +2,18 @@ package mage.cards.a;
|
||||||
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
|
|
||||||
import mage.abilities.condition.Condition;
|
import mage.abilities.condition.Condition;
|
||||||
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
|
|
||||||
import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect;
|
import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect;
|
||||||
import mage.abilities.keyword.FlyingAbility;
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
import mage.abilities.keyword.HasteAbility;
|
import mage.abilities.keyword.HasteAbility;
|
||||||
|
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.*;
|
import mage.constants.*;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.events.GameEvent;
|
import mage.game.events.GameEvent;
|
||||||
import mage.game.stack.Spell;
|
import mage.game.stack.Spell;
|
||||||
|
import mage.util.CardUtil;
|
||||||
import mage.watchers.Watcher;
|
import mage.watchers.Watcher;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
@ -39,17 +39,10 @@ public final class ArclightPhoenix extends CardImpl {
|
||||||
this.addAbility(HasteAbility.getInstance());
|
this.addAbility(HasteAbility.getInstance());
|
||||||
|
|
||||||
// At the beginning of combat on your turn, if you cast 3 or more instants and/or sorceries this turn, return Arclight Phoenix from your graveyard to the battlefield.
|
// At the beginning of combat on your turn, if you cast 3 or more instants and/or sorceries this turn, return Arclight Phoenix from your graveyard to the battlefield.
|
||||||
this.addAbility(new ConditionalInterveningIfTriggeredAbility(
|
this.addAbility(new BeginningOfCombatTriggeredAbility(
|
||||||
new BeginningOfCombatTriggeredAbility(
|
Zone.GRAVEYARD, TargetController.YOU,
|
||||||
Zone.GRAVEYARD,
|
new ReturnSourceFromGraveyardToBattlefieldEffect(), false
|
||||||
TargetController.YOU, new ReturnSourceFromGraveyardToBattlefieldEffect(),
|
).withInterveningIf(ArclightPhoenixCondition.instance), new ArclightPhoenixWatcher());
|
||||||
false
|
|
||||||
), ArclightPhoenixCondition.instance,
|
|
||||||
"At the beginning of combat on your turn, "
|
|
||||||
+ "if you've cast three or more instant "
|
|
||||||
+ "and sorcery spells this turn, return {this} "
|
|
||||||
+ "from your graveyard to the battlefield."
|
|
||||||
), new ArclightPhoenixWatcher());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private ArclightPhoenix(final ArclightPhoenix card) {
|
private ArclightPhoenix(final ArclightPhoenix card) {
|
||||||
|
|
@ -67,8 +60,12 @@ enum ArclightPhoenixCondition implements Condition {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(Game game, Ability source) {
|
public boolean apply(Game game, Ability source) {
|
||||||
ArclightPhoenixWatcher watcher = game.getState().getWatcher(ArclightPhoenixWatcher.class);
|
return ArclightPhoenixWatcher.getInstantSorceryCount(game, source);
|
||||||
return watcher != null && watcher.getInstantSorceryCount(source.getControllerId()) > 2;
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "you've cast three or more instant and sorcery spells this turn";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -82,15 +79,12 @@ class ArclightPhoenixWatcher extends Watcher {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void watch(GameEvent event, Game game) {
|
public void watch(GameEvent event, Game game) {
|
||||||
if (event.getType() == GameEvent.EventType.SPELL_CAST) {
|
if (event.getType() != GameEvent.EventType.SPELL_CAST) {
|
||||||
Spell spell = game.getStack().getSpell(event.getTargetId());
|
return;
|
||||||
if (spell == null || !spell.isInstantOrSorcery(game)) {
|
}
|
||||||
return;
|
Spell spell = game.getStack().getSpell(event.getTargetId());
|
||||||
}
|
if (spell != null && spell.isInstantOrSorcery(game)) {
|
||||||
this.instantSorceryCount.putIfAbsent(spell.getControllerId(), 0);
|
this.instantSorceryCount.compute(spell.getControllerId(), CardUtil::setOrIncrementValue);
|
||||||
this.instantSorceryCount.compute(
|
|
||||||
spell.getControllerId(), (k, a) -> a + 1
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -100,7 +94,11 @@ class ArclightPhoenixWatcher extends Watcher {
|
||||||
this.instantSorceryCount.clear();
|
this.instantSorceryCount.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
int getInstantSorceryCount(UUID playerId) {
|
static boolean getInstantSorceryCount(Game game, Ability source) {
|
||||||
return this.instantSorceryCount.getOrDefault(playerId, 0);
|
return game
|
||||||
|
.getState()
|
||||||
|
.getWatcher(ArclightPhoenixWatcher.class)
|
||||||
|
.instantSorceryCount
|
||||||
|
.getOrDefault(source.getControllerId(), 0) >= 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
|
|
||||||
package mage.cards.a;
|
package mage.cards.a;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.condition.Condition;
|
||||||
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
|
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
|
||||||
import mage.abilities.decorator.ConditionalContinuousEffect;
|
import mage.abilities.decorator.ConditionalContinuousEffect;
|
||||||
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
|
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
|
||||||
|
|
@ -12,25 +12,19 @@ import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.constants.Zone;
|
import mage.filter.common.FilterControlledPermanent;
|
||||||
import mage.filter.FilterPermanent;
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author jeffwadsworth
|
* @author jeffwadsworth
|
||||||
*/
|
*/
|
||||||
public final class ArmoryGuard extends CardImpl {
|
public final class ArmoryGuard extends CardImpl {
|
||||||
|
|
||||||
private static final String rule = "Armory Guard has vigilance as long as you control a Gate";
|
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(new FilterControlledPermanent(SubType.GATE));
|
||||||
|
|
||||||
private static final FilterPermanent filter = new FilterPermanent("Gate");
|
|
||||||
|
|
||||||
static {
|
|
||||||
filter.add(SubType.GATE.getPredicate());
|
|
||||||
}
|
|
||||||
|
|
||||||
public ArmoryGuard(UUID ownerId, CardSetInfo setInfo) {
|
public ArmoryGuard(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}");
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}");
|
||||||
this.subtype.add(SubType.GIANT);
|
this.subtype.add(SubType.GIANT);
|
||||||
this.subtype.add(SubType.SOLDIER);
|
this.subtype.add(SubType.SOLDIER);
|
||||||
|
|
||||||
|
|
@ -38,8 +32,10 @@ public final class ArmoryGuard extends CardImpl {
|
||||||
this.toughness = new MageInt(5);
|
this.toughness = new MageInt(5);
|
||||||
|
|
||||||
// Armory Guard has vigilance as long as you control a Gate.
|
// Armory Guard has vigilance as long as you control a Gate.
|
||||||
ConditionalContinuousEffect effect = new ConditionalContinuousEffect(new GainAbilitySourceEffect(VigilanceAbility.getInstance()), new PermanentsOnTheBattlefieldCondition(filter), rule);
|
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
|
||||||
this.addAbility(new SimpleStaticAbility(effect));
|
new GainAbilitySourceEffect(VigilanceAbility.getInstance()),
|
||||||
|
condition, "{this} has vigilance as long as you control a Gate"
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private ArmoryGuard(final ArmoryGuard card) {
|
private ArmoryGuard(final ArmoryGuard card) {
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ public final class BlindObedience extends CardImpl {
|
||||||
// Artifacts and creatures your opponents control enter the battlefield tapped.
|
// Artifacts and creatures your opponents control enter the battlefield tapped.
|
||||||
this.addAbility(new SimpleStaticAbility(new PermanentsEnterBattlefieldTappedEffect(
|
this.addAbility(new SimpleStaticAbility(new PermanentsEnterBattlefieldTappedEffect(
|
||||||
StaticFilters.FILTER_OPPONENTS_PERMANENT_ARTIFACT_OR_CREATURE
|
StaticFilters.FILTER_OPPONENTS_PERMANENT_ARTIFACT_OR_CREATURE
|
||||||
).setText("artifacts and creatures your opponents control enter the battlefield tapped")));
|
).setText("artifacts and creatures your opponents control enter tapped")));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,7 @@ class BraidsArisenNightmareEffect extends OneShotEffect {
|
||||||
public BraidsArisenNightmareEffect() {
|
public BraidsArisenNightmareEffect() {
|
||||||
super(Outcome.Sacrifice);
|
super(Outcome.Sacrifice);
|
||||||
this.staticText = "you may sacrifice an artifact, creature, enchantment, land, or planeswalker. " +
|
this.staticText = "you may sacrifice an artifact, creature, enchantment, land, or planeswalker. " +
|
||||||
"If you do, each opponent may sacrifice a permanent that shares a card type with it. " +
|
"If you do, each opponent may sacrifice a permanent of their choice that shares a card type with it. " +
|
||||||
"For each opponent who doesn't, that player loses 2 life and you draw a card";
|
"For each opponent who doesn't, that player loses 2 life and you draw a card";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,8 @@ public final class Chainsaw extends CardImpl {
|
||||||
StaticFilters.FILTER_PERMANENT_CREATURES, false));
|
StaticFilters.FILTER_PERMANENT_CREATURES, false));
|
||||||
|
|
||||||
// Equipped creature gets +X/+0, where X is the number of rev counters on Chainsaw.
|
// Equipped creature gets +X/+0, where X is the number of rev counters on Chainsaw.
|
||||||
this.addAbility(new SimpleStaticAbility(new BoostEquippedEffect(xValue, StaticValue.get(0))));
|
this.addAbility(new SimpleStaticAbility(new BoostEquippedEffect(xValue, StaticValue.get(0))
|
||||||
|
.setText("equipped creature gets +X/+0, where X is the number of rev counters on {this}")));
|
||||||
|
|
||||||
// Equip {3}
|
// Equip {3}
|
||||||
this.addAbility(new EquipAbility(3, false));
|
this.addAbility(new EquipAbility(3, false));
|
||||||
|
|
|
||||||
|
|
@ -1,36 +1,37 @@
|
||||||
|
|
||||||
package mage.cards.c;
|
package mage.cards.c;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
|
import mage.abilities.condition.common.MoreThanStartingLifeTotalCondition;
|
||||||
import mage.abilities.costs.common.TapSourceCost;
|
import mage.abilities.costs.common.TapSourceCost;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.decorator.ConditionalOneShotEffect;
|
||||||
|
import mage.abilities.effects.common.GainLifeEffect;
|
||||||
|
import mage.abilities.effects.common.TransformSourceEffect;
|
||||||
import mage.abilities.keyword.TransformAbility;
|
import mage.abilities.keyword.TransformAbility;
|
||||||
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.Zone;
|
import java.util.UUID;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.game.permanent.Permanent;
|
|
||||||
import mage.players.Player;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author intimidatingant
|
* @author intimidatingant
|
||||||
*/
|
*/
|
||||||
public final class ChaliceOfLife extends CardImpl {
|
public final class ChaliceOfLife extends CardImpl {
|
||||||
|
|
||||||
public ChaliceOfLife(UUID ownerId, CardSetInfo setInfo) {
|
public ChaliceOfLife(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}");
|
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
|
||||||
|
|
||||||
this.secondSideCardClazz = mage.cards.c.ChaliceOfDeath.class;
|
this.secondSideCardClazz = mage.cards.c.ChaliceOfDeath.class;
|
||||||
this.addAbility(new TransformAbility());
|
this.addAbility(new TransformAbility());
|
||||||
|
|
||||||
|
|
||||||
// {tap}: You gain 1 life. Then if you have at least 10 life more than your starting life total, transform Chalice of Life.
|
// {tap}: You gain 1 life. Then if you have at least 10 life more than your starting life total, transform Chalice of Life.
|
||||||
this.addAbility(new SimpleActivatedAbility(new ChaliceOfLifeEffect(), new TapSourceCost()));
|
Ability ability = new SimpleActivatedAbility(new GainLifeEffect(1), new TapSourceCost());
|
||||||
|
ability.addEffect(new ConditionalOneShotEffect(
|
||||||
|
new TransformSourceEffect(), MoreThanStartingLifeTotalCondition.TEN,
|
||||||
|
"Then if you have at least 10 life more than your starting life total, transform {this}"
|
||||||
|
));
|
||||||
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ChaliceOfLife(final ChaliceOfLife card) {
|
private ChaliceOfLife(final ChaliceOfLife card) {
|
||||||
|
|
@ -42,39 +43,3 @@ public final class ChaliceOfLife extends CardImpl {
|
||||||
return new ChaliceOfLife(this);
|
return new ChaliceOfLife(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ChaliceOfLifeEffect extends OneShotEffect {
|
|
||||||
|
|
||||||
ChaliceOfLifeEffect() {
|
|
||||||
super(Outcome.GainLife);
|
|
||||||
staticText = "You gain 1 life. Then if you have at least 10 life more than your starting life total, transform Chalice of Life";
|
|
||||||
}
|
|
||||||
|
|
||||||
private ChaliceOfLifeEffect(final ChaliceOfLifeEffect effect) {
|
|
||||||
super(effect);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean apply(Game game, Ability source) {
|
|
||||||
Permanent permanent = game.getPermanent(source.getSourceId());
|
|
||||||
if (permanent != null) {
|
|
||||||
Player player = game.getPlayer(source.getControllerId());
|
|
||||||
if(player != null) {
|
|
||||||
//gain 1 life
|
|
||||||
player.gainLife(1, game, source);
|
|
||||||
|
|
||||||
// if you have at least 10 life more than your starting life total, transform Chalice of Life.
|
|
||||||
if (player.getLife() >= game.getStartingLife() + 10) {
|
|
||||||
permanent.transform(source, game);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ChaliceOfLifeEffect copy() {
|
|
||||||
return new ChaliceOfLifeEffect(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
package mage.cards.c;
|
package mage.cards.c;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
|
||||||
import mage.abilities.common.TurnedFaceUpAllTriggeredAbility;
|
import mage.abilities.common.TurnedFaceUpAllTriggeredAbility;
|
||||||
|
|
@ -18,12 +16,14 @@ import mage.filter.FilterPermanent;
|
||||||
import mage.filter.common.FilterControlledPermanent;
|
import mage.filter.common.FilterControlledPermanent;
|
||||||
import mage.filter.predicate.card.FaceDownPredicate;
|
import mage.filter.predicate.card.FaceDownPredicate;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author jackd149
|
* @author jackd149
|
||||||
*/
|
*/
|
||||||
public final class CryptidInspector extends CardImpl {
|
public final class CryptidInspector extends CardImpl {
|
||||||
private static final FilterPermanent filter1 = new FilterPermanent("a face-down permanent");
|
private static final FilterPermanent filter1 = new FilterPermanent("a face-down permanent");
|
||||||
private static final FilterPermanent filter2 = new FilterControlledPermanent("Cryptid Inspector or another permanent you control");
|
private static final FilterPermanent filter2 = new FilterControlledPermanent();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
filter1.add(FaceDownPredicate.instance);
|
filter1.add(FaceDownPredicate.instance);
|
||||||
|
|
@ -40,17 +40,17 @@ public final class CryptidInspector extends CardImpl {
|
||||||
// Whenever a face-down permanent you control enters and whenever Cryptid Inspector or another permanent you control is turned face up,
|
// Whenever a face-down permanent you control enters and whenever Cryptid Inspector or another permanent you control is turned face up,
|
||||||
// put a +1/+1 counter on Cryptid Inspector.
|
// put a +1/+1 counter on Cryptid Inspector.
|
||||||
this.addAbility(new OrTriggeredAbility(
|
this.addAbility(new OrTriggeredAbility(
|
||||||
Zone.BATTLEFIELD,
|
Zone.BATTLEFIELD,
|
||||||
new AddCountersSourceEffect(CounterType.P1P1.createInstance()),
|
new AddCountersSourceEffect(CounterType.P1P1.createInstance()),
|
||||||
false,
|
false,
|
||||||
"Whenever a face-down permanent you control enters and "
|
"Whenever a face-down permanent you control enters and "
|
||||||
+ "whenever Cryptid Inspector or another permanent you control is turned face up, ",
|
+ "whenever {this} or another permanent you control is turned face up, ",
|
||||||
new EntersBattlefieldControlledTriggeredAbility(null, filter1),
|
new EntersBattlefieldControlledTriggeredAbility(null, filter1),
|
||||||
new TurnedFaceUpAllTriggeredAbility(null, filter2)
|
new TurnedFaceUpAllTriggeredAbility(null, filter2)
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
private CryptidInspector(final CryptidInspector card){
|
private CryptidInspector(final CryptidInspector card) {
|
||||||
super(card);
|
super(card);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -58,4 +58,4 @@ public final class CryptidInspector extends CardImpl {
|
||||||
public CryptidInspector copy() {
|
public CryptidInspector copy() {
|
||||||
return new CryptidInspector(this);
|
return new CryptidInspector(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ class DeathmistRaptorEffect extends OneShotEffect {
|
||||||
|
|
||||||
DeathmistRaptorEffect() {
|
DeathmistRaptorEffect() {
|
||||||
super(Outcome.Benefit);
|
super(Outcome.Benefit);
|
||||||
this.staticText = "you may return {this} from your graveyard to the battlefield face up or face down";
|
this.staticText = "you may return this card from your graveyard to the battlefield face up or face down";
|
||||||
}
|
}
|
||||||
|
|
||||||
private DeathmistRaptorEffect(final DeathmistRaptorEffect effect) {
|
private DeathmistRaptorEffect(final DeathmistRaptorEffect effect) {
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ import mage.filter.predicate.mageobject.AnotherPredicate;
|
||||||
*/
|
*/
|
||||||
public final class DemonicTaskmaster extends CardImpl {
|
public final class DemonicTaskmaster extends CardImpl {
|
||||||
|
|
||||||
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("a creature other than Demonic Taskmaster");
|
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("a creature other than {this}");
|
||||||
|
|
||||||
static {
|
static {
|
||||||
filter.add(AnotherPredicate.instance);
|
filter.add(AnotherPredicate.instance);
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@ class DistendedMindbenderEffect extends OneShotEffect {
|
||||||
public DistendedMindbenderEffect() {
|
public DistendedMindbenderEffect() {
|
||||||
super(Outcome.Discard);
|
super(Outcome.Discard);
|
||||||
this.staticText = "target opponent reveals their hand. " +
|
this.staticText = "target opponent reveals their hand. " +
|
||||||
"You choose from it a nonland card with mana value 3 or less and a card with mana value 4 or greater." +
|
"You choose from it a nonland card with mana value 3 or less and a card with mana value 4 or greater. " +
|
||||||
"That player discards those cards.";
|
"That player discards those cards.";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,7 @@ class EdgarsAwakeningTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
|
|
||||||
EdgarsAwakeningTriggeredAbility() {
|
EdgarsAwakeningTriggeredAbility() {
|
||||||
super(Zone.ALL, new DoWhenCostPaid(makeAbility(), new ManaCostsImpl<>("{B}"), "Pay {B}?"));
|
super(Zone.ALL, new DoWhenCostPaid(makeAbility(), new ManaCostsImpl<>("{B}"), "Pay {B}?"));
|
||||||
|
this.setTriggerPhrase("When you discard this card, ");
|
||||||
}
|
}
|
||||||
|
|
||||||
private EdgarsAwakeningTriggeredAbility(final EdgarsAwakeningTriggeredAbility ability) {
|
private EdgarsAwakeningTriggeredAbility(final EdgarsAwakeningTriggeredAbility ability) {
|
||||||
|
|
@ -76,10 +77,4 @@ class EdgarsAwakeningTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
public boolean checkTrigger(GameEvent event, Game game) {
|
public boolean checkTrigger(GameEvent event, Game game) {
|
||||||
return this.getSourceId().equals(event.getTargetId());
|
return this.getSourceId().equals(event.getTargetId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getRule() {
|
|
||||||
return "When you discard {this}, you may pay {B}. " +
|
|
||||||
"When you do, return target creature card from your graveyard to your hand.";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.e;
|
package mage.cards.e;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
import mage.abilities.costs.common.RemoveCountersSourceCost;
|
import mage.abilities.costs.common.RemoveCountersSourceCost;
|
||||||
|
|
@ -10,11 +9,11 @@ import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.constants.Zone;
|
|
||||||
import mage.counters.CounterType;
|
import mage.counters.CounterType;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author Plopman
|
* @author Plopman
|
||||||
*/
|
*/
|
||||||
public final class ExperimentOne extends CardImpl {
|
public final class ExperimentOne extends CardImpl {
|
||||||
|
|
@ -32,7 +31,7 @@ public final class ExperimentOne extends CardImpl {
|
||||||
this.addAbility(new EvolveAbility());
|
this.addAbility(new EvolveAbility());
|
||||||
|
|
||||||
//Remove two +1/+1 counters from Experiment One: Regenerate Experiment One.
|
//Remove two +1/+1 counters from Experiment One: Regenerate Experiment One.
|
||||||
this.addAbility(new SimpleActivatedAbility(new RegenerateSourceEffect(), new RemoveCountersSourceCost(CounterType.P1P1.createInstance(2))));
|
this.addAbility(new SimpleActivatedAbility(new RegenerateSourceEffect("it"), new RemoveCountersSourceCost(CounterType.P1P1.createInstance(2))));
|
||||||
}
|
}
|
||||||
|
|
||||||
private ExperimentOne(final ExperimentOne card) {
|
private ExperimentOne(final ExperimentOne card) {
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ public final class FearOfSleepParalysis extends CardImpl {
|
||||||
this.addAbility(FlyingAbility.getInstance());
|
this.addAbility(FlyingAbility.getInstance());
|
||||||
|
|
||||||
// Eerie -- Whenever Fear of Sleep Paralysis or another enchantment you control enters and whenever you fully unlock a Room, tap up to one target creature and put a stun counter on it.
|
// Eerie -- Whenever Fear of Sleep Paralysis or another enchantment you control enters and whenever you fully unlock a Room, tap up to one target creature and put a stun counter on it.
|
||||||
Ability ability = new EerieAbility(new TapTargetEffect());
|
Ability ability = new EerieAbility(new TapTargetEffect()).setTriggerPhrase("Whenever this creature or another enchantment you control enters and whenever you fully unlock a Room, ");
|
||||||
ability.addEffect(new AddCountersTargetEffect(CounterType.STUN.createInstance()).setText("and put a stun counter on it"));
|
ability.addEffect(new AddCountersTargetEffect(CounterType.STUN.createInstance()).setText("and put a stun counter on it"));
|
||||||
ability.addTarget(new TargetCreaturePermanent(0, 1));
|
ability.addTarget(new TargetCreaturePermanent(0, 1));
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
|
|
@ -89,4 +89,4 @@ class FearOfSleepParalysisEffect extends ReplacementEffectImpl {
|
||||||
return target != null && event.getData().equals(CounterType.STUN.getName()) && !target.getControllerId().equals(source.getControllerId());
|
return target != null && event.getData().equals(CounterType.STUN.getName()) && !target.getControllerId().equals(source.getControllerId());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@ class GryffsBoonEffect extends OneShotEffect {
|
||||||
|
|
||||||
GryffsBoonEffect() {
|
GryffsBoonEffect() {
|
||||||
super(Outcome.PutCardInPlay);
|
super(Outcome.PutCardInPlay);
|
||||||
staticText = "Return {this} from your graveyard to the battlefield attached to target creature";
|
staticText = "Return this card from your graveyard to the battlefield attached to target creature";
|
||||||
}
|
}
|
||||||
|
|
||||||
private GryffsBoonEffect(final GryffsBoonEffect effect) {
|
private GryffsBoonEffect(final GryffsBoonEffect effect) {
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,8 @@ public final class HauntedScreen extends CardImpl {
|
||||||
);
|
);
|
||||||
ability.addEffect(new BecomesCreatureSourceEffect(new CreatureToken(
|
ability.addEffect(new BecomesCreatureSourceEffect(new CreatureToken(
|
||||||
0, 0, "0/0 Spirit creature", SubType.SPIRIT
|
0, 0, "0/0 Spirit creature", SubType.SPIRIT
|
||||||
), CardType.ARTIFACT, Duration.Custom).withKeepCreatureSubtypes(true));
|
), CardType.ARTIFACT, Duration.Custom).withKeepCreatureSubtypes(true)
|
||||||
|
.setText("It becomes a 0/0 Spirit creature in addition to its other types"));
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@ public final class KaitoBaneOfNightmares extends CardImpl {
|
||||||
|
|
||||||
// 0: Surveil 2. Then draw a card for each opponent who lost life this turn.
|
// 0: Surveil 2. Then draw a card for each opponent who lost life this turn.
|
||||||
Ability ability = new LoyaltyAbility(new SurveilEffect(2), 0);
|
Ability ability = new LoyaltyAbility(new SurveilEffect(2), 0);
|
||||||
ability.addEffect(new DrawCardSourceControllerEffect(KaitoBaneOfNightmaresCount.instance));
|
ability.addEffect(new DrawCardSourceControllerEffect(KaitoBaneOfNightmaresCount.instance).concatBy("Then"));
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
|
|
||||||
// -2: Tap target creature. Put two stun counters on it.
|
// -2: Tap target creature. Put two stun counters on it.
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@ class KheruSpellsnatcherEffect extends OneShotEffect {
|
||||||
super(Outcome.Benefit);
|
super(Outcome.Benefit);
|
||||||
this.staticText = "counter target spell. If that spell is countered this way, "
|
this.staticText = "counter target spell. If that spell is countered this way, "
|
||||||
+ "exile it instead of putting it into its owner's graveyard. "
|
+ "exile it instead of putting it into its owner's graveyard. "
|
||||||
+ "You may cast that card without paying its mana cost as long as it remains exiled";
|
+ "You may cast that card without paying its mana cost for as long as it remains exiled";
|
||||||
}
|
}
|
||||||
|
|
||||||
private KheruSpellsnatcherEffect(final KheruSpellsnatcherEffect effect) {
|
private KheruSpellsnatcherEffect(final KheruSpellsnatcherEffect effect) {
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ public final class LaviniaAzoriusRenegade extends CardImpl {
|
||||||
// Whenever an opponent casts a spell, if no mana was spent to cast it, counter that spell.
|
// Whenever an opponent casts a spell, if no mana was spent to cast it, counter that spell.
|
||||||
this.addAbility(new SpellCastOpponentTriggeredAbility(
|
this.addAbility(new SpellCastOpponentTriggeredAbility(
|
||||||
Zone.BATTLEFIELD, new CounterTargetEffect(),
|
Zone.BATTLEFIELD, new CounterTargetEffect(),
|
||||||
StaticFilters.FILTER_SPELL_NO_MANA_SPENT, false, true
|
StaticFilters.FILTER_SPELL_NO_MANA_SPENT, false
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,25 +1,26 @@
|
||||||
package mage.cards.m;
|
package mage.cards.m;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.effects.common.SacrificeOpponentsEffect;
|
import mage.abilities.effects.common.SacrificeOpponentsEffect;
|
||||||
import mage.abilities.effects.common.discard.DiscardHandControllerEffect;
|
|
||||||
import mage.abilities.keyword.FlyingAbility;
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
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.SubType;
|
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
|
import mage.constants.SubType;
|
||||||
import mage.constants.SuperType;
|
import mage.constants.SuperType;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
|
import mage.game.Controllable;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.players.Player;
|
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author jeffwadsworth
|
* @author jeffwadsworth
|
||||||
*/
|
*/
|
||||||
public final class Malfegor extends CardImpl {
|
public final class Malfegor extends CardImpl {
|
||||||
|
|
@ -38,7 +39,6 @@ public final class Malfegor extends CardImpl {
|
||||||
|
|
||||||
// When Malfegor enters the battlefield, discard your hand. Each opponent sacrifices a creature for each card discarded this way.
|
// When Malfegor enters the battlefield, discard your hand. Each opponent sacrifices a creature for each card discarded this way.
|
||||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new MalfegorEffect(), false));
|
this.addAbility(new EntersBattlefieldTriggeredAbility(new MalfegorEffect(), false));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Malfegor(final Malfegor card) {
|
private Malfegor(final Malfegor card) {
|
||||||
|
|
@ -64,16 +64,17 @@ class MalfegorEffect extends OneShotEffect {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(Game game, Ability source) {
|
public boolean apply(Game game, Ability source) {
|
||||||
Player controller = game.getPlayer(source.getControllerId());
|
return Optional
|
||||||
if (controller == null) {
|
.ofNullable(source)
|
||||||
return false;
|
.map(Controllable::getControllerId)
|
||||||
}
|
.map(game::getPlayer)
|
||||||
int sacrificeNumber = controller.getHand().size();
|
.filter(player -> !player.getHand().isEmpty())
|
||||||
if (sacrificeNumber == 0) {
|
.map(player -> player.discard(player.getHand(), false, source, game))
|
||||||
return true;
|
.map(Set::size)
|
||||||
}
|
.filter(amount -> amount > 0 && new SacrificeOpponentsEffect(
|
||||||
new DiscardHandControllerEffect().apply(game, source);
|
amount, StaticFilters.FILTER_CONTROLLED_CREATURE
|
||||||
return new SacrificeOpponentsEffect(sacrificeNumber, StaticFilters.FILTER_CONTROLLED_CREATURE).apply(game, source);
|
).apply(game, source))
|
||||||
|
.isPresent();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@ class MogisGodOfSlaughterEffect extends OneShotEffect {
|
||||||
|
|
||||||
MogisGodOfSlaughterEffect() {
|
MogisGodOfSlaughterEffect() {
|
||||||
super(Outcome.Damage);
|
super(Outcome.Damage);
|
||||||
staticText = "{this} deals 2 damage to that player unless they sacrifice a creature";
|
staticText = "{this} deals 2 damage to that player unless they sacrifice a creature of their choice";
|
||||||
}
|
}
|
||||||
|
|
||||||
private MogisGodOfSlaughterEffect(final MogisGodOfSlaughterEffect effect) {
|
private MogisGodOfSlaughterEffect(final MogisGodOfSlaughterEffect effect) {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,5 @@
|
||||||
|
|
||||||
package mage.cards.n;
|
package mage.cards.n;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import mage.abilities.TriggeredAbilityImpl;
|
import mage.abilities.TriggeredAbilityImpl;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.costs.mana.GenericManaCost;
|
import mage.abilities.costs.mana.GenericManaCost;
|
||||||
|
|
@ -13,13 +10,15 @@ import mage.abilities.keyword.TransformAbility;
|
||||||
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.SubType;
|
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
|
import mage.constants.SubType;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.events.GameEvent;
|
import mage.game.events.GameEvent;
|
||||||
import mage.target.common.TargetControlledCreaturePermanent;
|
import mage.target.common.TargetControlledCreaturePermanent;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author halljared
|
* @author halljared
|
||||||
*/
|
*/
|
||||||
|
|
@ -85,6 +84,6 @@ class NeglectedHeirloomTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getRule() {
|
public String getRule() {
|
||||||
return "When equipped creature transforms, transform Neglected Heirloom.";
|
return "When equipped creature transforms, transform {this}.";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,7 @@ class NikoLightOfHopeEffect extends OneShotEffect {
|
||||||
|
|
||||||
NikoLightOfHopeEffect() {
|
NikoLightOfHopeEffect() {
|
||||||
super(Outcome.Benefit);
|
super(Outcome.Benefit);
|
||||||
staticText = "Exile target nonlegendary creature you control. Shards you control become copies of it until the beginning of the next end step. Return it to the battlefield under its owner's control at the beginning of the next end step.";
|
staticText = "Exile target nonlegendary creature you control. Shards you control become copies of it until the next end step. Return it to the battlefield under its owner's control at the beginning of the next end step.";
|
||||||
}
|
}
|
||||||
|
|
||||||
private NikoLightOfHopeEffect(final NikoLightOfHopeEffect effect) {
|
private NikoLightOfHopeEffect(final NikoLightOfHopeEffect effect) {
|
||||||
|
|
@ -112,4 +112,4 @@ class NikoLightOfHopeEffect extends OneShotEffect {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@ class PlaguecrafterEffect extends OneShotEffect {
|
||||||
|
|
||||||
PlaguecrafterEffect() {
|
PlaguecrafterEffect() {
|
||||||
super(Outcome.Benefit);
|
super(Outcome.Benefit);
|
||||||
this.staticText = "each player sacrifices a creature or planeswalker. "
|
this.staticText = "each player sacrifices a creature or planeswalker of their choice. "
|
||||||
+ "Each player who can't discards a card.";
|
+ "Each player who can't discards a card.";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,29 +1,26 @@
|
||||||
package mage.cards.r;
|
package mage.cards.r;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.ApprovingObject;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||||
import mage.abilities.effects.Effect;
|
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.cards.Card;
|
import mage.cards.Card;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.cards.CardsImpl;
|
import mage.cards.CardsImpl;
|
||||||
import mage.constants.CardType;
|
import mage.constants.*;
|
||||||
import mage.constants.Outcome;
|
import mage.filter.FilterCard;
|
||||||
import mage.constants.SubType;
|
import mage.filter.predicate.mageobject.ManaValuePredicate;
|
||||||
import mage.constants.SuperType;
|
|
||||||
import mage.constants.Zone;
|
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.events.GameEvent;
|
import mage.game.events.GameEvent;
|
||||||
import mage.game.stack.Spell;
|
import mage.game.stack.Spell;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
|
import mage.util.CardUtil;
|
||||||
import mage.watchers.common.SpellsCastWatcher;
|
import mage.watchers.common.SpellsCastWatcher;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author emerald000
|
* @author emerald000
|
||||||
*/
|
*/
|
||||||
public final class RashmiEternitiesCrafter extends CardImpl {
|
public final class RashmiEternitiesCrafter extends CardImpl {
|
||||||
|
|
@ -56,6 +53,7 @@ class RashmiEternitiesCrafterTriggeredAbility extends SpellCastControllerTrigger
|
||||||
|
|
||||||
RashmiEternitiesCrafterTriggeredAbility() {
|
RashmiEternitiesCrafterTriggeredAbility() {
|
||||||
super(new RashmiEternitiesCrafterEffect(), false);
|
super(new RashmiEternitiesCrafterEffect(), false);
|
||||||
|
setTriggerPhrase("Whenever you cast your first spell each turn, ");
|
||||||
}
|
}
|
||||||
|
|
||||||
private RashmiEternitiesCrafterTriggeredAbility(final RashmiEternitiesCrafterTriggeredAbility ability) {
|
private RashmiEternitiesCrafterTriggeredAbility(final RashmiEternitiesCrafterTriggeredAbility ability) {
|
||||||
|
|
@ -69,27 +67,11 @@ class RashmiEternitiesCrafterTriggeredAbility extends SpellCastControllerTrigger
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean checkTrigger(GameEvent event, Game game) {
|
public boolean checkTrigger(GameEvent event, Game game) {
|
||||||
if (super.checkTrigger(event, game)) {
|
return super.checkTrigger(event, game)
|
||||||
SpellsCastWatcher watcher = game.getState().getWatcher(SpellsCastWatcher.class);
|
&& game
|
||||||
if (watcher != null && watcher.getCount(event.getPlayerId()) == 1) {
|
.getState()
|
||||||
Spell spell = game.getStack().getSpell(event.getTargetId());
|
.getWatcher(SpellsCastWatcher.class)
|
||||||
if (spell != null) {
|
.getCount(event.getPlayerId()) == 1;
|
||||||
for (Effect effect : getEffects()) {
|
|
||||||
effect.setValue("RashmiEternitiesCrafterCMC", spell.getManaValue());
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getRule() {
|
|
||||||
return "Whenever you cast your first spell each turn, reveal the top card "
|
|
||||||
+ "of your library. If it's a nonland card with mana value "
|
|
||||||
+ "less than that spell's, you may cast it without paying "
|
|
||||||
+ "its mana cost. If you don't cast the revealed card, put it into your hand.";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -97,10 +79,8 @@ class RashmiEternitiesCrafterEffect extends OneShotEffect {
|
||||||
|
|
||||||
RashmiEternitiesCrafterEffect() {
|
RashmiEternitiesCrafterEffect() {
|
||||||
super(Outcome.PlayForFree);
|
super(Outcome.PlayForFree);
|
||||||
this.staticText = "reveal the top card of your library. If it's a nonland"
|
this.staticText = "reveal the top card of your library. You may cast it without paying its mana cost " +
|
||||||
+ " card with mana value less than that spell's, you may "
|
"if it's a spell with lesser mana value. If you don't cast it, put it into your hand.";
|
||||||
+ "cast it without paying its mana cost. If you don't cast the "
|
|
||||||
+ "revealed card, put it into your hand";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private RashmiEternitiesCrafterEffect(final RashmiEternitiesCrafterEffect effect) {
|
private RashmiEternitiesCrafterEffect(final RashmiEternitiesCrafterEffect effect) {
|
||||||
|
|
@ -114,32 +94,22 @@ class RashmiEternitiesCrafterEffect extends OneShotEffect {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(Game game, Ability source) {
|
public boolean apply(Game game, Ability source) {
|
||||||
boolean cardWasCast = false;
|
Player player = game.getPlayer(source.getControllerId());
|
||||||
Player controller = game.getPlayer(source.getControllerId());
|
Spell spell = (Spell) getValue("spellCast");
|
||||||
if (controller != null) {
|
if (player == null || spell == null) {
|
||||||
Card card = controller.getLibrary().getFromTop(game);
|
return false;
|
||||||
if (card != null) {
|
|
||||||
controller.revealCards("Rashmi, Eternities Crafter", new CardsImpl(card), game);
|
|
||||||
if (card.isLand(game)) {
|
|
||||||
controller.moveCards(card, Zone.HAND, source, game);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
Object cmcObject = this.getValue("RashmiEternitiesCrafterCMC");
|
|
||||||
if (cmcObject != null
|
|
||||||
&& card.getManaValue() < (int) cmcObject
|
|
||||||
&& controller.chooseUse(Outcome.PlayForFree, "Cast " + card.getName()
|
|
||||||
+ " without paying its mana cost?", source, game)) {
|
|
||||||
game.getState().setValue("PlayFromNotOwnHandZone" + card.getId(), Boolean.TRUE);
|
|
||||||
cardWasCast = controller.cast(controller.chooseAbilityForCast(card, game, true),
|
|
||||||
game, true, new ApprovingObject(source, game));
|
|
||||||
game.getState().setValue("PlayFromNotOwnHandZone" + card.getId(), null);
|
|
||||||
}
|
|
||||||
if (!cardWasCast) {
|
|
||||||
controller.moveCards(card, Zone.HAND, source, game);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
Card card = player.getLibrary().getFromTop(game);
|
||||||
|
if (card == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
player.revealCards("Rashmi, Eternities Crafter", new CardsImpl(card), game);
|
||||||
|
FilterCard filter = new FilterCard();
|
||||||
|
filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, spell.getManaValue()));
|
||||||
|
CardUtil.castSpellWithAttributesForFree(player, source, game, card, filter);
|
||||||
|
if (Zone.LIBRARY.match(game.getState().getZone(card.getId()))) {
|
||||||
|
player.moveCards(card, Zone.HAND, source, game);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -118,6 +118,6 @@ class SharkTyphoonTriggeredAbility extends ZoneChangeTriggeredAbility {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getRule() {
|
public String getRule() {
|
||||||
return "When you cycle {this}, create an X/X blue Shark creature token with flying.";
|
return "When you cycle this card, create an X/X blue Shark creature token with flying.";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,9 +13,7 @@ import mage.abilities.effects.common.TapTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.*;
|
import mage.constants.*;
|
||||||
import mage.filter.FilterPermanent;
|
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.filter.predicate.Predicates;
|
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.command.emblems.TamiyoFieldResearcherEmblem;
|
import mage.game.command.emblems.TamiyoFieldResearcherEmblem;
|
||||||
import mage.game.events.DamagedBatchBySourceEvent;
|
import mage.game.events.DamagedBatchBySourceEvent;
|
||||||
|
|
@ -35,12 +33,6 @@ import java.util.UUID;
|
||||||
*/
|
*/
|
||||||
public final class TamiyoFieldResearcher extends CardImpl {
|
public final class TamiyoFieldResearcher extends CardImpl {
|
||||||
|
|
||||||
private static final FilterPermanent filter = new FilterPermanent("nonland permanent");
|
|
||||||
|
|
||||||
static {
|
|
||||||
filter.add(Predicates.not(CardType.LAND.getPredicate()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public TamiyoFieldResearcher(UUID ownerId, CardSetInfo setInfo) {
|
public TamiyoFieldResearcher(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{1}{G}{W}{U}");
|
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{1}{G}{W}{U}");
|
||||||
this.supertype.add(SuperType.LEGENDARY);
|
this.supertype.add(SuperType.LEGENDARY);
|
||||||
|
|
@ -55,7 +47,7 @@ public final class TamiyoFieldResearcher extends CardImpl {
|
||||||
|
|
||||||
// -2: Tap up to two target nonland permanents. They don't untap during their controller's next untap step.
|
// -2: Tap up to two target nonland permanents. They don't untap during their controller's next untap step.
|
||||||
ability = new LoyaltyAbility(new TapTargetEffect(), -2);
|
ability = new LoyaltyAbility(new TapTargetEffect(), -2);
|
||||||
ability.addTarget(new TargetPermanent(0, 2, filter, false));
|
ability.addTarget(new TargetPermanent(0, 2, StaticFilters.FILTER_PERMANENTS_NON_LAND, false));
|
||||||
ability.addEffect(new DontUntapInControllersNextUntapStepTargetEffect("They"));
|
ability.addEffect(new DontUntapInControllersNextUntapStepTargetEffect("They"));
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.t;
|
package mage.cards.t;
|
||||||
|
|
||||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
|
||||||
import mage.abilities.effects.common.PutCardIntoPlayWithHasteAndSacrificeEffect;
|
import mage.abilities.effects.common.PutCardIntoPlayWithHasteAndSacrificeEffect;
|
||||||
import mage.abilities.keyword.SpliceAbility;
|
import mage.abilities.keyword.SpliceAbility;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
|
|
@ -27,7 +26,7 @@ public final class ThroughTheBreach extends CardImpl {
|
||||||
));
|
));
|
||||||
|
|
||||||
// Splice onto Arcane {2}{R}{R}
|
// Splice onto Arcane {2}{R}{R}
|
||||||
this.addAbility(new SpliceAbility(SpliceAbility.ARCANE, new ManaCostsImpl<>("{2}{R}{R}")));
|
this.addAbility(new SpliceAbility(SpliceAbility.ARCANE, "{2}{R}{R}"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private ThroughTheBreach(final ThroughTheBreach card) {
|
private ThroughTheBreach(final ThroughTheBreach card) {
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ public final class ThunderfootBaloth extends CardImpl {
|
||||||
// Lieutenant - As long as you control your commander, Thunderfoot Baloth gets +2/+2 and other creatures you control get +2/+2 and have trample.
|
// Lieutenant - As long as you control your commander, Thunderfoot Baloth gets +2/+2 and other creatures you control get +2/+2 and have trample.
|
||||||
this.addAbility(new LieutenantAbility(new BoostControlledEffect(
|
this.addAbility(new LieutenantAbility(new BoostControlledEffect(
|
||||||
2, 2, Duration.WhileOnBattlefield, true
|
2, 2, Duration.WhileOnBattlefield, true
|
||||||
), "and other creature you control get +2/+2").addLieutenantEffect(new GainAbilityAllEffect(
|
), "and other creatures you control get +2/+2").addLieutenantEffect(new GainAbilityAllEffect(
|
||||||
TrampleAbility.getInstance(), Duration.WhileOnBattlefield,
|
TrampleAbility.getInstance(), Duration.WhileOnBattlefield,
|
||||||
StaticFilters.FILTER_CONTROLLED_CREATURES, true
|
StaticFilters.FILTER_CONTROLLED_CREATURES, true
|
||||||
), "and have trample"));
|
), "and have trample"));
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,10 @@ import mage.abilities.keyword.EnchantAbility;
|
||||||
import mage.abilities.keyword.IndestructibleAbility;
|
import mage.abilities.keyword.IndestructibleAbility;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.*;
|
import mage.constants.AttachmentType;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Outcome;
|
||||||
|
import mage.constants.SubType;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
import mage.filter.predicate.mageobject.CommanderPredicate;
|
import mage.filter.predicate.mageobject.CommanderPredicate;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
|
|
@ -38,8 +41,8 @@ public final class TimelyWard extends CardImpl {
|
||||||
this.subtype.add(SubType.AURA);
|
this.subtype.add(SubType.AURA);
|
||||||
|
|
||||||
// You may cast this spell as though it had flash if it targets a commander.
|
// You may cast this spell as though it had flash if it targets a commander.
|
||||||
this.addAbility(new CastAsThoughItHadFlashIfConditionAbility(condition,
|
this.addAbility(new CastAsThoughItHadFlashIfConditionAbility(
|
||||||
"You may cast {this} as though it had flash if it targets a commander."
|
condition, "You may cast this spell as though it had flash if it targets a commander."
|
||||||
));
|
));
|
||||||
|
|
||||||
// Enchant creature
|
// Enchant creature
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@ class WoebringerDemonEffect extends OneShotEffect {
|
||||||
|
|
||||||
WoebringerDemonEffect() {
|
WoebringerDemonEffect() {
|
||||||
super(Outcome.Detriment);
|
super(Outcome.Detriment);
|
||||||
this.staticText = "that player sacrifices a creature. If the player can't, sacrifice {this}";
|
this.staticText = "that player sacrifices a creature of their choice. If the player can't, sacrifice {this}";
|
||||||
}
|
}
|
||||||
|
|
||||||
private WoebringerDemonEffect(final WoebringerDemonEffect effect) {
|
private WoebringerDemonEffect(final WoebringerDemonEffect effect) {
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,7 @@ public class VerifyCardDataTest {
|
||||||
|
|
||||||
private static final Logger logger = Logger.getLogger(VerifyCardDataTest.class);
|
private static final Logger logger = Logger.getLogger(VerifyCardDataTest.class);
|
||||||
|
|
||||||
private static final String FULL_ABILITIES_CHECK_SET_CODES = "FDN"; // check ability text due mtgjson, can use multiple sets like MAT;CMD or * for all
|
private static final String FULL_ABILITIES_CHECK_SET_CODES = "INR"; // check ability text due mtgjson, can use multiple sets like MAT;CMD or * for all
|
||||||
private static final boolean CHECK_ONLY_ABILITIES_TEXT = false; // use when checking text locally, suppresses unnecessary checks and output messages
|
private static final boolean CHECK_ONLY_ABILITIES_TEXT = false; // use when checking text locally, suppresses unnecessary checks and output messages
|
||||||
private static final boolean CHECK_COPYABLE_FIELDS = true; // disable for better verify test performance
|
private static final boolean CHECK_COPYABLE_FIELDS = true; // disable for better verify test performance
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ public class PutIntoGraveFromLibrarySourceTriggeredAbility extends ZoneChangeTri
|
||||||
}
|
}
|
||||||
|
|
||||||
public PutIntoGraveFromLibrarySourceTriggeredAbility(Effect effect, boolean optional) {
|
public PutIntoGraveFromLibrarySourceTriggeredAbility(Effect effect, boolean optional) {
|
||||||
super(Zone.LIBRARY, Zone.GRAVEYARD, effect, "When {this} is put into your graveyard from your library, ", optional);
|
super(Zone.LIBRARY, Zone.GRAVEYARD, effect, "When this card is put into your graveyard from your library, ", optional);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected PutIntoGraveFromLibrarySourceTriggeredAbility(final PutIntoGraveFromLibrarySourceTriggeredAbility ability) {
|
protected PutIntoGraveFromLibrarySourceTriggeredAbility(final PutIntoGraveFromLibrarySourceTriggeredAbility ability) {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
|
|
||||||
|
|
||||||
package mage.abilities.costs.common;
|
package mage.abilities.costs.common;
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.costs.Cost;
|
import mage.abilities.costs.Cost;
|
||||||
import mage.abilities.costs.CostImpl;
|
import mage.abilities.costs.CostImpl;
|
||||||
|
|
@ -12,18 +10,17 @@ import mage.constants.Zone;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @author LevelX2
|
* @author LevelX2
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class RevealSourceFromYourHandCost extends CostImpl {
|
public class RevealSourceFromYourHandCost extends CostImpl {
|
||||||
public RevealSourceFromYourHandCost() {
|
public RevealSourceFromYourHandCost() {
|
||||||
this.text = "reveal {this} from your hand";
|
this.text = "reveal this card from your hand";
|
||||||
}
|
}
|
||||||
|
|
||||||
public RevealSourceFromYourHandCost(RevealSourceFromYourHandCost cost) {
|
public RevealSourceFromYourHandCost(RevealSourceFromYourHandCost cost) {
|
||||||
super(cost);
|
super(cost);
|
||||||
}
|
}
|
||||||
|
|
@ -32,14 +29,16 @@ public class RevealSourceFromYourHandCost extends CostImpl {
|
||||||
public boolean pay(Ability ability, Game game, Ability source, UUID controllerId, boolean noMana, Cost costToPay) {
|
public boolean pay(Ability ability, Game game, Ability source, UUID controllerId, boolean noMana, Cost costToPay) {
|
||||||
paid = false;
|
paid = false;
|
||||||
Player player = game.getPlayer(controllerId);
|
Player player = game.getPlayer(controllerId);
|
||||||
if (player != null) {
|
if (player == null) {
|
||||||
Card card = player.getHand().get(ability.getSourceId(), game);
|
return paid;
|
||||||
if (card != null) {
|
|
||||||
Cards cards = new CardsImpl(card);
|
|
||||||
paid = true;
|
|
||||||
player.revealCards("Reveal card cost", cards, game);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Card card = player.getHand().get(ability.getSourceId(), game);
|
||||||
|
if (card == null) {
|
||||||
|
return paid;
|
||||||
|
}
|
||||||
|
Cards cards = new CardsImpl(card);
|
||||||
|
paid = true;
|
||||||
|
player.revealCards("Reveal card cost", cards, game);
|
||||||
return paid;
|
return paid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -52,5 +51,4 @@ public class RevealSourceFromYourHandCost extends CostImpl {
|
||||||
public RevealSourceFromYourHandCost copy() {
|
public RevealSourceFromYourHandCost copy() {
|
||||||
return new RevealSourceFromYourHandCost(this);
|
return new RevealSourceFromYourHandCost(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -172,12 +172,17 @@ public class DamageTargetEffect extends OneShotEffect {
|
||||||
} else {
|
} else {
|
||||||
if (firstTarget.getMinNumberOfTargets() == 0) {
|
if (firstTarget.getMinNumberOfTargets() == 0) {
|
||||||
int maxTargets = firstTarget.getMaxNumberOfTargets();
|
int maxTargets = firstTarget.getMaxNumberOfTargets();
|
||||||
if (maxTargets == Integer.MAX_VALUE) {
|
switch (maxTargets) {
|
||||||
sb.append("any number of ");
|
case Integer.MAX_VALUE:
|
||||||
} else {
|
sb.append("any number of ");
|
||||||
sb.append("each of up to ");
|
break;
|
||||||
sb.append(CardUtil.numberToText(maxTargets));
|
case 1:
|
||||||
sb.append(' ');
|
sb.append("up to one ");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sb.append("each of up to ");
|
||||||
|
sb.append(CardUtil.numberToText(maxTargets));
|
||||||
|
sb.append(' ');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!targetName.contains("target ")) {
|
if (!targetName.contains("target ")) {
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ public class WUBRGInsteadEffect extends ContinuousEffectImpl {
|
||||||
|
|
||||||
public WUBRGInsteadEffect() {
|
public WUBRGInsteadEffect() {
|
||||||
super(Duration.WhileOnBattlefield, Outcome.Detriment);
|
super(Duration.WhileOnBattlefield, Outcome.Detriment);
|
||||||
staticText = "You may pay {W}{U}{B}{R}{G} rather than pay the mana cost for spells that you cast";
|
staticText = "You may pay {W}{U}{B}{R}{G} rather than pay the mana cost for spells you cast";
|
||||||
}
|
}
|
||||||
|
|
||||||
protected WUBRGInsteadEffect(final WUBRGInsteadEffect effect) {
|
protected WUBRGInsteadEffect(final WUBRGInsteadEffect effect) {
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ public final class ArlinnEmbracedByTheMoonEmblem extends Emblem {
|
||||||
Ability ability2 = new SimpleActivatedAbility(effect2, new TapSourceCost());
|
Ability ability2 = new SimpleActivatedAbility(effect2, new TapSourceCost());
|
||||||
ability2.addTarget(new TargetAnyTarget());
|
ability2.addTarget(new TargetAnyTarget());
|
||||||
effect = new GainAbilityControlledEffect(ability2, Duration.EndOfGame, filter);
|
effect = new GainAbilityControlledEffect(ability2, Duration.EndOfGame, filter);
|
||||||
effect.setText("and '{T}: This creature deals damage equal to its power to any target");
|
effect.setText("and '{T}: This creature deals damage equal to its power to any target'");
|
||||||
ability.addEffect(effect);
|
ability.addEffect(effect);
|
||||||
this.getAbilities().add(ability);
|
this.getAbilities().add(ability);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ import mage.constants.SubType;
|
||||||
public final class BeastieToken extends TokenImpl {
|
public final class BeastieToken extends TokenImpl {
|
||||||
|
|
||||||
public BeastieToken() {
|
public BeastieToken() {
|
||||||
super("Beast Token", "4/4 white Beast creature token with \"This creature can't attack or block alone.\"");
|
super("Beast Token", "4/4 white Beast creature token with \"This token can't attack or block alone.\"");
|
||||||
cardType.add(CardType.CREATURE);
|
cardType.add(CardType.CREATURE);
|
||||||
color.setWhite(true);
|
color.setWhite(true);
|
||||||
subtype.add(SubType.BEAST);
|
subtype.add(SubType.BEAST);
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ public final class SeizeTheStormElementalToken extends TokenImpl {
|
||||||
|
|
||||||
public SeizeTheStormElementalToken(DynamicValue xValue, Hint hint) {
|
public SeizeTheStormElementalToken(DynamicValue xValue, Hint hint) {
|
||||||
super("Elemental Token", "red Elemental creature token with trample and " +
|
super("Elemental Token", "red Elemental creature token with trample and " +
|
||||||
"\"This creature's power and toughness are each equal to the number of instant " +
|
"\"This token's power and toughness are each equal to the number of instant " +
|
||||||
"and sorcery cards in your graveyard plus the number of cards with flashback you own in exile.\"");
|
"and sorcery cards in your graveyard plus the number of cards with flashback you own in exile.\"");
|
||||||
cardType.add(CardType.CREATURE);
|
cardType.add(CardType.CREATURE);
|
||||||
color.setRed(true);
|
color.setRed(true);
|
||||||
|
|
@ -32,7 +32,7 @@ public final class SeizeTheStormElementalToken extends TokenImpl {
|
||||||
this.addAbility(TrampleAbility.getInstance());
|
this.addAbility(TrampleAbility.getInstance());
|
||||||
this.addAbility(new SimpleStaticAbility(new SetBasePowerToughnessSourceEffect(
|
this.addAbility(new SimpleStaticAbility(new SetBasePowerToughnessSourceEffect(
|
||||||
xValue
|
xValue
|
||||||
).setText("this creature's power and toughness are each equal to the number of " +
|
).setText("this token's power and toughness are each equal to the number of " +
|
||||||
"instant and sorcery cards in your graveyard, plus the number of cards with flashback you own in exile")
|
"instant and sorcery cards in your graveyard, plus the number of cards with flashback you own in exile")
|
||||||
).addHint(hint));
|
).addHint(hint));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ import mage.constants.Zone;
|
||||||
public final class WrennAndSevenTreefolkToken extends TokenImpl {
|
public final class WrennAndSevenTreefolkToken extends TokenImpl {
|
||||||
|
|
||||||
public WrennAndSevenTreefolkToken() {
|
public WrennAndSevenTreefolkToken() {
|
||||||
super("Treefolk Token", "green Treefolk creature token with reach and \"This creature's power and toughness are each equal to the number of lands you control.\"");
|
super("Treefolk Token", "green Treefolk creature token with reach and \"This token's power and toughness are each equal to the number of lands you control.\"");
|
||||||
cardType.add(CardType.CREATURE);
|
cardType.add(CardType.CREATURE);
|
||||||
color.setGreen(true);
|
color.setGreen(true);
|
||||||
subtype.add(SubType.TREEFOLK);
|
subtype.add(SubType.TREEFOLK);
|
||||||
|
|
@ -24,7 +24,7 @@ public final class WrennAndSevenTreefolkToken extends TokenImpl {
|
||||||
this.addAbility(ReachAbility.getInstance());
|
this.addAbility(ReachAbility.getInstance());
|
||||||
this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetBasePowerToughnessSourceEffect(
|
this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetBasePowerToughnessSourceEffect(
|
||||||
LandsYouControlCount.instance
|
LandsYouControlCount.instance
|
||||||
).setText("this creature's power and toughness are each equal to the number of lands you control")));
|
).setText("this token's power and toughness are each equal to the number of lands you control")));
|
||||||
}
|
}
|
||||||
|
|
||||||
private WrennAndSevenTreefolkToken(final WrennAndSevenTreefolkToken token) {
|
private WrennAndSevenTreefolkToken(final WrennAndSevenTreefolkToken token) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue