text fixes and test fixes to fix how tests test text, then more text next

This commit is contained in:
Evan Kranzler 2017-10-07 16:08:06 -04:00
parent 14107b3d55
commit 54b8f10c3c
76 changed files with 247 additions and 227 deletions

View file

@ -56,7 +56,9 @@ public class BanishingKnack extends CardImpl {
Ability gainedAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), new TapSourceCost()); Ability gainedAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), new TapSourceCost());
gainedAbility.addTarget(new TargetPermanent(filter)); gainedAbility.addTarget(new TargetPermanent(filter));
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(gainedAbility, Duration.EndOfTurn)); this.getSpellAbility().addEffect(new GainAbilityTargetEffect(gainedAbility, Duration.EndOfTurn)
.setText("Until end of turn, target creature gains \"{T}: Return target nonland permanent to its owner's hand.\"")
);
this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addTarget(new TargetCreaturePermanent());
} }

View file

@ -50,7 +50,7 @@ import mage.filter.predicate.permanent.AnotherPredicate;
*/ */
public class BelltollDragon extends CardImpl { public class BelltollDragon extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("each other Dragon creature you control"); private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("other Dragon creature you control");
static { static {
filter.add(new AnotherPredicate()); filter.add(new AnotherPredicate());

View file

@ -64,10 +64,10 @@ public class BlackManaBattery extends CardImpl {
Mana.BlackMana(1), Mana.BlackMana(1),
new IntPlusDynamicValue(1, new RemovedCountersForCostValue()), new IntPlusDynamicValue(1, new RemovedCountersForCostValue()),
new TapSourceCost(), new TapSourceCost(),
"Add {B} to your mana pool, then add {B} to your mana pool for each storage counter removed this way", "Add {B} to your mana pool, then add {B} to your mana pool for each charge counter removed this way",
true, new CountersSourceCount(CounterType.STORAGE)); true, new CountersSourceCount(CounterType.CHARGE));
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(), ability.addCost(new RemoveVariableCountersSourceCost(CounterType.CHARGE.createInstance(),
"Remove any number of storage counters from {this}")); "Remove any number of charge counters from {this}"));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -64,10 +64,10 @@ public class BlueManaBattery extends CardImpl {
Mana.BlueMana(1), Mana.BlueMana(1),
new IntPlusDynamicValue(1, new RemovedCountersForCostValue()), new IntPlusDynamicValue(1, new RemovedCountersForCostValue()),
new TapSourceCost(), new TapSourceCost(),
"Add {U} to your mana pool, then add {U} to your mana pool for each storage counter removed this way", "Add {U} to your mana pool, then add {U} to your mana pool for each charge counter removed this way",
true, new CountersSourceCount(CounterType.STORAGE)); true, new CountersSourceCount(CounterType.CHARGE));
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(), ability.addCost(new RemoveVariableCountersSourceCost(CounterType.CHARGE.createInstance(),
"Remove any number of storage counters from {this}")); "Remove any number of charge counters from {this}"));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -54,7 +54,6 @@ public class DeityOfScars extends CardImpl {
this.subtype.add(SubType.SPIRIT); this.subtype.add(SubType.SPIRIT);
this.subtype.add(SubType.AVATAR); this.subtype.add(SubType.AVATAR);
this.power = new MageInt(7); this.power = new MageInt(7);
this.toughness = new MageInt(7); this.toughness = new MageInt(7);
@ -62,7 +61,7 @@ public class DeityOfScars extends CardImpl {
this.addAbility(TrampleAbility.getInstance()); this.addAbility(TrampleAbility.getInstance());
// Deity of Scars enters the battlefield with two -1/-1 counters on it. // Deity of Scars enters the battlefield with two -1/-1 counters on it.
this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.M1M1.createInstance(2)))); this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.M1M1.createInstance(2)), "with two -1/-1 counters on it"));
// {B/G}, Remove a -1/-1 counter from Deity of Scars: Regenerate Deity of Scars. // {B/G}, Remove a -1/-1 counter from Deity of Scars: Regenerate Deity of Scars.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{B/G}")); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{B/G}"));

View file

@ -45,7 +45,7 @@ import mage.filter.common.FilterAttackingCreature;
/** /**
* *
* @author jeffwadsworth * @author jeffwadsworth
*
*/ */
public class DuergarMineCaptain extends CardImpl { public class DuergarMineCaptain extends CardImpl {
@ -58,7 +58,10 @@ public class DuergarMineCaptain extends CardImpl {
this.toughness = new MageInt(1); this.toughness = new MageInt(1);
// {1}{RW}, {untap}: Attacking creatures get +1/+0 until end of turn. // {1}{RW}, {untap}: Attacking creatures get +1/+0 until end of turn.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostAllEffect(1, 0, Duration.EndOfTurn, new FilterAttackingCreature(), false), new ManaCostsImpl("{1}{R/W}")); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
new BoostAllEffect(1, 0, Duration.EndOfTurn, new FilterAttackingCreature("attacking creatures"), false),
new ManaCostsImpl("{1}{R/W}")
);
ability.addCost(new UntapSourceCost()); ability.addCost(new UntapSourceCost());
this.addAbility(ability); this.addAbility(ability);

View file

@ -46,7 +46,7 @@ import mage.target.common.TargetCardInYourGraveyard;
*/ */
public class DutifulAttendant extends CardImpl { public class DutifulAttendant extends CardImpl {
private static final FilterCreatureCard filter = new FilterCreatureCard("another creature card from your graveyard"); private static final FilterCreatureCard filter = new FilterCreatureCard("another target creature card from your graveyard");
static { static {
filter.add(new AnotherCardPredicate()); filter.add(new AnotherCardPredicate());

View file

@ -37,6 +37,7 @@ import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AbilityWord;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.Zone; import mage.constants.Zone;
@ -56,13 +57,12 @@ public class FieryBombardment extends CardImpl {
public FieryBombardment(UUID ownerId, CardSetInfo setInfo) { public FieryBombardment(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}");
// Chroma - {2}, Sacrifice a creature: Fiery Bombardment deals damage to target creature or player equal to the number of red mana symbols in the sacrificed creature's mana cost. // Chroma - {2}, Sacrifice a creature: Fiery Bombardment deals damage to target creature or player equal to the number of red mana symbols in the sacrificed creature's mana cost.
Effect effect = new FieryBombardmentEffect(); Effect effect = new FieryBombardmentEffect();
effect.setText("<i>Chroma</i> - Fiery Bombardment deals damage to target creature or player equal to the number of red mana symbols in the sacrificed creature's mana cost.");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{2}")); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{2}"));
ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent())); ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent()));
ability.addTarget(new TargetCreatureOrPlayer()); ability.addTarget(new TargetCreatureOrPlayer());
ability.setAbilityWord(AbilityWord.CHROMA);
this.addAbility(ability); this.addAbility(ability);
} }
@ -81,6 +81,7 @@ class FieryBombardmentEffect extends OneShotEffect {
public FieryBombardmentEffect() { public FieryBombardmentEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
staticText = "{this} deals damage to target creature or player equal to the number of red mana symbols in the sacrificed creature's mana cost.";
} }
public FieryBombardmentEffect(final FieryBombardmentEffect effect) { public FieryBombardmentEffect(final FieryBombardmentEffect effect) {

View file

@ -56,9 +56,8 @@ public class FireAtWill extends CardImpl {
public FireAtWill(UUID ownerId, CardSetInfo setInfo) { public FireAtWill(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{R/W}{R/W}{R/W}"); super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{R/W}{R/W}{R/W}");
// Fire at Will deals 3 damage divided as you choose among one, two, or three target attacking or blocking creatures. // Fire at Will deals 3 damage divided as you choose among one, two, or three target attacking or blocking creatures.
this.getSpellAbility().addEffect(new DamageMultiEffect(3)); this.getSpellAbility().addEffect(new DamageMultiEffect(3).setText("{this} deals 3 damage divided as you choose among one, two, or three target attacking or blocking creatures."));
this.getSpellAbility().addTarget(new TargetCreaturePermanentAmount(3, filter)); this.getSpellAbility().addTarget(new TargetCreaturePermanentAmount(3, filter));
} }

View file

@ -80,7 +80,7 @@ class GilderBairnEffect extends OneShotEffect {
public GilderBairnEffect() { public GilderBairnEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
this.staticText = "For each counter on target permanent, put another of those counters on that permanent"; this.staticText = "Double the number of each kind of counter on target permanent";
} }
public GilderBairnEffect(final GilderBairnEffect effect) { public GilderBairnEffect(final GilderBairnEffect effect) {

View file

@ -70,7 +70,9 @@ public class GleamOfAuthority extends CardImpl {
// Enchanted creature gets +1/+1 for each +1/+1 counter on other creatures you control // Enchanted creature gets +1/+1 for each +1/+1 counter on other creatures you control
DynamicValue amount = new CountersOnControlledCount(); DynamicValue amount = new CountersOnControlledCount();
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(amount, amount, Duration.WhileOnBattlefield))); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(amount, amount, Duration.WhileOnBattlefield)
.setText("Enchanted creature gets +1/+1 for each +1/+1 counter on other creatures you control.")
));
// Enchanted creature has vigilance and "{W}, {T}: Bloster 1." // Enchanted creature has vigilance and "{W}, {T}: Bloster 1."
ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(VigilanceAbility.getInstance(), AttachmentType.AURA)); ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(VigilanceAbility.getInstance(), AttachmentType.AURA));

View file

@ -64,10 +64,10 @@ public class GreenManaBattery extends CardImpl {
Mana.GreenMana(1), Mana.GreenMana(1),
new IntPlusDynamicValue(1, new RemovedCountersForCostValue()), new IntPlusDynamicValue(1, new RemovedCountersForCostValue()),
new TapSourceCost(), new TapSourceCost(),
"Add {G} to your mana pool, then add {G} to your mana pool for each storage counter removed this way", "Add {G} to your mana pool, then add {G} to your mana pool for each charge counter removed this way",
true, new CountersSourceCount(CounterType.STORAGE)); true, new CountersSourceCount(CounterType.CHARGE));
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(), ability.addCost(new RemoveVariableCountersSourceCost(CounterType.CHARGE.createInstance(),
"Remove any number of storage counters from {this}")); "Remove any number of charge counters from {this}"));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -50,7 +50,7 @@ import mage.counters.CounterType;
*/ */
public class HelixPinnacle extends CardImpl { public class HelixPinnacle extends CardImpl {
static final String rule = "if there are 100 or more tower counters on Helix Pinnacle, you win the game"; static final String rule = "at the beginning of your upkeep, if there are 100 or more tower counters on Helix Pinnacle, you win the game";
public HelixPinnacle(UUID ownerId, CardSetInfo setInfo) { public HelixPinnacle(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{G}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{G}");

View file

@ -54,7 +54,7 @@ public class MerrowBonegnawer extends CardImpl {
private UUID exileId = UUID.randomUUID(); private UUID exileId = UUID.randomUUID();
private static final FilterSpell filter = new FilterSpell("black spell"); private static final FilterSpell filter = new FilterSpell("a black spell");
static { static {
filter.add(new ColorPredicate(ObjectColor.BLACK)); filter.add(new ColorPredicate(ObjectColor.BLACK));

View file

@ -60,8 +60,8 @@ public class Moonhold extends CardImpl {
// Target player can't play land cards this turn if {R} was spent to cast Moonhold and can't play creature cards this turn if {W} was spent to cast it. // Target player can't play land cards this turn if {R} was spent to cast Moonhold and can't play creature cards this turn if {W} was spent to cast it.
ContinuousRuleModifyingEffect effect = new MoonholdEffect(); ContinuousRuleModifyingEffect effect = new MoonholdEffect();
ContinuousRuleModifyingEffect effect2 = new MoonholdEffect2(); ContinuousRuleModifyingEffect effect2 = new MoonholdEffect2();
effect.setText("Target player can't play land cards this turn if {R} was spent to cast {this} "); effect.setText("Target player can't play lands this turn if {R} was spent to cast {this}");
effect2.setText("and can't play creature cards this turn if {W} was spent to cast it."); effect2.setText("and can't cast creature spells this turn if {W} was spent to cast it.");
this.getSpellAbility().addEffect(new ConditionalContinuousRuleModifyingEffect( this.getSpellAbility().addEffect(new ConditionalContinuousRuleModifyingEffect(
effect, effect,
new LockedInCondition(new ManaWasSpentCondition(ColoredManaSymbol.R)))); new LockedInCondition(new ManaWasSpentCondition(ColoredManaSymbol.R))));

View file

@ -58,7 +58,7 @@ public class NightskyMimic extends CardImpl {
filter.add(new ColorPredicate(ObjectColor.BLACK)); filter.add(new ColorPredicate(ObjectColor.BLACK));
} }
private String rule = "Whenever you cast a spell that's both white and black, {this} has base power and toughness 4/4 until end of turn and gains flying until end of turn"; private String rule = "Whenever you cast a spell that's both white and black, {this} has base power and toughness 4/4 until end of turn and gains flying until end of turn.";
public NightskyMimic(UUID ownerId, CardSetInfo setInfo) { public NightskyMimic(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W/B}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W/B}");

View file

@ -46,6 +46,7 @@ public class PunctureBlast extends CardImpl {
this.addAbility(WitherAbility.getInstance()); this.addAbility(WitherAbility.getInstance());
this.getSpellAbility().addEffect(new DamageTargetEffect(3)); this.getSpellAbility().addEffect(new DamageTargetEffect(3));
this.getSpellAbility().addTarget(new TargetCreatureOrPlayer()); this.getSpellAbility().addTarget(new TargetCreatureOrPlayer());
this.getSpellAbility().setRuleAtTheTop(false);
} }
public PunctureBlast(final PunctureBlast card) { public PunctureBlast(final PunctureBlast card) {

View file

@ -64,10 +64,10 @@ public class RedManaBattery extends CardImpl {
Mana.RedMana(1), Mana.RedMana(1),
new IntPlusDynamicValue(1, new RemovedCountersForCostValue()), new IntPlusDynamicValue(1, new RemovedCountersForCostValue()),
new TapSourceCost(), new TapSourceCost(),
"Add {R} to your mana pool, then add {R} to your mana pool for each storage counter removed this way", "Add {R} to your mana pool, then add {R} to your mana pool for each charge counter removed this way",
true, new CountersSourceCount(CounterType.STORAGE)); true, new CountersSourceCount(CounterType.CHARGE));
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(), ability.addCost(new RemoveVariableCountersSourceCost(CounterType.CHARGE.createInstance(),
"Remove any number of storage counters from {this}")); "Remove any number of charge counters from {this}"));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -31,7 +31,7 @@ import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.condition.Condition; import mage.abilities.condition.Condition;
import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.decorator.ConditionalTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect; import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
@ -54,13 +54,16 @@ public class RekindledFlame extends CardImpl {
public RekindledFlame(UUID ownerId, CardSetInfo setInfo) { public RekindledFlame(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{R}{R}"); super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{R}{R}");
// Rekindled Flame deals 4 damage to target creature or player. // Rekindled Flame deals 4 damage to target creature or player.
this.getSpellAbility().addEffect(new DamageTargetEffect(4)); this.getSpellAbility().addEffect(new DamageTargetEffect(4));
this.getSpellAbility().addTarget(new TargetCreatureOrPlayer()); this.getSpellAbility().addTarget(new TargetCreatureOrPlayer());
// At the beginning of your upkeep, if an opponent has no cards in hand, you may return Rekindled Flame from your graveyard to your hand. // At the beginning of your upkeep, if an opponent has no cards in hand, you may return Rekindled Flame from your graveyard to your hand.
Ability ability = new BeginningOfUpkeepTriggeredAbility(Zone.GRAVEYARD, new ConditionalOneShotEffect(new ReturnSourceFromGraveyardToHandEffect(), new OpponentHasNoCardsInHandCondition(), rule), TargetController.YOU, true); Ability ability = new ConditionalTriggeredAbility(
new BeginningOfUpkeepTriggeredAbility(
Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), TargetController.YOU, true
),
new OpponentHasNoCardsInHandCondition(), rule);
ability.setRuleVisible(true); ability.setRuleVisible(true);
this.addAbility(ability); this.addAbility(ability);

View file

@ -58,7 +58,7 @@ public class ShorecrasherMimic extends CardImpl {
filter.add(new ColorPredicate(ObjectColor.BLUE)); filter.add(new ColorPredicate(ObjectColor.BLUE));
} }
private String rule = "Whenever you cast a spell that's both green and blue, {this} has base power and toughness 5/3 until end of turn and gains trample until end of turn"; private String rule = "Whenever you cast a spell that's both green and blue, {this} has base power and toughness 5/3 until end of turn and gains trample until end of turn.";
public ShorecrasherMimic(UUID ownerId, CardSetInfo setInfo) { public ShorecrasherMimic(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G/U}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G/U}");

View file

@ -55,7 +55,6 @@ public class TalarasBane extends CardImpl {
public TalarasBane(UUID ownerId, CardSetInfo setInfo) { public TalarasBane(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}"); super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}");
// Target opponent reveals his or her hand. You choose a green or white creature card from it. You gain life equal that creature card's toughness, then that player discards that card. // Target opponent reveals his or her hand. You choose a green or white creature card from it. You gain life equal that creature card's toughness, then that player discards that card.
this.getSpellAbility().addEffect(new TalarasBaneEffect()); this.getSpellAbility().addEffect(new TalarasBaneEffect());
this.getSpellAbility().addTarget(new TargetOpponent()); this.getSpellAbility().addTarget(new TargetOpponent());
@ -85,7 +84,7 @@ class TalarasBaneEffect extends OneShotEffect {
public TalarasBaneEffect() { public TalarasBaneEffect() {
super(Outcome.Detriment); super(Outcome.Detriment);
this.staticText = "Target opponent reveals his or her hand. You choose a green or white creature card from it. You gain life equal that creature card's toughness, then that player discards that card"; this.staticText = "Target opponent reveals his or her hand. You choose a green or white creature card from it. You gain life equal to that creature card's toughness, then that player discards that card";
} }
public TalarasBaneEffect(final TalarasBaneEffect effect) { public TalarasBaneEffect(final TalarasBaneEffect effect) {

View file

@ -45,7 +45,7 @@ import mage.watchers.common.ManaSpentToCastWatcher;
/** /**
* *
* @author jeffwadsworth * @author jeffwadsworth
*
*/ */
public class UnnervingAssault extends CardImpl { public class UnnervingAssault extends CardImpl {
@ -60,14 +60,13 @@ public class UnnervingAssault extends CardImpl {
public UnnervingAssault(UUID ownerId, CardSetInfo setInfo) { public UnnervingAssault(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U/R}"); super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U/R}");
// Creatures your opponents control get -1/-0 until end of turn if {U} was spent to cast Unnerving Assault, and creatures you control get +1/+0 until end of turn if {R} was spent to cast it. // Creatures your opponents control get -1/-0 until end of turn if {U} was spent to cast Unnerving Assault, and creatures you control get +1/+0 until end of turn if {R} was spent to cast it.
this.getSpellAbility().addEffect(new ConditionalContinuousEffect( this.getSpellAbility().addEffect(new ConditionalContinuousEffect(
new BoostAllEffect(-1, 0, Duration.EndOfTurn, filter, false), new BoostAllEffect(-1, 0, Duration.EndOfTurn, filter, false),
new ManaWasSpentCondition(ColoredManaSymbol.U), "Creatures your opponents control get -1/0 until end of turn if {U} was spent to cast {this},")); new ManaWasSpentCondition(ColoredManaSymbol.U), "Creatures your opponents control get -1/-0 until end of turn if {U} was spent to cast {this},"));
this.getSpellAbility().addEffect(new ConditionalContinuousEffect( this.getSpellAbility().addEffect(new ConditionalContinuousEffect(
new BoostAllEffect(1, 0, Duration.EndOfTurn, filter2, false), new BoostAllEffect(1, 0, Duration.EndOfTurn, filter2, false),
new ManaWasSpentCondition(ColoredManaSymbol.R), " and creatures you control get +1/0 until end of turn if {R} was spent to cast it")); new ManaWasSpentCondition(ColoredManaSymbol.R), " and creatures you control get +1/+0 until end of turn if {R} was spent to cast it"));
this.getSpellAbility().addEffect(new InfoEffect("<i>(Do both if {U}{R} was spent.)</i>")); this.getSpellAbility().addEffect(new InfoEffect("<i>(Do both if {U}{R} was spent.)</i>"));
this.getSpellAbility().addWatcher(new ManaSpentToCastWatcher()); this.getSpellAbility().addWatcher(new ManaSpentToCastWatcher());
@ -82,4 +81,3 @@ public class UnnervingAssault extends CardImpl {
return new UnnervingAssault(this); return new UnnervingAssault(this);
} }
} }

View file

@ -98,7 +98,7 @@ class BecomesUntappedControlledPermanentTriggeredAbility extends TriggeredAbilit
@Override @Override
public String getRule() { public String getRule() {
return "When a permanent you control becomes untapped, " + super.getRule(); return "Whenever a permanent you control becomes untapped, " + super.getRule();
} }
} }

View file

@ -76,7 +76,9 @@ class WardOfBonesEffect extends ContinuousRuleModifyingEffectImpl {
public WardOfBonesEffect() { public WardOfBonesEffect() {
super(Duration.WhileOnBattlefield, Outcome.Benefit); super(Duration.WhileOnBattlefield, Outcome.Benefit);
staticText = "Each opponent who controls more creatures than you can't play creature cards. The same is true for artifacts, enchantments, and lands"; staticText = "Each opponent who controls more creatures than you can't cast creature spells. "
+ "The same is true for artifacts and enchantments.<br><br>"
+ "Each opponent who controls more lands than you can't play lands.";
} }
public WardOfBonesEffect(final WardOfBonesEffect effect) { public WardOfBonesEffect(final WardOfBonesEffect effect) {

View file

@ -64,10 +64,10 @@ public class WhiteManaBattery extends CardImpl {
Mana.WhiteMana(1), Mana.WhiteMana(1),
new IntPlusDynamicValue(1, new RemovedCountersForCostValue()), new IntPlusDynamicValue(1, new RemovedCountersForCostValue()),
new TapSourceCost(), new TapSourceCost(),
"Add {W} to your mana pool, then add {W} to your mana pool for each storage counter removed this way", "Add {W} to your mana pool, then add {W} to your mana pool for each charge counter removed this way",
true, new CountersSourceCount(CounterType.STORAGE)); true, new CountersSourceCount(CounterType.CHARGE));
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(), ability.addCost(new RemoveVariableCountersSourceCost(CounterType.CHARGE.createInstance(),
"Remove any number of storage counters from {this}")); "Remove any number of charge counters from {this}"));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -214,7 +214,7 @@ public class ExchangeControlTest extends CardTestPlayerBase {
addTarget(playerA, "Manta Riders"); addTarget(playerA, "Manta Riders");
// now use the activated ability to make the "Silvercoat Lions" (that became Mana Riders) flying // now use the activated ability to make the "Silvercoat Lions" (that became Mana Riders) flying
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{U}: {this} gains Flying until end of turn."); activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{U}: {this} gains flying until end of turn.");
setStopAt(1, PhaseStep.END_TURN); setStopAt(1, PhaseStep.END_TURN);
execute(); execute();

View file

@ -1,12 +1,10 @@
package org.mage.test.cards.mana; package org.mage.test.cards.mana;
import mage.abilities.costs.mana.ColorlessManaCost;
import mage.constants.ManaType; import mage.constants.ManaType;
import mage.constants.PhaseStep; import mage.constants.PhaseStep;
import mage.constants.Zone; import mage.constants.Zone;
import org.junit.Test; import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase; import org.mage.test.serverside.base.CardTestPlayerBase;
import org.mage.test.serverside.base.impl.CardTestAPIImpl;
public class DoublingCubeTest extends CardTestPlayerBase { public class DoublingCubeTest extends CardTestPlayerBase {
@ -26,7 +24,6 @@ public class DoublingCubeTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, cube); addCard(Zone.BATTLEFIELD, playerA, cube);
addCard(Zone.BATTLEFIELD, playerA, upwelling); addCard(Zone.BATTLEFIELD, playerA, upwelling);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {G} to your mana pool"); activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {G} to your mana pool");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {G} to your mana pool"); activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {G} to your mana pool");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {G} to your mana pool"); activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {G} to your mana pool");
@ -38,6 +35,5 @@ public class DoublingCubeTest extends CardTestPlayerBase {
execute(); execute();
assertManaPool(playerA, ManaType.COLORLESS, 4); assertManaPool(playerA, ManaType.COLORLESS, 4);
} }
} }

View file

@ -52,8 +52,8 @@ public class HarvesterDruidTest extends CardTestPlayerBase {
execute(); execute();
ManaOptions options = playerA.getAvailableManaTest(currentGame); ManaOptions options = playerA.getAvailableManaTest(currentGame);
Assert.assertEquals("Player should be able to create 2 red and 1 blue mana", "{R}{R}{U}", options.get(0).toString()); Assert.assertEquals("Player should be able to create 2 red and 1 blue mana", "{U}{R}{R}", options.get(0).toString());
Assert.assertEquals("Player should be able to create 1 red and 3 blue mana", "{R}{U}{U}", options.get(1).toString()); Assert.assertEquals("Player should be able to create 1 red and 3 blue mana", "{U}{U}{R}", options.get(1).toString());
} }
@Test @Test
@ -68,9 +68,9 @@ public class HarvesterDruidTest extends CardTestPlayerBase {
execute(); execute();
ManaOptions options = playerA.getAvailableManaTest(currentGame); ManaOptions options = playerA.getAvailableManaTest(currentGame);
Assert.assertEquals("Player should be able to create 3 red and 1 blue mana", "{R}{R}{R}{U}", options.get(0).toString()); Assert.assertEquals("Player should be able to create 3 red and 1 blue mana", "{U}{R}{R}{R}", options.get(0).toString());
Assert.assertEquals("Player should be able to create 2 red and 2 blue mana", "{R}{R}{U}{U}", options.get(1).toString()); Assert.assertEquals("Player should be able to create 2 red and 2 blue mana", "{U}{U}{R}{R}", options.get(1).toString());
Assert.assertEquals("Player should be able to create 2 red and 2 blue mana", "{R}{R}{U}{U}", options.get(2).toString()); Assert.assertEquals("Player should be able to create 2 red and 2 blue mana", "{U}{U}{R}{R}", options.get(2).toString());
Assert.assertEquals("Player should be able to create 1 red and 3 blue mana", "{R}{U}{U}{U}", options.get(3).toString()); Assert.assertEquals("Player should be able to create 1 red and 3 blue mana", "{U}{U}{U}{R}", options.get(3).toString());
} }
} }

View file

@ -174,13 +174,13 @@ public class ReflectingPoolTest extends CardTestPlayerBase {
ManaOptions options = playerA.getAvailableManaTest(currentGame); ManaOptions options = playerA.getAvailableManaTest(currentGame);
Assert.assertEquals("Player A should be able to create the ", "{G}{G}{G}", options.get(0).toString()); Assert.assertEquals("Player A should be able to create the ", "{G}{G}{G}", options.get(0).toString());
Assert.assertEquals("Player A should be able to create the ", "{G}{G}{W}", options.get(1).toString()); Assert.assertEquals("Player A should be able to create the ", "{W}{G}{G}", options.get(1).toString());
Assert.assertEquals("Player A should be able to create the ", "{G}{G}{W}", options.get(2).toString()); // ManaOption type optimzing seems not optimal yet Assert.assertEquals("Player A should be able to create the ", "{W}{G}{G}", options.get(2).toString()); // ManaOption type optimzing seems not optimal yet
Assert.assertEquals("Player A should be able to create the ", "{G}{W}{W}", options.get(3).toString()); Assert.assertEquals("Player A should be able to create the ", "{W}{W}{G}", options.get(3).toString());
Assert.assertEquals("Player A should be able to create only 3 different mana options", 4, options.size()); Assert.assertEquals("Player A should be able to create only 3 different mana options", 4, options.size());
options = playerB.getAvailableManaTest(currentGame); options = playerB.getAvailableManaTest(currentGame);
Assert.assertEquals("Player B should be able to create the ", "{G}{W}", options.get(0).toString()); Assert.assertEquals("Player B should be able to create the ", "{W}{G}", options.get(0).toString());
Assert.assertEquals("Player B should be able to create the ", "{W}{W}", options.get(1).toString()); Assert.assertEquals("Player B should be able to create the ", "{W}{W}", options.get(1).toString());
Assert.assertEquals("Player B should be able to create only 3 different mana options", 2, options.size()); Assert.assertEquals("Player B should be able to create only 3 different mana options", 2, options.size());

View file

@ -70,8 +70,8 @@ public class SylvokExplorerTest extends CardTestPlayerBase {
execute(); execute();
ManaOptions options = playerA.getAvailableManaTest(currentGame); ManaOptions options = playerA.getAvailableManaTest(currentGame);
Assert.assertEquals("Player should be able to create 1 red and 1 white mana", "{R}{W}", options.get(0).toString()); Assert.assertEquals("Player should be able to create 1 red and 1 white mana", "{W}{R}", options.get(0).toString());
Assert.assertEquals("Player should be able to create 1 blue and 1 white mana", "{U}{W}", options.get(1).toString()); Assert.assertEquals("Player should be able to create 1 blue and 1 white mana", "{W}{U}", options.get(1).toString());
} }
@Test @Test

View file

@ -37,12 +37,11 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
* *
* @author LevelX2 * @author LevelX2
*/ */
public class GrindstoneTest extends CardTestPlayerBase { public class GrindstoneTest extends CardTestPlayerBase {
/** /**
* Tests that Grindstone mills all cards to graveyard while Painter's Servant is in play * Tests that Grindstone mills all cards to graveyard while Painter's
* Leaving one Progenius in play * Servant is in play Leaving one Progenius in play
*/ */
@Test @Test
public void testGrindstoneProgenius() { public void testGrindstoneProgenius() {
@ -72,8 +71,8 @@ public class GrindstoneTest extends CardTestPlayerBase {
} }
/** /**
* Tests that Grindstone mills all cards to graveyard while Painter's Servant is in play * Tests that Grindstone mills all cards to graveyard while Painter's
* Iterating with two Progenius for a draw * Servant is in play Iterating with two Progenius for a draw
*/ */
@Test @Test
public void testGrindstoneProgeniusDraw() { public void testGrindstoneProgeniusDraw() {
@ -103,8 +102,8 @@ public class GrindstoneTest extends CardTestPlayerBase {
} }
/** /**
* Tests that Grindstone mills all cards to graveyard while Painter's Servant is in play * Tests that Grindstone mills all cards to graveyard while Painter's
* Iterating with two Progenius for a draw * Servant is in play Iterating with two Progenius for a draw
*/ */
@Test @Test
public void testGrindstoneUlamog() { public void testGrindstoneUlamog() {
@ -136,5 +135,3 @@ public class GrindstoneTest extends CardTestPlayerBase {
assertPermanentCount(playerA, "Painter's Servant", 1); assertPermanentCount(playerA, "Painter's Servant", 1);
} }
} }

View file

@ -72,9 +72,9 @@ public class ManaOptionsTest extends CardTestPlayerBase {
Assert.assertEquals("mana variations don't fit", 4, manaOptions.size()); Assert.assertEquals("mana variations don't fit", 4, manaOptions.size());
Assert.assertEquals("{G}{G}{G}", getManaOption(0, manaOptions)); Assert.assertEquals("{G}{G}{G}", getManaOption(0, manaOptions));
Assert.assertEquals("{R}{G}{G}{W}", getManaOption(1, manaOptions)); Assert.assertEquals("{W}{R}{G}{G}", getManaOption(1, manaOptions));
Assert.assertEquals("{R}{R}{G}{W}{W}", getManaOption(2, manaOptions)); Assert.assertEquals("{W}{W}{R}{R}{G}", getManaOption(2, manaOptions));
Assert.assertEquals("{R}{R}{R}{W}{W}{W}", getManaOption(3, manaOptions)); Assert.assertEquals("{W}{W}{W}{R}{R}{R}", getManaOption(3, manaOptions));
} }
@ -95,11 +95,11 @@ public class ManaOptionsTest extends CardTestPlayerBase {
Assert.assertEquals("{C}{C}{W}", getManaOption(1, manaOptions)); Assert.assertEquals("{C}{C}{W}", getManaOption(1, manaOptions));
Assert.assertEquals("{C}{C}{U}", getManaOption(2, manaOptions)); Assert.assertEquals("{C}{C}{U}", getManaOption(2, manaOptions));
Assert.assertEquals("{C}{W}{W}", getManaOption(3, manaOptions)); Assert.assertEquals("{C}{W}{W}", getManaOption(3, manaOptions));
Assert.assertEquals("{C}{U}{W}", getManaOption(4, manaOptions)); Assert.assertEquals("{C}{W}{U}", getManaOption(4, manaOptions));
Assert.assertEquals("{C}{U}{U}", getManaOption(5, manaOptions)); Assert.assertEquals("{C}{U}{U}", getManaOption(5, manaOptions));
Assert.assertEquals("{W}{W}{W}", getManaOption(6, manaOptions)); Assert.assertEquals("{W}{W}{W}", getManaOption(6, manaOptions));
Assert.assertEquals("{U}{W}{W}", getManaOption(7, manaOptions)); Assert.assertEquals("{W}{W}{U}", getManaOption(7, manaOptions));
Assert.assertEquals("{U}{U}{W}", getManaOption(8, manaOptions)); Assert.assertEquals("{W}{U}{U}", getManaOption(8, manaOptions));
Assert.assertEquals("{U}{U}{U}", getManaOption(9, manaOptions)); Assert.assertEquals("{U}{U}{U}", getManaOption(9, manaOptions));
} }
@ -151,7 +151,7 @@ public class ManaOptionsTest extends CardTestPlayerBase {
ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame);
Assert.assertEquals("mana variations don't fit", 1, manaOptions.size()); Assert.assertEquals("mana variations don't fit", 1, manaOptions.size());
Assert.assertEquals("{C}{G}{G}{W}{W}", getManaOption(0, manaOptions)); Assert.assertEquals("{C}{W}{W}{G}{G}", getManaOption(0, manaOptions));
} }
// Crystal Quarry // Crystal Quarry
@ -169,8 +169,8 @@ public class ManaOptionsTest extends CardTestPlayerBase {
ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame);
Assert.assertEquals("mana variations don't fit", 2, manaOptions.size()); Assert.assertEquals("mana variations don't fit", 2, manaOptions.size());
Assert.assertEquals("{C}{G}{G}{G}{W}{W}", getManaOption(0, manaOptions)); Assert.assertEquals("{C}{W}{W}{G}{G}{G}", getManaOption(0, manaOptions));
Assert.assertEquals("{R}{G}{U}{W}{B}", getManaOption(1, manaOptions)); Assert.assertEquals("{W}{U}{B}{R}{G}", getManaOption(1, manaOptions));
} }
// Nykthos, Shrine to Nyx // Nykthos, Shrine to Nyx

View file

@ -61,6 +61,8 @@ public interface Abilities<T extends Ability> extends List<T>, Serializable {
*/ */
List<String> getRules(String source); List<String> getRules(String source);
List<String> getRules(String source, boolean capitalize);
/** /**
* Retrieves all activated abilities for the given {@link Zone}. * Retrieves all activated abilities for the given {@link Zone}.
* *

View file

@ -69,6 +69,11 @@ public class AbilitiesImpl<T extends Ability> extends ArrayList<T> implements Ab
@Override @Override
public List<String> getRules(String source) { public List<String> getRules(String source) {
return getRules(source, true);
}
@Override
public List<String> getRules(String source, boolean capitalize) {
List<String> rules = new ArrayList<>(); List<String> rules = new ArrayList<>();
for (T ability : this) { for (T ability : this) {
@ -78,7 +83,9 @@ public class AbilitiesImpl<T extends Ability> extends ArrayList<T> implements Ab
if (!(ability instanceof SpellAbility || ability instanceof PlayLandAbility)) { if (!(ability instanceof SpellAbility || ability instanceof PlayLandAbility)) {
String rule = ability.getRule(); String rule = ability.getRule();
if (rule != null && rule.length() > 3) { if (rule != null && rule.length() > 3) {
if (capitalize) {
rule = Character.toUpperCase(rule.charAt(0)) + rule.substring(1); rule = Character.toUpperCase(rule.charAt(0)) + rule.substring(1);
}
if (ability.getRuleAtTheTop()) { if (ability.getRuleAtTheTop()) {
rules.add(0, rule); rules.add(0, rule);
} else { } else {

View file

@ -31,7 +31,7 @@ public class CompoundAbility extends AbilitiesImpl<Ability> {
} }
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
List<String> rules = super.getRules(null); List<String> rules = super.getRules(null,false);
for (int index = 0; index < rules.size(); index++) { for (int index = 0; index < rules.size(); index++) {
if (index > 0) { if (index > 0) {
if (index < rules.size() - 1) { if (index < rules.size() - 1) {

View file

@ -25,7 +25,6 @@
* authors and should not be interpreted as representing official policies, either expressed * authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com. * or implied, of BetaSteward_at_googlemail.com.
*/ */
package mage.abilities.costs.common; package mage.abilities.costs.common;
import mage.constants.Outcome; import mage.constants.Outcome;
@ -38,6 +37,7 @@ import mage.target.common.TargetControlledPermanent;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import mage.abilities.costs.Cost; import mage.abilities.costs.Cost;
import mage.util.CardUtil;
/** /**
* *
@ -49,7 +49,7 @@ public class UntapTargetCost extends CostImpl {
public UntapTargetCost(TargetControlledPermanent target) { public UntapTargetCost(TargetControlledPermanent target) {
this.target = target; this.target = target;
this.text = "Untap " + target.getMaxNumberOfTargets() + ' ' + target.getTargetName(); this.text = "Untap " + CardUtil.numberToText(target.getMaxNumberOfTargets(), "") + ' ' + target.getTargetName();
} }
public UntapTargetCost(final UntapTargetCost cost) { public UntapTargetCost(final UntapTargetCost cost) {
@ -62,8 +62,9 @@ public class UntapTargetCost extends CostImpl {
if (target.choose(Outcome.Untap, controllerId, sourceId, game)) { if (target.choose(Outcome.Untap, controllerId, sourceId, game)) {
for (UUID targetId : (List<UUID>) target.getTargets()) { for (UUID targetId : (List<UUID>) target.getTargets()) {
Permanent permanent = game.getPermanent(targetId); Permanent permanent = game.getPermanent(targetId);
if (permanent == null) if (permanent == null) {
return false; return false;
}
paid |= permanent.untap(game); paid |= permanent.untap(game);
} }
} }
@ -80,5 +81,4 @@ public class UntapTargetCost extends CostImpl {
return new UntapTargetCost(this); return new UntapTargetCost(this);
} }
} }

View file

@ -46,7 +46,7 @@ public class GetEmblemEffect extends OneShotEffect {
public GetEmblemEffect(Emblem emblem) { public GetEmblemEffect(Emblem emblem) {
super(Outcome.Benefit); super(Outcome.Benefit);
this.emblem = emblem; this.emblem = emblem;
this.staticText = "You get an emblem with \"" + +'"'; this.staticText = getText();
} }
public GetEmblemEffect(final GetEmblemEffect effect) { public GetEmblemEffect(final GetEmblemEffect effect) {
@ -74,7 +74,9 @@ public class GetEmblemEffect extends OneShotEffect {
sb.append("You get an emblem with \""); sb.append("You get an emblem with \"");
List<String> rules = emblem.getAbilities().getRules(null); List<String> rules = emblem.getAbilities().getRules(null);
if (rules.size() == 1) { if (rules.size() == 1) {
sb.append(rules.get(0)); for (String s : rules) {
sb.append(s);
}
sb.append('"'); sb.append('"');
} else if (rules.size() == 2) { } else if (rules.size() == 2) {
for (String s : rules) { for (String s : rules) {
@ -83,7 +85,6 @@ public class GetEmblemEffect extends OneShotEffect {
} }
sb.append('"'); sb.append('"');
} }
sb.append('.');
return sb.toString(); return sb.toString();
} }
} }

View file

@ -264,9 +264,11 @@ public class LookLibraryAndPickControllerEffect extends LookLibraryControllerEff
sb.append(". You may reveal "); sb.append(". You may reveal ");
sb.append(filter.getMessage()).append(" from among them and put it into your "); sb.append(filter.getMessage()).append(" from among them and put it into your ");
} else if (targetPickedCards == Zone.BATTLEFIELD) { } else if (targetPickedCards == Zone.BATTLEFIELD) {
sb.append(". You "); sb.append(". ");
if (optional) { if (optional) {
sb.append("may "); sb.append("You may p");
} else {
sb.append('P');
} }
sb.append("put ").append(filter.getMessage()).append(" from among them onto the "); sb.append("put ").append(filter.getMessage()).append(" from among them onto the ");
} else { } else {

View file

@ -25,7 +25,6 @@
* authors and should not be interpreted as representing official policies, either expressed * authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com. * or implied, of BetaSteward_at_googlemail.com.
*/ */
package mage.abilities.effects.common.continuous; package mage.abilities.effects.common.continuous;
import mage.constants.Duration; import mage.constants.Duration;
@ -116,21 +115,24 @@ public class BoostEquippedEffect extends ContinuousEffectImpl {
private void setText() { private void setText() {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append("Equipped creature gets "); sb.append("equipped creature gets ");
String p = power.toString(); String p = power.toString();
if (!p.startsWith("-")) if (!p.startsWith("-")) {
sb.append('+'); sb.append('+');
}
sb.append(p).append('/'); sb.append(p).append('/');
String t = toughness.toString(); String t = toughness.toString();
if (!t.startsWith("-")) { if (!t.startsWith("-")) {
if (p.startsWith("-")) if (p.startsWith("-")) {
sb.append('-'); sb.append('-');
else } else {
sb.append('+'); sb.append('+');
} }
}
sb.append(t); sb.append(t);
if (duration != Duration.WhileOnBattlefield) if (duration != Duration.WhileOnBattlefield) {
sb.append(' ').append(duration.toString()); sb.append(' ').append(duration.toString());
}
String message = power.getMessage(); String message = power.getMessage();
if (!message.isEmpty()) { if (!message.isEmpty()) {
sb.append(" for each "); sb.append(" for each ");

View file

@ -89,7 +89,7 @@ public class ProtectionAbility extends StaticAbility {
@Override @Override
public String getRule() { public String getRule() {
return "protection from " + filter.getMessage() + (removeAuras ? "" : ". This effect doesn't remove auras."); return "Protection from " + filter.getMessage() + (removeAuras ? "" : ". This effect doesn't remove auras.");
} }
public boolean canTarget(MageObject source, Game game) { public boolean canTarget(MageObject source, Game game) {

View file

@ -25,7 +25,6 @@
* authors and should not be interpreted as representing official policies, either expressed * authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com. * or implied, of BetaSteward_at_googlemail.com.
*/ */
package mage.abilities.keyword; package mage.abilities.keyword;
import mage.constants.Zone; import mage.constants.Zone;
@ -37,11 +36,16 @@ import java.io.ObjectStreamException;
/** /**
* 702.77. Wither * 702.77. Wither
* *
* 702.77a. Wither is a static ability. Damage dealt to a creature by a source with wither isn't marked on that creature. Rather, it causes that many -1/-1 counters to be put on that creature. See rule 119.3. * 702.77a. Wither is a static ability. Damage dealt to a creature by a source
* with wither isn't marked on that creature. Rather, it causes that many -1/-1
* counters to be put on that creature. See rule 119.3.
* *
* 702.77b. If a permanent leaves the battlefield before an effect causes it to deal damage, its last known information is used to determine whether it had wither. * 702.77b. If a permanent leaves the battlefield before an effect causes it to
* deal damage, its last known information is used to determine whether it had
* wither.
* *
* 702.77c. The wither rules function no matter what zone an object with wither deals damage from. * 702.77c. The wither rules function no matter what zone an object with wither
* deals damage from.
* *
* 702.77d. Multiple instances of wither on the same object are redundant. * 702.77d. Multiple instances of wither on the same object are redundant.
* *
@ -65,7 +69,7 @@ public class WitherAbility extends StaticAbility implements MageSingleton {
@Override @Override
public String getRule() { public String getRule() {
return "Wither <i>(This deals damage to creatures in the form of -1/-1 counters.)</i>"; return "wither <i>(This deals damage to creatures in the form of -1/-1 counters.)</i>";
} }
@Override @Override

View file

@ -497,7 +497,7 @@ public class ManaTest {
String ret = mana.toString(); String ret = mana.toString();
// then // then
assertEquals("{6}{R}{G}{G}{U}{U}{U}{B}{B}{B}{Any}{Any}", ret); assertEquals("{6}{U}{U}{U}{B}{B}{B}{R}{G}{G}{Any}{Any}", ret);
} }
@Test @Test