more text fixes

This commit is contained in:
Evan Kranzler 2021-04-22 19:31:06 -04:00
parent a8096fc0a7
commit cd4f11e909
66 changed files with 168 additions and 242 deletions

View file

@ -24,7 +24,7 @@ import mage.target.TargetPermanent;
*/ */
public final class AetherMeltdown extends CardImpl { public final class AetherMeltdown extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("creature or vehicle"); private static final FilterPermanent filter = new FilterPermanent("creature or Vehicle");
static { static {
filter.add(Predicates.or(CardType.CREATURE.getPredicate(), SubType.VEHICLE.getPredicate())); filter.add(Predicates.or(CardType.CREATURE.getPredicate(), SubType.VEHICLE.getPredicate()));
@ -47,7 +47,6 @@ public final class AetherMeltdown extends CardImpl {
this.addAbility(new EntersBattlefieldTriggeredAbility(new GetEnergyCountersControllerEffect(2))); this.addAbility(new EntersBattlefieldTriggeredAbility(new GetEnergyCountersControllerEffect(2)));
// Enchanted permanent gets -4/-0. // Enchanted permanent gets -4/-0.
Effect effect = new BoostEnchantedEffect(-4, 0, Duration.WhileOnBattlefield); Effect effect = new BoostEnchantedEffect(-4, 0, Duration.WhileOnBattlefield);
effect.setText("Enchanted permanent gets -4/-0");
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
} }

View file

@ -54,7 +54,7 @@ class ArchangelOfTithesPayManaToAttackAllEffect extends CantAttackYouUnlessPayMa
ArchangelOfTithesPayManaToAttackAllEffect() { ArchangelOfTithesPayManaToAttackAllEffect() {
super(new ManaCostsImpl<>("{1}"), true); super(new ManaCostsImpl<>("{1}"), true);
staticText = "As long as {this} is untapped, creatures can't attack you or a planeswalker you control unless their controller pays {1} for each of those creatures."; staticText = "As long as {this} is untapped, creatures can't attack you or planeswalkers you control unless their controller pays {1} for each of those creatures.";
} }
ArchangelOfTithesPayManaToAttackAllEffect(ArchangelOfTithesPayManaToAttackAllEffect effect) { ArchangelOfTithesPayManaToAttackAllEffect(ArchangelOfTithesPayManaToAttackAllEffect effect) {

View file

@ -35,7 +35,7 @@ public final class ArchmageAscension extends CardImpl {
new AddCountersSourceEffect(CounterType.QUEST.createInstance(1)), new AddCountersSourceEffect(CounterType.QUEST.createInstance(1)),
TargetController.EACH_PLAYER, true TargetController.EACH_PLAYER, true
), ArchmageAscensionCondition.instance, "At the beginning of each end step, " + ), ArchmageAscensionCondition.instance, "At the beginning of each end step, " +
"if you drew two or more cards this turn, you may put a quest counter on {this}" "if you drew two or more cards this turn, you may put a quest counter on {this}."
), new CardsAmountDrawnThisTurnWatcher()); ), new CardsAmountDrawnThisTurnWatcher());
// As long as Archmage Ascension has six or more quest counters on it, if you would draw a card, // As long as Archmage Ascension has six or more quest counters on it, if you would draw a card,

View file

@ -6,6 +6,7 @@ import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
@ -37,7 +38,7 @@ public final class AuriokSalvagers extends CardImpl {
this.toughness = new MageInt(4); this.toughness = new MageInt(4);
// {1}{W}: Return target artifact card with converted mana cost 1 or less from your graveyard to your hand. // {1}{W}: Return target artifact card with converted mana cost 1 or less from your graveyard to your hand.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(),new ManaCostsImpl("{1}{W}")); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnFromGraveyardToHandTargetEffect(),new ManaCostsImpl("{1}{W}"));
ability.addTarget(new TargetCardInYourGraveyard(filter)); ability.addTarget(new TargetCardInYourGraveyard(filter));
this.addAbility(ability); this.addAbility(ability);

View file

@ -54,7 +54,7 @@ class BifurcateEffect extends OneShotEffect {
public BifurcateEffect() { public BifurcateEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
this.staticText = "Search your library for a permanent card with the same name as target nontoken creature and put that card onto the battlefield. Then shuffle"; this.staticText = "search your library for a permanent card with the same name as target nontoken creature, put that card onto the battlefield, then shuffle";
} }
public BifurcateEffect(final BifurcateEffect effect) { public BifurcateEffect(final BifurcateEffect effect) {

View file

@ -1,12 +1,9 @@
package mage.cards.b; package mage.cards.b;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.ActivateIfConditionActivatedAbility;
import mage.abilities.costs.Cost; import mage.abilities.condition.Condition;
import mage.abilities.costs.CostImpl;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DamageTargetEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
@ -18,23 +15,26 @@ import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/** /**
*
* @author North * @author North
*/ */
public final class BloodshotTrainee extends CardImpl { public final class BloodshotTrainee extends CardImpl {
public BloodshotTrainee(UUID ownerId, CardSetInfo setInfo) { public BloodshotTrainee(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{R}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
this.subtype.add(SubType.GOBLIN); this.subtype.add(SubType.GOBLIN);
this.subtype.add(SubType.WARRIOR); this.subtype.add(SubType.WARRIOR);
this.power = new MageInt(2); this.power = new MageInt(2);
this.toughness = new MageInt(3); this.toughness = new MageInt(3);
SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(4), new TapSourceCost()); Ability ability = new ActivateIfConditionActivatedAbility(
Zone.BATTLEFIELD, new DamageTargetEffect(4),
new TapSourceCost(), BloodshotTraineeCondition.instance
);
ability.addTarget(new TargetCreaturePermanent()); ability.addTarget(new TargetCreaturePermanent());
ability.addCost(new BloodshotTraineeCost());
this.addAbility(ability); this.addAbility(ability);
} }
@ -48,35 +48,17 @@ public final class BloodshotTrainee extends CardImpl {
} }
} }
class BloodshotTraineeCost extends CostImpl { enum BloodshotTraineeCondition implements Condition {
instance;
public BloodshotTraineeCost() { @Override
this.text = "Activate only if Bloodshot Trainee's power is 4 or greater"; public boolean apply(Game game, Ability source) {
} Permanent permanent = source.getSourcePermanentIfItStillExists(game);
return permanent != null && permanent.getPower().getValue() >= 4;
public BloodshotTraineeCost(final BloodshotTraineeCost cost) {
super(cost);
} }
@Override @Override
public BloodshotTraineeCost copy() { public String toString() {
return new BloodshotTraineeCost(this); return "{this}'s power is 4 or greater";
}
@Override
public boolean canPay(Ability ability, Ability source, UUID controllerId, Game game) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
if (permanent.getPower().getValue() >= 4) {
return true;
}
}
return false;
}
@Override
public boolean pay(Ability ability, Game game, Ability source, UUID controllerId, boolean noMana, Cost costToPay) {
this.paid = true;
return paid;
} }
} }

View file

@ -53,7 +53,7 @@ class BoldwyrHeavyweightsEffect extends OneShotEffect {
BoldwyrHeavyweightsEffect() { BoldwyrHeavyweightsEffect() {
super(Outcome.Detriment); super(Outcome.Detriment);
this.staticText = "each opponent may search their library for a creature card and put it onto the battlefield. Then each player who searched their library this way shuffles it"; this.staticText = "each opponent may search their library for a creature card and put it onto the battlefield. Then each player who searched their library this way shuffles";
} }
BoldwyrHeavyweightsEffect(final BoldwyrHeavyweightsEffect effect) { BoldwyrHeavyweightsEffect(final BoldwyrHeavyweightsEffect effect) {

View file

@ -46,7 +46,8 @@ class BoundlessRealmsEffect extends OneShotEffect {
public BoundlessRealmsEffect() { public BoundlessRealmsEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
this.staticText = "Search your library for up to X basic land cards, where X is the number of lands you control, and put them onto the battlefield tapped. Then shuffle."; this.staticText = "search your library for up to X basic land cards, where X is the number of " +
"lands you control, put them onto the battlefield tapped, then shuffle";
} }
public BoundlessRealmsEffect(final BoundlessRealmsEffect effect) { public BoundlessRealmsEffect(final BoundlessRealmsEffect effect) {

View file

@ -47,7 +47,7 @@ public final class DeathsOasis extends CardImpl {
// {1}, Sacrifice Death's Oasis: You gain life equal to the greatest converted mana cost among creatures you control. // {1}, Sacrifice Death's Oasis: You gain life equal to the greatest converted mana cost among creatures you control.
Ability ability = new SimpleActivatedAbility( Ability ability = new SimpleActivatedAbility(
new GainLifeEffect(DeathsOasisValue.instance) new GainLifeEffect(DeathsOasisValue.instance)
.setText("you gain life equal to the greatest mana value among creatures you control"), .setText("you gain life equal to the highest mana value among creatures you control"),
new GenericManaCost(1) new GenericManaCost(1)
); );
ability.addCost(new SacrificeSourceCost()); ability.addCost(new SacrificeSourceCost());

View file

@ -51,8 +51,8 @@ class DescendantsPathEffect extends OneShotEffect {
super(Outcome.Discard); super(Outcome.Discard);
this.staticText = "reveal the top card of your library. If it's a creature " this.staticText = "reveal the top card of your library. If it's a creature "
+ "card that shares a creature type with a creature you control, " + "card that shares a creature type with a creature you control, "
+ "you may cast that card without paying its mana cost. Otherwise, " + "you may cast it without paying its mana cost. If you don't cast it, " +
+ "put that card on the bottom of your library"; "put it on the bottom of your library";
} }
public DescendantsPathEffect(final DescendantsPathEffect effect) { public DescendantsPathEffect(final DescendantsPathEffect effect) {

View file

@ -25,7 +25,7 @@ import mage.target.common.TargetCardInYourGraveyard;
public final class EverbarkShaman extends CardImpl { public final class EverbarkShaman extends CardImpl {
private static final FilterCard filterForest = new FilterCard("Forest"); private static final FilterCard filterForest = new FilterCard("Forest");
private static final FilterCard filterTreefolk = new FilterCard("Treefolk from your graveyard"); private static final FilterCard filterTreefolk = new FilterCard("Treefolk card from your graveyard");
static { static {
filterForest.add(SubType.FOREST.getPredicate()); filterForest.add(SubType.FOREST.getPredicate());

View file

@ -1,7 +1,5 @@
package mage.cards.f; package mage.cards.f;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.ActivateIfConditionActivatedAbility; import mage.abilities.common.ActivateIfConditionActivatedAbility;
@ -15,14 +13,15 @@ import mage.constants.SubType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.target.common.TargetAnyTarget; import mage.target.common.TargetAnyTarget;
import java.util.UUID;
/** /**
*
* @author fireshoes * @author fireshoes
*/ */
public final class FireBowman extends CardImpl { public final class FireBowman extends CardImpl {
public FireBowman(UUID ownerId, CardSetInfo setInfo) { public FireBowman(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{R}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}");
this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.SOLDIER); this.subtype.add(SubType.SOLDIER);
this.subtype.add(SubType.ARCHER); this.subtype.add(SubType.ARCHER);
@ -30,8 +29,10 @@ public final class FireBowman extends CardImpl {
this.toughness = new MageInt(1); this.toughness = new MageInt(1);
// Sacrifice Fire Bowman: Fire Bowman deals 1 damage to any target. Activate this ability only during your turn, before attackers are declared. // Sacrifice Fire Bowman: Fire Bowman deals 1 damage to any target. Activate this ability only during your turn, before attackers are declared.
Ability ability = new ActivateIfConditionActivatedAbility(Zone.BATTLEFIELD, Ability ability = new ActivateIfConditionActivatedAbility(
new DamageTargetEffect(1), new SacrificeSourceCost(), MyTurnBeforeAttackersDeclaredCondition.instance); Zone.BATTLEFIELD, new DamageTargetEffect(1, "it"),
new SacrificeSourceCost(), MyTurnBeforeAttackersDeclaredCondition.instance
);
ability.addTarget(new TargetAnyTarget()); ability.addTarget(new TargetAnyTarget());
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -28,7 +28,7 @@ public final class FireJuggler extends CardImpl {
this.toughness = new MageInt(2); this.toughness = new MageInt(2);
// Whenever Fire Juggler becomes blocked, clash with an opponent. If you win, Fire Juggler deals 4 damage to each creature blocking it. // Whenever Fire Juggler becomes blocked, clash with an opponent. If you win, Fire Juggler deals 4 damage to each creature blocking it.
FilterPermanent filter = new FilterPermanent("each creature blocking it"); FilterPermanent filter = new FilterPermanent("creature blocking it");
filter.add(new BlockingAttackerIdPredicate(this.getId())); filter.add(new BlockingAttackerIdPredicate(this.getId()));
this.addAbility(new BecomesBlockedSourceTriggeredAbility(new DoIfClashWonEffect(new DamageAllEffect(4,filter)),false)); this.addAbility(new BecomesBlockedSourceTriggeredAbility(new DoIfClashWonEffect(new DamageAllEffect(4,filter)),false));
} }

View file

@ -9,7 +9,8 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.common.FilterControlledArtifactPermanent; import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledPermanent;
import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetControlledPermanent;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
@ -23,7 +24,7 @@ public final class ForgeArmor extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{4}{R}"); super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{4}{R}");
// As an additional cost to cast Forge Armor, sacrifice an artifact. // As an additional cost to cast Forge Armor, sacrifice an artifact.
this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledArtifactPermanent()))); this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledPermanent(StaticFilters.FILTER_CONTROLLED_PERMANENT_ARTIFACT_AN))));
// Put X +1/+1 counters on target creature, where X is the sacrificed artifact's converted mana cost. // Put X +1/+1 counters on target creature, where X is the sacrificed artifact's converted mana cost.
this.getSpellAbility().addEffect(new AddCountersTargetEffect(new AddCountersTargetEffect( this.getSpellAbility().addEffect(new AddCountersTargetEffect(new AddCountersTargetEffect(
CounterType.P1P1.createInstance(), new SacrificeCostConvertedMana("artifact")))); CounterType.P1P1.createInstance(), new SacrificeCostConvertedMana("artifact"))));

View file

@ -48,7 +48,7 @@ class FromTheAshesEffect extends OneShotEffect {
public FromTheAshesEffect() { public FromTheAshesEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
this.staticText = "Destroy all nonbasic lands. For each land destroyed this way, its controller may search their library for a basic land card and put it onto the battlefield. Then each player who searched their library this way shuffles it"; this.staticText = "Destroy all nonbasic lands. For each land destroyed this way, its controller may search their library for a basic land card and put it onto the battlefield. Then each player who searched their library this way shuffles";
} }
public FromTheAshesEffect(final FromTheAshesEffect effect) { public FromTheAshesEffect(final FromTheAshesEffect effect) {

View file

@ -30,7 +30,8 @@ public final class GemOfBecoming extends CardImpl {
Ability ability = new SimpleActivatedAbility( Ability ability = new SimpleActivatedAbility(
new SearchLibraryPutInHandEffect( new SearchLibraryPutInHandEffect(
new GemOfBecomingTarget(), true new GemOfBecomingTarget(), true
), new GenericManaCost(3) ).setText("search your library for an Island card, a Swamp card, and a Mountain card. " +
"Reveal those cards, put them into your hand, then shuffle"), new GenericManaCost(3)
); );
ability.addCost(new TapSourceCost()); ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeSourceCost()); ability.addCost(new SacrificeSourceCost());

View file

@ -84,7 +84,7 @@ class GigantiformAbility extends StaticAbility {
@Override @Override
public String getRule() { public String getRule() {
return "Enchanted creature has base power and toughness 8/8 and has trample"; return "Enchanted creature has base power and toughness 8/8 and has trample.";
} }
} }

View file

@ -31,7 +31,7 @@ public final class GraspingCurrent extends CardImpl {
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2)); this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2));
// Search your library and/or graveyard for a card named Jace, Ingenious Mind-Mage, reveal it, then put it into your hand. If you searched your library this way, shuffle it. // Search your library and/or graveyard for a card named Jace, Ingenious Mind-Mage, reveal it, then put it into your hand. If you searched your library this way, shuffle it.
this.getSpellAbility().addEffect(new SearchLibraryGraveyardPutInHandEffect(filter)); this.getSpellAbility().addEffect(new SearchLibraryGraveyardPutInHandEffect(filter).concatBy("<br>"));
} }
private GraspingCurrent(final GraspingCurrent card) { private GraspingCurrent(final GraspingCurrent card) {

View file

@ -1,45 +1,44 @@
package mage.cards.g; package mage.cards.g;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.ActivateIfConditionActivatedAbility;
import mage.abilities.costs.Cost; import mage.abilities.condition.Condition;
import mage.abilities.costs.CostImpl;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect;
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.Duration; import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/** /**
*
* @author Loki * @author Loki
*/ */
public final class GreenhiltTrainee extends CardImpl { public final class GreenhiltTrainee extends CardImpl {
public GreenhiltTrainee (UUID ownerId, CardSetInfo setInfo) { public GreenhiltTrainee(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}");
this.subtype.add(SubType.ELF); this.subtype.add(SubType.ELF);
this.subtype.add(SubType.WARRIOR); this.subtype.add(SubType.WARRIOR);
this.power = new MageInt(2); this.power = new MageInt(2);
this.toughness = new MageInt(3); this.toughness = new MageInt(3);
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(4, 4, Duration.EndOfTurn), new TapSourceCost()); Ability ability = new ActivateIfConditionActivatedAbility(
Zone.BATTLEFIELD, new BoostTargetEffect(4, 4, Duration.EndOfTurn),
new TapSourceCost(), GreenhiltTraineeCondition.instance
);
ability.addTarget(new TargetCreaturePermanent()); ability.addTarget(new TargetCreaturePermanent());
ability.addCost(new GreenhiltTraineeCost());
this.addAbility(ability); this.addAbility(ability);
} }
public GreenhiltTrainee (final GreenhiltTrainee card) { public GreenhiltTrainee(final GreenhiltTrainee card) {
super(card); super(card);
} }
@ -49,35 +48,17 @@ public final class GreenhiltTrainee extends CardImpl {
} }
} }
class GreenhiltTraineeCost extends CostImpl { enum GreenhiltTraineeCondition implements Condition {
instance;
public GreenhiltTraineeCost() { @Override
this.text = "Activate only if Greenhilt Trainee's power is 4 or greater"; public boolean apply(Game game, Ability source) {
} Permanent permanent = source.getSourcePermanentIfItStillExists(game);
return permanent != null && permanent.getPower().getValue() >= 4;
public GreenhiltTraineeCost(final GreenhiltTraineeCost cost) {
super(cost);
} }
@Override @Override
public GreenhiltTraineeCost copy() { public String toString() {
return new GreenhiltTraineeCost(this); return "{this}'s power is 4 or greater";
}
@Override
public boolean canPay(Ability ability, Ability source, UUID controllerId, Game game) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
if (permanent.getPower().getValue() >= 4) {
return true;
}
}
return false;
}
@Override
public boolean pay(Ability ability, Game game, Ability source, UUID controllerId, boolean noMana, Cost costToPay) {
this.paid = true;
return paid;
} }
} }

View file

@ -34,7 +34,7 @@ public final class GuiseOfFire extends CardImpl {
// Enchanted creature gets +1/-1 and attacks each turn if able. // Enchanted creature gets +1/-1 and attacks each turn if able.
ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, -1, Duration.WhileOnBattlefield)); ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, -1, Duration.WhileOnBattlefield));
Effect effect = new AttacksIfAbleAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.AURA); Effect effect = new AttacksIfAbleAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.AURA);
effect.setText("and attacks each turn if able"); effect.setText("and attacks each combat if able");
ability.addEffect(effect); ability.addEffect(effect);
this.addAbility(ability); this.addAbility(ability);

View file

@ -9,7 +9,7 @@ import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalActivatedAbility; import mage.abilities.decorator.ConditionalActivatedAbility;
import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect;
import mage.abilities.effects.common.continuous.BoostEnchantedEffect; import mage.abilities.effects.common.continuous.BoostEquippedEffect;
import mage.abilities.keyword.EquipAbility; import mage.abilities.keyword.EquipAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
@ -33,7 +33,7 @@ public final class HauntedPlateMail extends CardImpl {
this.subtype.add(SubType.EQUIPMENT); this.subtype.add(SubType.EQUIPMENT);
// Equipped creature gets +4/+4. // Equipped creature gets +4/+4.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(4, 4))); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(4, 4)));
// {0}: Until end of turn, Haunted Plate Mail becomes a 4/4 Spirit artifact creature that's no longer an Equipment. Activate this ability only if you control no creatures. // {0}: Until end of turn, Haunted Plate Mail becomes a 4/4 Spirit artifact creature that's no longer an Equipment. Activate this ability only if you control no creatures.
Ability ability = new ConditionalActivatedAbility( Ability ability = new ConditionalActivatedAbility(
Zone.BATTLEFIELD, Zone.BATTLEFIELD,

View file

@ -50,7 +50,7 @@ class HiredGiantEffect extends OneShotEffect {
HiredGiantEffect() { HiredGiantEffect() {
super(Outcome.Detriment); super(Outcome.Detriment);
this.staticText = "each other player may search their library for a land card and put that card onto the battlefield. Then each player who searched their library this way shuffles it"; this.staticText = "each other player may search their library for a land card and put that card onto the battlefield. Then each player who searched their library this way shuffles";
} }
HiredGiantEffect(final HiredGiantEffect effect) { HiredGiantEffect(final HiredGiantEffect effect) {

View file

@ -1,11 +1,8 @@
package mage.cards.i; package mage.cards.i;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.DiesAttachedTriggeredAbility; import mage.abilities.common.DiesAttachedTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.combat.AttacksIfAbleAttachedEffect; import mage.abilities.effects.common.combat.AttacksIfAbleAttachedEffect;
import mage.abilities.effects.common.continuous.BoostEnchantedEffect; import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
@ -15,20 +12,16 @@ import mage.abilities.keyword.EnchantAbility;
import mage.abilities.keyword.HasteAbility; import mage.abilities.keyword.HasteAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AttachmentType; import mage.constants.*;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.filter.predicate.mageobject.NamePredicate; import mage.filter.predicate.mageobject.NamePredicate;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetCardInLibrary;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/** /**
*
* @author fireshoes * @author fireshoes
*/ */
public final class InfectiousBloodlust extends CardImpl { public final class InfectiousBloodlust extends CardImpl {
@ -40,7 +33,7 @@ public final class InfectiousBloodlust extends CardImpl {
} }
public InfectiousBloodlust(UUID ownerId, CardSetInfo setInfo) { public InfectiousBloodlust(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{R}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}");
this.subtype.add(SubType.AURA); this.subtype.add(SubType.AURA);
// Enchant creature // Enchant creature
@ -51,20 +44,19 @@ public final class InfectiousBloodlust extends CardImpl {
this.addAbility(ability); this.addAbility(ability);
// Enchanted creature gets +2/+1, has haste, and attacks each turn if able. // Enchanted creature gets +2/+1, has haste, and attacks each turn if able.
Effect effect = new BoostEnchantedEffect(2, 1); ability = new SimpleStaticAbility(new BoostEnchantedEffect(2, 1));
effect.setText("Enchanted creature gets +2/+1"); ability.addEffect(new GainAbilityAttachedEffect(
ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); HasteAbility.getInstance(), AttachmentType.AURA
effect = new GainAbilityAttachedEffect(HasteAbility.getInstance(), AttachmentType.AURA); ).setText(", has haste"));
effect.setText("has haste"); ability.addEffect(new AttacksIfAbleAttachedEffect(
ability.addEffect(effect); Duration.WhileOnBattlefield, AttachmentType.AURA
effect = new AttacksIfAbleAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.AURA); ).setText(", and attacks each combat if able"));
effect.setText("and attacks each turn if able");
ability.addEffect(effect);
this.addAbility(ability); this.addAbility(ability);
// When enchanted creature dies, you may search your library for a card named Infectious Bloodlust, reveal it, put it into your hand, then shuffle your library. // When enchanted creature dies, you may search your library for a card named Infectious Bloodlust, reveal it, put it into your hand, then shuffle your library.
TargetCardInLibrary target = new TargetCardInLibrary(0, 1, filter); this.addAbility(new DiesAttachedTriggeredAbility(new SearchLibraryPutInHandEffect(
this.addAbility(new DiesAttachedTriggeredAbility(new SearchLibraryPutInHandEffect(target, true, true), "enchanted creature", true)); new TargetCardInLibrary(filter), true, true
), "enchanted creature", true));
} }
private InfectiousBloodlust(final InfectiousBloodlust card) { private InfectiousBloodlust(final InfectiousBloodlust card) {

View file

@ -84,7 +84,7 @@ class InfiniteObliterationEffect extends SearchTargetGraveyardHandLibraryForCard
@Override @Override
public String getText(Mode mode) { public String getText(Mode mode) {
return "Name a creature card. " + super.getText(mode); return "Choose a creature card name. " + super.getText(mode);
} }
} }

View file

@ -24,7 +24,7 @@ public final class JourneyOfDiscovery extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{G}"); super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{G}");
// Choose one - Search your library for up to two basic land cards, reveal them, put them into your hand, then shuffle your library; // Choose one - Search your library for up to two basic land cards, reveal them, put them into your hand, then shuffle your library;
this.getSpellAbility().addEffect(new SearchLibraryPutInHandEffect(new TargetCardInLibrary(0, 2, StaticFilters.FILTER_CARD_BASIC_LAND), true)); this.getSpellAbility().addEffect(new SearchLibraryPutInHandEffect(new TargetCardInLibrary(0, 2, StaticFilters.FILTER_CARD_BASIC_LANDS), true));
// or you may play up to two additional lands this turn. // or you may play up to two additional lands this turn.
Mode mode = new Mode(); Mode mode = new Mode();

View file

@ -1,7 +1,5 @@
package mage.cards.l; package mage.cards.l;
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.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
@ -12,23 +10,23 @@ import mage.abilities.effects.common.continuous.PlayWithTheTopCardRevealedEffect
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.Zone;
import mage.target.TargetPlayer; import mage.target.TargetPlayer;
import java.util.UUID;
/** /**
*
* @author emerald000 * @author emerald000
*/ */
public final class LanternOfInsight extends CardImpl { public final class LanternOfInsight extends CardImpl {
public LanternOfInsight(UUID ownerId, CardSetInfo setInfo) { public LanternOfInsight(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{1}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}");
// Each player plays with the top card of their library revealed. // Each player plays with the top card of their library revealed.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PlayWithTheTopCardRevealedEffect(true))); this.addAbility(new SimpleStaticAbility(new PlayWithTheTopCardRevealedEffect(true)));
// {tap}, Sacrifice Lantern of Insight: Target player shuffles their library. // {tap}, Sacrifice Lantern of Insight: Target player shuffles their library.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ShuffleLibraryTargetEffect(), new TapSourceCost()); Ability ability = new SimpleActivatedAbility(new ShuffleLibraryTargetEffect().setText("target player shuffles"), new TapSourceCost());
ability.addCost(new SacrificeSourceCost()); ability.addCost(new SacrificeSourceCost());
ability.addTarget(new TargetPlayer()); ability.addTarget(new TargetPlayer());
this.addAbility(ability); this.addAbility(ability);

View file

@ -23,7 +23,7 @@ import mage.target.common.TargetCardInLibrary;
*/ */
public final class LilianasShade extends CardImpl { public final class LilianasShade extends CardImpl {
private static final FilterLandCard filter = new FilterLandCard("Swamp"); private static final FilterLandCard filter = new FilterLandCard("Swamp card");
static { static {
filter.add(SubType.SWAMP.getPredicate()); filter.add(SubType.SWAMP.getPredicate());
@ -37,7 +37,7 @@ public final class LilianasShade extends CardImpl {
this.toughness = new MageInt(1); this.toughness = new MageInt(1);
// When Liliana's Shade enters the battlefield, you may search your library for a Swamp card, reveal it, put it into your hand, then shuffle your library. // When Liliana's Shade enters the battlefield, you may search your library for a Swamp card, reveal it, put it into your hand, then shuffle your library.
this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true, true))); this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true, true), true));
// {B}: Liliana's Shade gets +1/+1 until end of turn. // {B}: Liliana's Shade gets +1/+1 until end of turn.
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 1, Duration.EndOfTurn), new ManaCostsImpl("{B}"))); this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 1, Duration.EndOfTurn), new ManaCostsImpl("{B}")));
} }

View file

@ -24,7 +24,7 @@ import mage.target.common.TargetCardInLibrary;
*/ */
public final class MwonvuliBeastTracker extends CardImpl { public final class MwonvuliBeastTracker extends CardImpl {
private static final FilterCard filter = new FilterCard("creature card with deathtouch, hexproof, reach, or trample in your library"); private static final FilterCard filter = new FilterCard("creature card with deathtouch, hexproof, reach, or trample");
static { static {
filter.add(CardType.CREATURE.getPredicate()); filter.add(CardType.CREATURE.getPredicate());

View file

@ -55,7 +55,7 @@ class MythosOfBrokkosEffect extends OneShotEffect {
MythosOfBrokkosEffect() { MythosOfBrokkosEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
staticText = "If {U}{B} was spent to cast Mythos of Brokkos, search your library for a card, " + staticText = "If {U}{B} was spent to cast this spell, search your library for a card, " +
"put that card into your graveyard, then shuffle.<br>" + "put that card into your graveyard, then shuffle.<br>" +
"Return up to two permanent cards from your graveyard to your hand."; "Return up to two permanent cards from your graveyard to your hand.";
} }

View file

@ -47,7 +47,7 @@ public final class NaturalBalance extends CardImpl {
public NaturalBalanceEffect() { public NaturalBalanceEffect() {
super(Outcome.PutCardInPlay); super(Outcome.PutCardInPlay);
this.staticText = "Each player who controls six or more lands chooses five lands they control and sacrifices the rest. Each player who controls four or fewer lands may search their library for up to X basic land cards and put them onto the battlefield, where X is five minus the number of lands they control. Then each player who searched their library this way shuffles it."; this.staticText = "Each player who controls six or more lands chooses five lands they control and sacrifices the rest. Each player who controls four or fewer lands may search their library for up to X basic land cards and put them onto the battlefield, where X is five minus the number of lands they control. Then each player who searched their library this way shuffles.";
} }
public NaturalBalanceEffect(final NaturalBalanceEffect effect) { public NaturalBalanceEffect(final NaturalBalanceEffect effect) {

View file

@ -43,7 +43,7 @@ class NewFrontiersEffect extends OneShotEffect {
public NewFrontiersEffect() { public NewFrontiersEffect() {
super(Outcome.Detriment); super(Outcome.Detriment);
this.staticText = "Each player may search their library for up to X basic land cards and put them onto the battlefield tapped. Then each player who searched their library this way shuffles it"; this.staticText = "Each player may search their library for up to X basic land cards and put them onto the battlefield tapped. Then each player who searched their library this way shuffles";
} }
public NewFrontiersEffect(final NewFrontiersEffect effect) { public NewFrontiersEffect(final NewFrontiersEffect effect) {

View file

@ -50,7 +50,7 @@ class NobleBenefactorEffect extends OneShotEffect {
public NobleBenefactorEffect() { public NobleBenefactorEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
this.staticText = "each player may search their library for a card and put that card into their hand. Then each player who searched their library this way shuffles it"; this.staticText = "each player may search their library for a card and put that card into their hand. Then each player who searched their library this way shuffles";
} }
public NobleBenefactorEffect(final NobleBenefactorEffect effect) { public NobleBenefactorEffect(final NobleBenefactorEffect effect) {

View file

@ -42,7 +42,7 @@ class PullingTeethEffect extends OneShotEffect {
public PullingTeethEffect() { public PullingTeethEffect() {
super(Outcome.Discard); super(Outcome.Discard);
this.staticText = "Clash with an opponent. If you win, target player discards two cards. Otherwise that player discards a card"; this.staticText = "Clash with an opponent. If you win, target player discards two cards. Otherwise, that player discards a card";
} }
public PullingTeethEffect(final PullingTeethEffect effect) { public PullingTeethEffect(final PullingTeethEffect effect) {

View file

@ -66,7 +66,7 @@ class QuestForTheHolyRelicEffect extends OneShotEffect {
QuestForTheHolyRelicEffect() { QuestForTheHolyRelicEffect() {
super(Outcome.PutCardInPlay); super(Outcome.PutCardInPlay);
this.staticText = "Search your library for an Equipment card, put it onto the battlefield, and attach it to a creature you control. Then shuffle"; this.staticText = "Search your library for an Equipment card, put it onto the battlefield, attach it to a creature you control, then shuffle";
} }
private QuestForTheHolyRelicEffect(final QuestForTheHolyRelicEffect effect) { private QuestForTheHolyRelicEffect(final QuestForTheHolyRelicEffect effect) {

View file

@ -76,6 +76,6 @@ class RageExtractorTriggeredAbility extends TriggeredAbilityImpl {
@Override @Override
public String getRule() { public String getRule() {
return "Whenever you cast a spell with p in its mana cost, {this} deals damage equal to that spell's mana value to any target."; return "Whenever you cast a spell with {P} in its mana cost, {this} deals damage equal to that spell's mana value to any target.";
} }
} }

View file

@ -8,6 +8,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
/** /**
@ -21,7 +22,7 @@ public final class RedeemTheLost extends CardImpl {
// Target creature you control gains protection from the color of your choice until end of turn. // Target creature you control gains protection from the color of your choice until end of turn.
this.getSpellAbility().addEffect(new GainProtectionFromColorTargetEffect(Duration.EndOfTurn)); this.getSpellAbility().addEffect(new GainProtectionFromColorTargetEffect(Duration.EndOfTurn));
this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent());
// Clash with an opponent. If you win, return Redeem the Lost to its owner's hand. // Clash with an opponent. If you win, return Redeem the Lost to its owner's hand.
this.getSpellAbility().addEffect(ClashWinReturnToHandSpellEffect.getInstance()); this.getSpellAbility().addEffect(ClashWinReturnToHandSpellEffect.getInstance());
} }

View file

@ -21,7 +21,7 @@ public final class ReviveTheFallen extends CardImpl {
// Return target creature card from a graveyard to its owner's hand. // Return target creature card from a graveyard to its owner's hand.
this.getSpellAbility().addEffect(new ReturnToHandTargetEffect()); this.getSpellAbility().addEffect(new ReturnToHandTargetEffect());
this.getSpellAbility().addTarget(new TargetCardInGraveyard(new FilterCreatureCard("creature card in a graveyard"))); this.getSpellAbility().addTarget(new TargetCardInGraveyard(new FilterCreatureCard("creature card from a graveyard")));
// Clash with an opponent. If you win, return Revive the Fallen to its owner's hand. // Clash with an opponent. If you win, return Revive the Fallen to its owner's hand.
this.getSpellAbility().addEffect(ClashWinReturnToHandSpellEffect.getInstance()); this.getSpellAbility().addEffect(ClashWinReturnToHandSpellEffect.getInstance());
} }

View file

@ -53,7 +53,7 @@ class RootweaverDruidEffect extends OneShotEffect {
staticText = "each opponent may search their library for up to three basic land cards. " + staticText = "each opponent may search their library for up to three basic land cards. " +
"They each put one of those cards onto the battlefield tapped under your control " + "They each put one of those cards onto the battlefield tapped under your control " +
"and the rest onto the battlefield tapped under their control. " + "and the rest onto the battlefield tapped under their control. " +
"Then each player who searched their library this way shuffles it"; "Then each player who searched their library this way shuffles";
} }
private RootweaverDruidEffect(final RootweaverDruidEffect effect) { private RootweaverDruidEffect(final RootweaverDruidEffect effect) {

View file

@ -25,7 +25,7 @@ import mage.target.common.TargetCardInLibrary;
*/ */
public final class SadisticSacrament extends CardImpl { public final class SadisticSacrament extends CardImpl {
private static final String ruleText = "Search target player's library for up to three cards, exile them, then that player shuffles. if this spell was kicked, instead search that player's library for up to fifteen cards, exile them, then that player shuffles"; private static final String ruleText = "Search target player's library for up to three cards, exile them, then that player shuffles. If this spell was kicked, instead search that player's library for up to fifteen cards, exile them, then that player shuffles";
public SadisticSacrament(UUID ownerId, CardSetInfo setInfo) { public SadisticSacrament(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{B}{B}{B}"); super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{B}{B}{B}");

View file

@ -27,8 +27,8 @@ import mage.target.common.TargetControlledCreaturePermanent;
*/ */
public final class ShadowbornApostle extends CardImpl { public final class ShadowbornApostle extends CardImpl {
private static final FilterCreatureCard filter = new FilterCreatureCard("a Demon creature"); private static final FilterCreatureCard filter = new FilterCreatureCard("a Demon creature card");
private static final FilterControlledCreaturePermanent filterApostle = new FilterControlledCreaturePermanent("six creatures named Shadowborn Apostle"); private static final FilterControlledCreaturePermanent filterApostle = new FilterControlledCreaturePermanent("creatures named Shadowborn Apostle");
static { static {
filter.add(SubType.DEMON.getPredicate()); filter.add(SubType.DEMON.getPredicate());
filterApostle.add(new NamePredicate("Shadowborn Apostle")); filterApostle.add(new NamePredicate("Shadowborn Apostle"));

View file

@ -30,7 +30,7 @@ public final class ShadowsOfThePast extends CardImpl {
// {4}{B}: Each opponent loses 2 life and you gain 2 life. Activate this ability only if there are four or more creature cards in your graveyard. // {4}{B}: Each opponent loses 2 life and you gain 2 life. Activate this ability only if there are four or more creature cards in your graveyard.
Ability ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD, Ability ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD,
new LoseLifeOpponentsEffect(2), new ManaCostsImpl<>("{4}{B}"), new CardsInControllerGraveyardCondition(4, StaticFilters.FILTER_CARD_CREATURE)); new LoseLifeOpponentsEffect(2), new ManaCostsImpl<>("{4}{B}"), new CardsInControllerGraveyardCondition(4, StaticFilters.FILTER_CARD_CREATURES));
Effect effect = new GainLifeEffect(2); Effect effect = new GainLifeEffect(2);
effect.setText("and you gain 2 life"); effect.setText("and you gain 2 life");
ability.addEffect(effect); ability.addEffect(effect);

View file

@ -33,7 +33,7 @@ public final class SilvergladePathfinder extends CardImpl {
// {1}{G}, {tap}, Discard a card: Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. // {1}{G}, {tap}, Discard a card: Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(0, 1, StaticFilters.FILTER_CARD_BASIC_LAND), true, true), new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND), true, true),
new ManaCostsImpl("{1}{G}")); new ManaCostsImpl("{1}{G}"));
ability.addCost(new TapSourceCost()); ability.addCost(new TapSourceCost());
ability.addCost(new DiscardCardCost()); ability.addCost(new DiscardCardCost());

View file

@ -1,11 +1,9 @@
package mage.cards.s; package mage.cards.s;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.Mode; import mage.abilities.Mode;
import mage.abilities.common.LimitedTimesPerTurnActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect;
import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.FlyingAbility;
@ -13,28 +11,29 @@ import mage.abilities.keyword.TrampleAbility;
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.Duration; import mage.constants.Duration;
import mage.constants.Zone; import mage.constants.SubType;
import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.TokenImpl;
import java.util.UUID;
/** /**
*
* @author North * @author North
*/ */
public final class Skinshifter extends CardImpl { public final class Skinshifter extends CardImpl {
public Skinshifter(UUID ownerId, CardSetInfo setInfo) { public Skinshifter(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}");
this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.SHAMAN); this.subtype.add(SubType.SHAMAN);
this.power = new MageInt(1); this.power = new MageInt(1);
this.toughness = new MageInt(1); this.toughness = new MageInt(1);
Ability ability = new LimitedTimesPerTurnActivatedAbility(Zone.BATTLEFIELD, Ability ability = new SimpleActivatedAbility(
new BecomesCreatureSourceEffect(new RhinoToken(), "", Duration.EndOfTurn), new BecomesCreatureSourceEffect(new RhinoToken(), "", Duration.EndOfTurn),
new ManaCostsImpl("{G}")); new ManaCostsImpl<>("{G}"));
ability.getModes().setChooseText("Choose one. Activate only once each turn.");
Mode mode = new Mode(); Mode mode = new Mode();
mode.addEffect(new BecomesCreatureSourceEffect(new BirdToken(), "", Duration.EndOfTurn)); mode.addEffect(new BecomesCreatureSourceEffect(new BirdToken(), "", Duration.EndOfTurn));
@ -56,7 +55,7 @@ public final class Skinshifter extends CardImpl {
return new Skinshifter(this); return new Skinshifter(this);
} }
private class RhinoToken extends TokenImpl { private static final class RhinoToken extends TokenImpl {
public RhinoToken() { public RhinoToken() {
super("Rhino", "Rhino with base power and toughness 4/4 and gains trample"); super("Rhino", "Rhino with base power and toughness 4/4 and gains trample");
@ -68,6 +67,7 @@ public final class Skinshifter extends CardImpl {
this.toughness = new MageInt(4); this.toughness = new MageInt(4);
this.addAbility(TrampleAbility.getInstance()); this.addAbility(TrampleAbility.getInstance());
} }
public RhinoToken(final RhinoToken token) { public RhinoToken(final RhinoToken token) {
super(token); super(token);
} }
@ -77,7 +77,7 @@ public final class Skinshifter extends CardImpl {
} }
} }
private class BirdToken extends TokenImpl { private static final class BirdToken extends TokenImpl {
public BirdToken() { public BirdToken() {
super("Bird", "Bird with base power and toughness 2/2 and gains flying"); super("Bird", "Bird with base power and toughness 2/2 and gains flying");
@ -89,6 +89,7 @@ public final class Skinshifter extends CardImpl {
this.toughness = new MageInt(2); this.toughness = new MageInt(2);
this.addAbility(FlyingAbility.getInstance()); this.addAbility(FlyingAbility.getInstance());
} }
public BirdToken(final BirdToken token) { public BirdToken(final BirdToken token) {
super(token); super(token);
} }
@ -98,7 +99,7 @@ public final class Skinshifter extends CardImpl {
} }
} }
private class PlantToken extends TokenImpl { private static final class PlantToken extends TokenImpl {
public PlantToken() { public PlantToken() {
super("Plant", "Plant with base power and toughness 0/8"); super("Plant", "Plant with base power and toughness 0/8");
@ -109,6 +110,7 @@ public final class Skinshifter extends CardImpl {
this.power = new MageInt(0); this.power = new MageInt(0);
this.toughness = new MageInt(8); this.toughness = new MageInt(8);
} }
public PlantToken(final PlantToken token) { public PlantToken(final PlantToken token) {
super(token); super(token);
} }

View file

@ -48,7 +48,7 @@ class SparkOfCreativityEffect extends OneShotEffect {
public SparkOfCreativityEffect() { public SparkOfCreativityEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
this.staticText = "Choose target creature. Exile the top card of your library. You may have Spark of Creativity deal damage to that creature equal to the mana value of the exiled card. If you don't, you may play that card until end of turn"; this.staticText = "Choose target creature. Exile the top card of your library. You may have {this} deal damage to that creature equal to the exiled card's mana value. If you don't, you may play that card until end of turn";
} }
public SparkOfCreativityEffect(final SparkOfCreativityEffect effect) { public SparkOfCreativityEffect(final SparkOfCreativityEffect effect) {

View file

@ -74,6 +74,6 @@ enum SpeakerOfTheHeavensCondition implements Condition {
@Override @Override
public String toString() { public String toString() {
return "you have at least 7 life more than your starting life total and only any time you could cast a sorcery"; return "you have at least 7 life more than your starting life total and only as a sorcery";
} }
} }

View file

@ -55,7 +55,7 @@ class SphinxAmbassadorEffect extends OneShotEffect {
public SphinxAmbassadorEffect() { public SphinxAmbassadorEffect() {
super(Outcome.PutCreatureInPlay); super(Outcome.PutCreatureInPlay);
this.staticText = "search that player's library for a card, then that player names a card. If you searched for a creature card that isn't the named card, you may put it onto the battlefield under your control. Then that player shuffles"; this.staticText = "search that player's library for a card, then that player chooses a card name. If you searched for a creature card that doesn't have that name, you may put it onto the battlefield under your control. Then that player shuffles";
} }
public SphinxAmbassadorEffect(final SphinxAmbassadorEffect effect) { public SphinxAmbassadorEffect(final SphinxAmbassadorEffect effect) {

View file

@ -65,7 +65,7 @@ class StonehewerGiantEffect extends OneShotEffect {
public StonehewerGiantEffect() { public StonehewerGiantEffect() {
super(Outcome.PutCardInPlay); super(Outcome.PutCardInPlay);
this.staticText = "Search your library for an Equipment card and put it onto the battlefield. Attach it to a creature you control. Then shuffle"; this.staticText = "search your library for an Equipment card, put it onto the battlefield, attach it to a creature you control, then shuffle";
} }
public StonehewerGiantEffect(final StonehewerGiantEffect effect) { public StonehewerGiantEffect(final StonehewerGiantEffect effect) {

View file

@ -47,7 +47,7 @@ class TemptWithDiscoveryEffect extends OneShotEffect {
public TemptWithDiscoveryEffect() { public TemptWithDiscoveryEffect() {
super(Outcome.PutLandInPlay); super(Outcome.PutLandInPlay);
this.staticText = "<i>Tempting offer</i> &mdash; Search your library for a land card and put it onto the battlefield. Each opponent may search their library for a land card and put it onto the battlefield. For each opponent who searches a library this way, search your library for a land card and put it onto the battlefield. Then each player who searched a library this way shuffles it"; this.staticText = "<i>Tempting offer</i> &mdash; Search your library for a land card and put it onto the battlefield. Each opponent may search their library for a land card and put it onto the battlefield. For each opponent who searches a library this way, search your library for a land card and put it onto the battlefield. Then each player who searched a library this way shuffles";
} }
public TemptWithDiscoveryEffect(final TemptWithDiscoveryEffect effect) { public TemptWithDiscoveryEffect(final TemptWithDiscoveryEffect effect) {

View file

@ -43,7 +43,7 @@ public final class TerentatekCub extends CardImpl {
new OpponentControlsPermanentCondition(filter), new OpponentControlsPermanentCondition(filter),
"As long as an opponent controls a Jedi or Sith, {this} gets +1/+1")); "As long as an opponent controls a Jedi or Sith, {this} gets +1/+1"));
Effect effect = new ConditionalRequirementEffect(new AttacksIfAbleSourceEffect(Duration.Custom), new OpponentControlsPermanentCondition(filter)); Effect effect = new ConditionalRequirementEffect(new AttacksIfAbleSourceEffect(Duration.Custom), new OpponentControlsPermanentCondition(filter));
effect.setText("and attacks each turn if able"); effect.setText("and attacks each combat if able");
ability.addEffect(effect); ability.addEffect(effect);
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -46,7 +46,7 @@ class TimesifterEffect extends OneShotEffect {
TimesifterEffect() { TimesifterEffect() {
super(Outcome.ExtraTurn); super(Outcome.ExtraTurn);
this.staticText = "each player exiles the top card of their library. The player who exiled the card with the highest mana value takes an extra turn after this one. If two or more players' cards are tied for highest cost, the tied players repeat this process until the tie is broken"; this.staticText = "each player exiles the top card of their library. The player who exiled the card with the highest mana value takes an extra turn after this one. If two or more players' cards are tied for highest, the tied players repeat this process until the tie is broken";
} }
TimesifterEffect(final TimesifterEffect effect) { TimesifterEffect(final TimesifterEffect effect) {

View file

@ -30,7 +30,7 @@ public final class ToothAndNail extends CardImpl {
// Choose one - // Choose one -
// Search your library for up to two creature cards, reveal them, put them into your hand, then shuffle your library; // Search your library for up to two creature cards, reveal them, put them into your hand, then shuffle your library;
this.getSpellAbility().addEffect(new SearchLibraryPutInHandEffect(new TargetCardInLibrary(0, 2, StaticFilters.FILTER_CARD_CREATURE), true)); this.getSpellAbility().addEffect(new SearchLibraryPutInHandEffect(new TargetCardInLibrary(0, 2, StaticFilters.FILTER_CARD_CREATURES), true));
// or put up to two creature cards from your hand onto the battlefield. // or put up to two creature cards from your hand onto the battlefield.
Mode mode = new Mode(); Mode mode = new Mode();
mode.addEffect(new ToothAndNailPutCreatureOnBattlefieldEffect()); mode.addEffect(new ToothAndNailPutCreatureOnBattlefieldEffect());

View file

@ -32,7 +32,7 @@ public final class TormentorsTrident extends CardImpl {
// Equipped creature gets +3/+0 and attacks each turn if able. // Equipped creature gets +3/+0 and attacks each turn if able.
Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(3, 0)); Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(3, 0));
Effect effect = new AttacksIfAbleAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.EQUIPMENT); Effect effect = new AttacksIfAbleAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.EQUIPMENT);
effect.setText("and attacks each turn if able"); effect.setText("and attacks each combat if able");
ability.addEffect(effect); ability.addEffect(effect);
this.addAbility(ability); this.addAbility(ability);

View file

@ -44,7 +44,7 @@ public final class UncontrollableAnger extends CardImpl {
// Enchanted creature gets +2/+2 and attacks each turn if able. // Enchanted creature gets +2/+2 and attacks each turn if able.
ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2, 2, Duration.WhileOnBattlefield)); ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2, 2, Duration.WhileOnBattlefield));
Effect effect = new AttacksIfAbleAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.AURA); Effect effect = new AttacksIfAbleAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.AURA);
effect.setText("and attacks each turn if able"); effect.setText("and attacks each combat if able");
ability.addEffect(effect); ability.addEffect(effect);
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -57,7 +57,7 @@ class VarragothBloodskySireEffect extends SearchEffect {
public VarragothBloodskySireEffect() { public VarragothBloodskySireEffect() {
super(new TargetCardInLibrary(), Outcome.DrawCard); super(new TargetCardInLibrary(), Outcome.DrawCard);
this.staticText = "Target player searches their library for a card, then shuffles and puts that card on top of it"; this.staticText = "Target player searches their library for a card, then shuffles and puts that card on top";
} }
private VarragothBloodskySireEffect(final VarragothBloodskySireEffect effect) { private VarragothBloodskySireEffect(final VarragothBloodskySireEffect effect) {

View file

@ -44,7 +44,7 @@ public final class ViviensJaguar extends CardImpl {
new ManaCostsImpl("{2}{G}"), new ManaCostsImpl("{2}{G}"),
new PermanentsOnTheBattlefieldCondition(filter), new PermanentsOnTheBattlefieldCondition(filter),
"{2}{G}: Return {this} from your graveyard to your hand. " "{2}{G}: Return {this} from your graveyard to your hand. "
+ "Activate only if you control a Vivien planeswalker" + "Activate only if you control a Vivien planeswalker."
)); ));
} }

View file

@ -61,7 +61,7 @@ class WaveOfVitriolEffect extends OneShotEffect {
public WaveOfVitriolEffect() { public WaveOfVitriolEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
this.staticText = "Each player sacrifices all artifacts, enchantments, and nonbasic lands they control. For each land sacrificed this way, its controller may search their library for a basic land card and put it onto the battlefield tapped. Then each player who searched their library this way shuffles it"; this.staticText = "Each player sacrifices all artifacts, enchantments, and nonbasic lands they control. For each land sacrificed this way, its controller may search their library for a basic land card and put it onto the battlefield tapped. Then each player who searched their library this way shuffles";
} }
public WaveOfVitriolEffect(final WaveOfVitriolEffect effect) { public WaveOfVitriolEffect(final WaveOfVitriolEffect effect) {

View file

@ -45,7 +45,7 @@ class WeirdHarvestEffect extends OneShotEffect {
public WeirdHarvestEffect() { public WeirdHarvestEffect() {
super(Outcome.Detriment); super(Outcome.Detriment);
this.staticText = "Each player may search their library for up to X creature cards, reveal those cards, and put them into their hand. Then each player who searched their library this way shuffles it"; this.staticText = "each player may search their library for up to X creature cards, reveal those cards, put them into their hand, then shuffle";
} }
public WeirdHarvestEffect(final WeirdHarvestEffect effect) { public WeirdHarvestEffect(final WeirdHarvestEffect effect) {

View file

@ -27,7 +27,7 @@ public final class WildWanderer extends CardImpl {
this.toughness = new MageInt(2); this.toughness = new MageInt(2);
// When Wild Wanderer enters the battlefield, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. // When Wild Wanderer enters the battlefield, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library.
this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND), true, true))); this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND), true, true), true));
} }
private WildWanderer(final WildWanderer card) { private WildWanderer(final WildWanderer card) {

View file

@ -1,43 +1,47 @@
package mage.cards.w; package mage.cards.w;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.ObjectColor; import mage.ObjectColor;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
import mage.cards.Card;
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.ComparisonType; import mage.constants.ComparisonType;
import mage.constants.Outcome; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.constants.Zone;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.filter.predicate.Predicates; import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.ColorPredicate; import mage.filter.predicate.mageobject.ColorPredicate;
import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.filter.predicate.mageobject.ManaValuePredicate;
import mage.game.Game;
import mage.players.Player;
import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetCardInLibrary;
import java.util.UUID;
/** /**
*
* @author fireshoes * @author fireshoes
*/ */
public final class WoodlandBellower extends CardImpl { public final class WoodlandBellower extends CardImpl {
private static final FilterCard filter = new FilterCard("nonlegendary green creature card with mana value 3 or less");
static {
filter.add(new ColorPredicate(ObjectColor.GREEN));
filter.add(CardType.CREATURE.getPredicate());
filter.add(Predicates.not(SuperType.LEGENDARY.getPredicate()));
filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 4));
}
public WoodlandBellower(UUID ownerId, CardSetInfo setInfo) { public WoodlandBellower(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{G}{G}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}{G}");
this.subtype.add(SubType.BEAST); this.subtype.add(SubType.BEAST);
this.power = new MageInt(6); this.power = new MageInt(6);
this.toughness = new MageInt(5); this.toughness = new MageInt(5);
// When Woodland Bellower enters the battlefield, you may search your library for a nonlegendary green creature card with converted mana cost 3 or less, put it onto the battlefield, then shuffle your library. // When Woodland Bellower enters the battlefield, you may search your library for a nonlegendary green creature card with converted mana cost 3 or less, put it onto the battlefield, then shuffle your library.
this.addAbility(new EntersBattlefieldTriggeredAbility(new WoodlandBellowerEffect(), true)); this.addAbility(new EntersBattlefieldTriggeredAbility(
new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter)), true
));
} }
private WoodlandBellower(final WoodlandBellower card) { private WoodlandBellower(final WoodlandBellower card) {
@ -49,45 +53,3 @@ public final class WoodlandBellower extends CardImpl {
return new WoodlandBellower(this); return new WoodlandBellower(this);
} }
} }
class WoodlandBellowerEffect extends OneShotEffect {
WoodlandBellowerEffect() {
super(Outcome.PutCreatureInPlay);
staticText = "Search your library for a nonlegendary green creature card with mana value 3 or less, put it onto the battlefield, then shuffle";
}
WoodlandBellowerEffect(final WoodlandBellowerEffect effect) {
super(effect);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller == null) {
return false;
}
FilterCard filter = new FilterCard("nonlegendary green creature card with mana value 3 or less");
filter.add(new ColorPredicate(ObjectColor.GREEN));
filter.add(CardType.CREATURE.getPredicate());
filter.add(Predicates.not(SuperType.LEGENDARY.getPredicate()));
filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 4));
TargetCardInLibrary target = new TargetCardInLibrary(filter);
if (controller.searchLibrary(target, source, game)) {
if (!target.getTargets().isEmpty()) {
Card card = controller.getLibrary().getCard(target.getFirstTarget(), game);
controller.moveCards(card, Zone.BATTLEFIELD, source, game);
}
controller.shuffleLibrary(source, game);
return true;
}
controller.shuffleLibrary(source, game);
return false;
}
@Override
public WoodlandBellowerEffect copy() {
return new WoodlandBellowerEffect(this);
}
}

View file

@ -44,7 +44,8 @@ public class LimitedTimesPerTurnActivatedAbility extends ActivatedAbilityImpl {
public String getRule() { public String getRule() {
StringBuilder sb = new StringBuilder(super.getRule()).append(" Activate "); StringBuilder sb = new StringBuilder(super.getRule()).append(" Activate ");
if (condition != null) { if (condition != null) {
sb.append("only ").append(condition.toString()).append(" and "); String message = condition.toString();
sb.append("only ").append(message.startsWith("if ") || message.startsWith("during") ? message : "if " + message).append(" and ");
} }
if (getTiming() == TimingRule.SORCERY) { if (getTiming() == TimingRule.SORCERY) {
sb.append("only as a sorcery and "); sb.append("only as a sorcery and ");

View file

@ -30,7 +30,7 @@ public class UntapAllLandsControllerEffect extends OneShotEffect {
public UntapAllLandsControllerEffect(FilterLandPermanent filter) { public UntapAllLandsControllerEffect(FilterLandPermanent filter) {
super(Outcome.Untap); super(Outcome.Untap);
staticText = "Untap all " + filter.getMessage() + " you control"; staticText = "untap all " + filter.getMessage() + " you control";
this.filter = filter; this.filter = filter;
} }

View file

@ -18,7 +18,7 @@ public class AttacksIfAbleAttachedEffect extends RequirementEffect {
public AttacksIfAbleAttachedEffect(Duration duration, AttachmentType attachmentType) { public AttacksIfAbleAttachedEffect(Duration duration, AttachmentType attachmentType) {
super(duration); super(duration);
this.staticText = attachmentType.verb() + " creature attacks each turn if able"; this.staticText = attachmentType.verb() + " creature attacks each combat if able";
} }
public AttacksIfAbleAttachedEffect(final AttacksIfAbleAttachedEffect effect) { public AttacksIfAbleAttachedEffect(final AttacksIfAbleAttachedEffect effect) {

View file

@ -50,7 +50,7 @@ public class AttacksIfAbleTargetEffect extends RequirementEffect {
if (this.duration == Duration.EndOfTurn) { if (this.duration == Duration.EndOfTurn) {
return "target " + mode.getTargets().get(0).getTargetName() + " attacks this turn if able"; return "target " + mode.getTargets().get(0).getTargetName() + " attacks this turn if able";
} else { } else {
return "target " + mode.getTargets().get(0).getTargetName() + " attacks each turn if able"; return "target " + mode.getTargets().get(0).getTargetName() + " attacks each combat if able";
} }
} }

View file

@ -146,9 +146,9 @@ public class BecomesCreatureSourceEffect extends ContinuousEffectImpl implements
private void setText() { private void setText() {
if (theyAreStillType != null && !theyAreStillType.isEmpty()) { if (theyAreStillType != null && !theyAreStillType.isEmpty()) {
staticText = duration.toString() + " {this} becomes a " + token.getDescription() + " that's still a " + this.theyAreStillType; staticText = duration.toString() + ", {this} becomes a " + token.getDescription() + " that's still a " + this.theyAreStillType;
} else { } else {
staticText = duration.toString() + " {this} becomes a " + token.getDescription(); staticText = duration.toString() + ", {this} becomes a " + token.getDescription();
} }
} }

View file

@ -54,6 +54,9 @@ public class PlayAdditionalLandsControllerEffect extends ContinuousEffectImpl {
if (additionalCards == Integer.MAX_VALUE) { if (additionalCards == Integer.MAX_VALUE) {
sb.append("any number of"); sb.append("any number of");
} else { } else {
if (additionalCards > 1 && duration == Duration.EndOfTurn) {
sb.append("up to ");
}
sb.append(CardUtil.numberToText(additionalCards, "an")); sb.append(CardUtil.numberToText(additionalCards, "an"));
} }
sb.append(" additional land").append((additionalCards == 1 ? "" : "s")) sb.append(" additional land").append((additionalCards == 1 ? "" : "s"))

View file

@ -35,7 +35,7 @@ public class SearchLibraryGraveyardPutInHandEffect extends OneShotEffect {
this.filter = filter; this.filter = filter;
this.forceToSearchBoth = forceToSearchBoth; this.forceToSearchBoth = forceToSearchBoth;
staticText = (youMay ? "you may " : "") + "search your library and" + (forceToSearchBoth ? "" : "/or") + " graveyard for a card named " + filter.getMessage() staticText = (youMay ? "you may " : "") + "search your library and" + (forceToSearchBoth ? "" : "/or") + " graveyard for a card named " + filter.getMessage()
+ ", reveal it, then put it into your hand. " + (forceToSearchBoth ? "Then shuffle" : "If you search your library this way, shuffle"); + ", reveal it, and put it into your hand. " + (forceToSearchBoth ? "Then shuffle" : "If you search your library this way, shuffle");
} }
public SearchLibraryGraveyardPutInHandEffect(final SearchLibraryGraveyardPutInHandEffect effect) { public SearchLibraryGraveyardPutInHandEffect(final SearchLibraryGraveyardPutInHandEffect effect) {