various text fixes

This commit is contained in:
theelk801 2025-06-01 17:10:15 -04:00
parent 1d7ef1ed03
commit 5e83c3c3f0
39 changed files with 179 additions and 257 deletions

View file

@ -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;
} }
} }

View file

@ -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) {

View file

@ -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")));
} }

View file

@ -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";
} }

View file

@ -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));

View file

@ -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);
}
}

View file

@ -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);
} }
} }

View file

@ -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) {

View file

@ -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);

View file

@ -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.";
} }

View file

@ -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.";
}
} }

View file

@ -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) {

View file

@ -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());
} }
} }

View file

@ -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) {

View file

@ -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);
} }

View file

@ -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.

View file

@ -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) {

View file

@ -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
)); ));
} }

View file

@ -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

View file

@ -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) {

View file

@ -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}.";
} }
} }

View file

@ -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;
} }
} }

View file

@ -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.";
} }

View file

@ -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;
} }
} }

View file

@ -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.";
} }
} }

View file

@ -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);

View file

@ -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) {

View file

@ -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"));

View file

@ -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

View file

@ -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) {

View file

@ -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

View file

@ -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) {

View file

@ -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);
} }
} }

View file

@ -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 ")) {

View file

@ -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) {

View file

@ -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);
} }

View file

@ -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);

View file

@ -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));
} }

View file

@ -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) {