[MH2] various text fixes

This commit is contained in:
Evan Kranzler 2021-06-22 09:20:05 -04:00
parent 3158621a87
commit daf77b2ee8
36 changed files with 121 additions and 87 deletions

View file

@ -66,7 +66,7 @@ class AeveProgenitorOozeNonLegendaryEffect extends ContinuousEffectImpl {
public AeveProgenitorOozeNonLegendaryEffect() {
super(Duration.WhileOnBattlefield, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Benefit);
this.staticText = "{this} isn't legendary as long as it's a token";
this.staticText = "{this} isn't legendary if it's a token";
}
private AeveProgenitorOozeNonLegendaryEffect(final AeveProgenitorOozeNonLegendaryEffect effect) {

View file

@ -52,7 +52,7 @@ public final class ArcusAcolyte extends CardImpl {
this.addAbility(new SimpleStaticAbility(new GainAbilityAllEffect(
new OutlastAbility(new ManaCostsImpl<>("{G/W}")),
Duration.WhileOnBattlefield, filter, true
)));
).setText("each other creature you control without a +1/+1 counter on it has outlast {G/W}")));
}
private ArcusAcolyte(final ArcusAcolyte card) {

View file

@ -55,12 +55,12 @@ public final class Asmoranomardicadaistinaculdacar extends CardImpl {
// As long as you've discarded a card this turn, you may pay {B/R} to cast this spell.
this.addAbility(new AlternativeCostSourceAbility(
new ManaCostsImpl<>("{B/R}"), ControllerDiscardedThisTurnCondition.instance,
"as long as you've discarded a card this turn, you may pay {B/R} to cast this spell"
"as long as you've discarded a card this turn, you may pay {B/R} to cast this spell."
).addHint(ControllerDiscardedHint.instance), new DiscardedCardWatcher());
// When Asmoranomardicadaistinaculdacar enters the battlefield, you may search your library for a card named The Underworld Cookbook, reveal it, put it into your hand, then shuffle.
this.addAbility(new EntersBattlefieldTriggeredAbility(
new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true)
new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true), true
));
// Sacrifice two Foods: Target creature deals 6 damage to itself.

View file

@ -32,7 +32,7 @@ public final class BarbedSpike extends CardImpl {
this.addAbility(new SimpleStaticAbility(new BoostEquippedEffect(1, 0)));
// Equip {2}
this.addAbility(new EquipAbility(1));
this.addAbility(new EquipAbility(2));
}
private BarbedSpike(final BarbedSpike card) {

View file

@ -34,7 +34,7 @@ public final class ChanceEncounter extends CardImpl {
// At the beginning of your upkeep, if Chance Encounter has ten or more luck counters on it, you win the game.
TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new WinGameSourceControllerEffect(), TargetController.YOU, false);
this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, new SourceHasCounterCondition(CounterType.LUCK, 10, Integer.MAX_VALUE),
"At the beginning of your upkeep, if {this} has ten or more luck counters on it, you win the game"));
"At the beginning of your upkeep, if {this} has ten or more luck counters on it, you win the game."));
}
private ChanceEncounter(final ChanceEncounter card) {

View file

@ -8,10 +8,11 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.target.common.TargetCreaturePermanent;
import static mage.filter.StaticFilters.FILTER_PERMANENT_CREATURES;
import java.util.UUID;
import static mage.filter.StaticFilters.FILTER_PERMANENT_CREATURES;
/**
* @author jmharmon
*/
@ -23,10 +24,15 @@ public final class Damn extends CardImpl {
// Destroy target creature. A creature destroyed this way cant be regenerated.
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
this.getSpellAbility().addEffect(new DestroyTargetEffect(true));
this.getSpellAbility().addEffect(new DestroyTargetEffect(true)
.setText("destroy target creature. A creature destroyed this way can't be regenerated"));
// Overload {2}{W}{W} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of target with each.)
this.addAbility(new OverloadAbility(this, new DestroyAllEffect(FILTER_PERMANENT_CREATURES, true), new ManaCostsImpl("{2}{W}{W")));
this.addAbility(new OverloadAbility(
this,
new DestroyAllEffect(FILTER_PERMANENT_CREATURES, true),
new ManaCostsImpl<>("{2}{W}{W")
));
}
private Damn(final Damn card) {

View file

@ -2,7 +2,7 @@ package mage.cards.d;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AsEntersBattlefieldAbility;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapTargetCost;
import mage.abilities.effects.OneShotEffect;
@ -44,7 +44,10 @@ public final class Dermotaxi extends CardImpl {
this.toughness = new MageInt(0);
// Imprint As Dermotaxi enters the battlefield, exile a creature card from a graveyard.
this.addAbility(new AsEntersBattlefieldAbility(new DermotaxiImprintEffect()).setAbilityWord(AbilityWord.IMPRINT));
this.addAbility(new EntersBattlefieldAbility(
new DermotaxiImprintEffect(), null, "<i>Imprint</i> &mdash; As {this} " +
"enters the battlefield, exile a creature card from a graveyard.", ""
));
// Tap two untapped creatures you control: Until end of turn, Dermotaxi becomes a copy of the imprinted card, except it's a Vehicle artifact in addition to its other types.
this.addAbility(new SimpleActivatedAbility(
@ -105,7 +108,7 @@ class DermotaxiCopyEffect extends OneShotEffect {
DermotaxiCopyEffect() {
super(Outcome.Benefit);
staticText = "until end of turn, {this} becomes a copy of the imprinted card, " +
staticText = "until end of turn, {this} becomes a copy of the exiled card, " +
"except it's a Vehicle artifact in addition to its other types";
}

View file

@ -5,6 +5,7 @@ import mage.Mana;
import mage.abilities.costs.Cost;
import mage.abilities.costs.common.DiscardHandCost;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.mana.AddManaOfAnyColorEffect;
import mage.abilities.effects.mana.BasicManaEffect;
import mage.abilities.mana.ActivatedManaAbilityImpl;
@ -47,7 +48,8 @@ public final class DiamondLion extends CardImpl {
class DiamondLionAbility extends ActivatedManaAbilityImpl {
public DiamondLionAbility() {
super(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(3), new DiscardHandCost());
super(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(3), new TapSourceCost());
this.addCost(new DiscardHandCost());
this.addCost(new SacrificeSourceCost());
this.netMana.add(new Mana(0, 0, 0, 0, 0, 0, 3, 0));
}

View file

@ -60,12 +60,12 @@ enum DihadasPloyValue implements DynamicValue {
}
@Override
public String getMessage() {
public String toString() {
return "1";
}
@Override
public String toString() {
public String getMessage() {
return "cards you've discarded this turn";
}
}

View file

@ -22,7 +22,7 @@ import java.util.UUID;
*/
public final class DiscipleOfTheSun extends CardImpl {
private static final FilterCard filter = new FilterPermanentCard("permanent card with mana value 3 or less");
private static final FilterCard filter = new FilterPermanentCard("permanent card with mana value 3 or less from your graveyard");
static {
filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 4));

View file

@ -15,7 +15,7 @@ import mage.filter.FilterSpell;
*/
public final class EnchantresssPresence extends CardImpl {
private static final FilterSpell filter = new FilterSpell("an Enchantment spell");
private static final FilterSpell filter = new FilterSpell("an enchantment spell");
static {
filter.add(CardType.ENCHANTMENT.getPredicate());

View file

@ -29,7 +29,7 @@ public final class FiligreeAttendant extends CardImpl {
// Filigree Attendant's power is equal to the number of artifacts you control.
this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerSourceEffect(
ArtifactYouControlCount.instance, Duration.EndOfGame, SubLayer.CharacteristicDefining_7a
)));
).setText("{this}'s power is equal to the number of artifacts you control")));
}
private FiligreeAttendant(final FiligreeAttendant card) {

View file

@ -40,7 +40,7 @@ public final class FoulWatcher extends CardImpl {
// Delirium Foul Watcher gets +1/+0 as long as there are four more card types among cards in your graveyard.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new BoostSourceEffect(1, 0, Duration.WhileOnBattlefield), DeliriumCondition.instance,
"{this} gets +1/+0 as long as there are four more card types among cards in your graveyard"
"{this} gets +1/+0 as long as there are four or more card types among cards in your graveyard"
)).setAbilityWord(AbilityWord.DELIRIUM).addHint(CardTypesInGraveyardHint.YOU));
}

View file

@ -1,7 +1,5 @@
package mage.cards.f;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.condition.Condition;
import mage.abilities.costs.Cost;
@ -12,13 +10,15 @@ import mage.abilities.effects.common.GainLifeEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.common.TargetAnyTarget;
import mage.target.common.TargetControlledPermanent;
import java.util.UUID;
/**
*
* @author weirddan455
*/
public final class FoundryHelix extends CardImpl {
@ -27,7 +27,7 @@ public final class FoundryHelix extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{R}{W}");
// As an additional cost to cast this spell, sacrifice a permanent.
this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledPermanent()));
this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_PERMANENT_SHORT_TEXT)));
// Foundry Helix deals 4 damage to any target. If the sacrificed permanent was an artifact, you gain 4 life.
this.getSpellAbility().addEffect(new DamageTargetEffect(4));

View file

@ -30,7 +30,7 @@ public final class GaeasWill extends CardImpl {
this.color.setGreen(true);
// Suspend 4{G}
this.addAbility(new SuspendAbility(4, new ManaCostsImpl("G"), this));
this.addAbility(new SuspendAbility(4, new ManaCostsImpl<>("G"), this));
// Until end of turn, you may play land cards and cast spells from your graveyard.
this.getSpellAbility().addEffect(new GaeasWillGraveyardEffect());
@ -57,7 +57,7 @@ class GaeasWillGraveyardEffect extends ContinuousEffectImpl {
public GaeasWillGraveyardEffect(Duration duration) {
super(duration, Layer.PlayerEffects, SubLayer.NA, Outcome.Benefit);
this.staticText = "Until end of turn, you may play land cards and cast spells from your graveyard";
this.staticText = "Until end of turn, you may play lands and cast spells from your graveyard";
}
private GaeasWillGraveyardEffect(final GaeasWillGraveyardEffect effect) {
@ -84,7 +84,7 @@ class GaeassWillReplacementEffect extends ReplacementEffectImpl {
public GaeassWillReplacementEffect() {
super(Duration.EndOfTurn, Outcome.Detriment);
this.staticText = "If a card would be put into your graveyard from anywhere this turn, exile that card instead";
this.staticText = "<br>If a card would be put into your graveyard from anywhere this turn, exile that card instead";
}
public GaeassWillReplacementEffect(final GaeassWillReplacementEffect effect) {

View file

@ -22,7 +22,8 @@ public final class Kaleidoscorch extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{R}");
// Converge Kaleidoscorch deals X damage to any target, where X is the number of colors of mana spent to cast this spell.
this.getSpellAbility().addEffect(new DamageTargetEffect(ColorsOfManaSpentToCastCount.getInstance()));
this.getSpellAbility().addEffect(new DamageTargetEffect(ColorsOfManaSpentToCastCount.getInstance())
.setText("{this} deals X damage to any target, where X is the number of colors of mana spent to cast this spell"));
this.getSpellAbility().addTarget(new TargetAnyTarget());
this.getSpellAbility().setAbilityWord(AbilityWord.CONVERGE);

View file

@ -7,7 +7,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.StaticFilters;
import mage.game.permanent.token.FoodToken;
import mage.target.common.TargetCardInGraveyard;
import mage.target.common.TargetCardInYourGraveyard;
import java.util.UUID;
@ -22,7 +22,7 @@ public final class LateToDinner extends CardImpl {
// Return target creature card from your graveyard to the battlefield. Create a Food token.
this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect());
this.getSpellAbility().addEffect(new CreateTokenEffect(new FoodToken()));
this.getSpellAbility().addTarget(new TargetCardInGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
}
private LateToDinner(final LateToDinner card) {

View file

@ -35,7 +35,7 @@ public final class Monoskelion extends CardImpl {
));
// {1}, Remove a +1/+1 counter from Monoskelion: Monoskelion deals 1 damage to any target.
Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(1), new GenericManaCost(1));
Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(1, "it"), new GenericManaCost(1));
ability.addCost(new RemoveCountersSourceCost(CounterType.P1P1.createInstance()));
ability.addTarget(new TargetAnyTarget());
this.addAbility(ability);

View file

@ -38,7 +38,7 @@ public final class Necrogoyf extends CardImpl {
// At the beginning of each player's upkeep, that player discards a card.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(
Zone.BATTLEFIELD, new DiscardTargetEffect(1),
TargetController.EACH_PLAYER, false, true
TargetController.ACTIVE, false, true
));
// Madness {1}{B}{B}

View file

@ -28,7 +28,7 @@ public final class PhantasmalDreadmaw extends CardImpl {
this.addAbility(TrampleAbility.getInstance());
// When Phantasmal Dreadmaw becomes the target of a spell or ability, sacrifice it.
this.addAbility(new BecomesTargetTriggeredAbility(new SacrificeSourceEffect()));
this.addAbility(new BecomesTargetTriggeredAbility(new SacrificeSourceEffect().setText("sacrifice it")));
}
private PhantasmalDreadmaw(final PhantasmalDreadmaw card) {

View file

@ -12,6 +12,7 @@ import mage.abilities.effects.common.DrawDiscardControllerEffect;
import mage.abilities.hint.common.CardTypesInGraveyardHint;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.AbilityWord;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
@ -44,7 +45,7 @@ public final class RavingVisionary extends CardImpl {
new ManaCostsImpl<>("{2}{U}"), DeliriumCondition.instance
);
ability.addCost(new TapSourceCost());
this.addAbility(ability.addHint(CardTypesInGraveyardHint.YOU));
this.addAbility(ability.addHint(CardTypesInGraveyardHint.YOU).setAbilityWord(AbilityWord.DELIRIUM));
}
private RavingVisionary(final RavingVisionary card) {

View file

@ -45,7 +45,7 @@ public final class RiseAndShine extends CardImpl {
).setText("Target noncreature artifact you control becomes"));
this.getSpellAbility().addEffect(new SetPowerToughnessTargetEffect(
0, 0, Duration.EndOfGame
).setText("a 0/0 artifact creature"));
).setText(" a 0/0 artifact creature"));
this.getSpellAbility().addEffect(new AddCountersTargetEffect(
CounterType.P1P1.createInstance(4)
).setText("Put four +1/+1 counters on each artifact that became a creature this way"));

View file

@ -36,6 +36,7 @@ public final class ScionOfDraco extends CardImpl {
// Domain This spell costs {2} less to cast for each basic land type among lands you control.
this.addAbility(new SimpleStaticAbility(Zone.ALL,
new SpellCostReductionForEachSourceEffect(2, xValue)
.setText("this spell costs {2} less to cast for each basic land type among lands you control")
).addHint(DomainHint.instance).setAbilityWord(AbilityWord.DOMAIN));
// Flying

View file

@ -1,7 +1,6 @@
package mage.cards.s;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@ -11,18 +10,18 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.common.FilterControlledLandPermanent;
import mage.filter.StaticFilters;
import mage.target.TargetPermanent;
/**
*
* @author LoneFox
import java.util.UUID;
/**
* @author LoneFox
*/
public final class SeaDrake extends CardImpl {
public SeaDrake(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{U}");
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}");
this.subtype.add(SubType.DRAKE);
this.power = new MageInt(4);
this.toughness = new MageInt(3);
@ -31,7 +30,7 @@ public final class SeaDrake extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// When Sea Drake enters the battlefield, return two target lands you control to their owner's hand.
Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect(), false);
ability.addTarget(new TargetPermanent(2, 2, new FilterControlledLandPermanent(), false));
ability.addTarget(new TargetPermanent(2, StaticFilters.FILTER_CONTROLLED_PERMANENT_LANDS));
this.addAbility(ability);
}

View file

@ -10,6 +10,7 @@ import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect;
import mage.abilities.effects.common.TapSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@ -39,9 +40,11 @@ public final class SteelDromedary extends CardImpl {
this.toughness = new MageInt(2);
// Steel Dromedary enters the battlefield tapped with two +1/+1 counters on it.
this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(
CounterType.P1P1.createInstance(2)
), "with two +1/+1 counters on it"));
Ability ability = new EntersBattlefieldAbility(
new TapSourceEffect(), "tapped with two +1/+1 counters on it"
);
ability.addEffect(new AddCountersSourceEffect(CounterType.P1P1.createInstance(2)));
this.addAbility(ability);
// Steel Dromedary doesn't untap during your untap step if it has a +1/+1 counter on it.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousRuleModifyingEffect(
@ -49,7 +52,7 @@ public final class SteelDromedary extends CardImpl {
).setText("{this} doesn't untap during your untap step if it has a +1/+1 counter on it")));
// At the beginning of combat on your turn, you may move a +1/+1 counter from Steel Dromedary onto target creature.
Ability ability = new BeginningOfCombatTriggeredAbility(
ability = new BeginningOfCombatTriggeredAbility(
new SteelDromedaryEffect(), TargetController.YOU, true
);
ability.addTarget(new TargetCreaturePermanent());
@ -70,7 +73,7 @@ class SteelDromedaryEffect extends OneShotEffect {
SteelDromedaryEffect() {
super(Outcome.Benefit);
staticText = "move a +1/+1 counter from {this} onto target creature";
staticText = "you may move a +1/+1 counter from {this} onto target creature";
}
private SteelDromedaryEffect(final SteelDromedaryEffect effect) {

View file

@ -15,10 +15,7 @@ import mage.abilities.effects.common.continuous.SetPowerToughnessSourceEffect;
import mage.abilities.hint.common.DomainHint;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.constants.*;
import mage.target.common.TargetCardInGraveyard;
import java.util.UUID;
@ -40,7 +37,7 @@ public final class TerritorialKavu extends CardImpl {
// Domain Territorial Kavu's power and toughness are each equal to the number of basic land types among lands you control.
this.addAbility(new SimpleStaticAbility(
Zone.ALL, new SetPowerToughnessSourceEffect(xValue, Duration.EndOfGame)
).addHint(DomainHint.instance));
).addHint(DomainHint.instance).setAbilityWord(AbilityWord.DOMAIN));
// Whenever Territorial Kavu attacks, choose one
// Discard a card. If you do, draw a card.

View file

@ -1,11 +1,10 @@
package mage.cards.t;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AsEntersBattlefieldAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
@ -19,13 +18,18 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.watchers.common.CastSpellLastTurnWatcher;
import java.util.UUID;
/**
* @author Fubs
*/
public final class ThrastaTempestsRoar extends CardImpl {
private static final ValueHint hint = new ValueHint("Spells cast this turn", ThrastaDynamicValue.instance);
public ThrastaTempestsRoar(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{10}{G}{G}");
addSuperType(SuperType.LEGENDARY);
@ -33,33 +37,36 @@ public final class ThrastaTempestsRoar extends CardImpl {
this.power = new MageInt(7);
this.toughness = new MageInt(7);
//This spell costs 3 less to cast for each other spell cast this turn
ThrastaDynamicValue spellCastCount = new ThrastaDynamicValue();
//spellCastCount does not need -1 because cast count increases only after current spell cast/reduction.
this.addAbility(new SimpleStaticAbility(Zone.ALL, new SpellCostReductionForEachSourceEffect(3, spellCastCount))
.addHint(new ValueHint("spell cast", spellCastCount))
);
// This spell costs 3 less to cast for each other spell cast this turn
this.addAbility(new SimpleStaticAbility(
Zone.ALL, new SpellCostReductionForEachSourceEffect(3, ThrastaDynamicValue.instance)
).addHint(hint));
//Trample, Haste, and Trample over planeswalkers
// Trample, Haste, and Trample over planeswalkers
this.addAbility(TrampleAbility.getInstance());
this.addAbility(HasteAbility.getInstance());
this.addAbility(TrampleOverPlaneswalkersAbility.getInstance());
//Thrasta has hexproof as long as it entered the battlefield this turn.
this.addAbility(new AsEntersBattlefieldAbility(new GainAbilitySourceEffect(HexproofAbility.getInstance(), Duration.EndOfTurn)));
// Thrasta has hexproof as long as it entered the battlefield this turn.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new GainAbilitySourceEffect(HexproofAbility.getInstance(), Duration.WhileOnBattlefield),
ThrastaCondition.instance, "{this} has hexproof as long as it entered the battlefield this turn"
)));
}
private ThrastaTempestsRoar(final mage.cards.t.ThrastaTempestsRoar card) {
private ThrastaTempestsRoar(final ThrastaTempestsRoar card) {
super(card);
}
@Override
public ThrastaTempestsRoar copy() {
return new mage.cards.t.ThrastaTempestsRoar(this);
return new ThrastaTempestsRoar(this);
}
}
class ThrastaDynamicValue implements DynamicValue {
enum ThrastaDynamicValue implements DynamicValue {
instance;
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
CastSpellLastTurnWatcher watcher = game.getState().getWatcher(CastSpellLastTurnWatcher.class);
@ -71,7 +78,7 @@ class ThrastaDynamicValue implements DynamicValue {
@Override
public ThrastaDynamicValue copy() {
return new ThrastaDynamicValue();
return this;
}
@Override
@ -81,7 +88,16 @@ class ThrastaDynamicValue implements DynamicValue {
@Override
public String getMessage() {
return "spells cast this turn";
return "other spell cast this turn";
}
}
enum ThrastaCondition implements Condition {
instance;
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = source.getSourcePermanentIfItStillExists(game);
return permanent != null && permanent.getTurnsOnBattlefield() == 0;
}
}

View file

@ -40,7 +40,7 @@ public final class TizerusCharger extends CardImpl {
// Tizerus Charger escapes with your choice of a +1/+1 counter or a flying counter on it.
this.addAbility(new EntersBattlefieldAbility(
new TizerusChargerEffect(), null, "{this} escapes " +
"with your choice of a +1/+1 counter or a flying counter on it", ""
"with your choice of a +1/+1 counter or a flying counter on it.", ""
));
}

View file

@ -17,7 +17,7 @@ public final class Upheaval extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{U}{U}");
// Return all permanents to their owners' hands.
this.getSpellAbility().addEffect(new ReturnToHandFromBattlefieldAllEffect(StaticFilters.FILTER_PERMANENT));
this.getSpellAbility().addEffect(new ReturnToHandFromBattlefieldAllEffect(StaticFilters.FILTER_PERMANENTS));
}
private Upheaval(final Upheaval card) {

View file

@ -36,7 +36,7 @@ public final class YoungNecromancer extends CardImpl {
ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
this.addAbility(new EntersBattlefieldTriggeredAbility(
new DoWhenCostPaid(ability, new ExileFromGraveCost(
new TargetCardInYourGraveyard(2, StaticFilters.FILTER_CARD)
new TargetCardInYourGraveyard(2, StaticFilters.FILTER_CARD_CARDS)
), "Exile two cards from your graveyard?")
));
}

View file

@ -56,7 +56,7 @@ public class VerifyCardDataTest {
private static final Logger logger = Logger.getLogger(VerifyCardDataTest.class);
private static final String FULL_ABILITIES_CHECK_SET_CODE = "MH1"; // check all abilities and output cards with wrong abilities texts;
private static final String FULL_ABILITIES_CHECK_SET_CODE = "MH2"; // check all abilities and output cards with wrong abilities texts;
private static final boolean AUTO_FIX_SAMPLE_DECKS = false; // debug only: auto-fix sample decks by test_checkSampleDecks test run
private static final boolean ONLY_TEXT = false; // use when checking text locally, suppresses unnecessary checks and output messages

View file

@ -2,16 +2,16 @@
package mage.abilities.effects.common;
import mage.constants.Outcome;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.OneShotEffect;
import mage.constants.Outcome;
import mage.game.Game;
import mage.players.Player;
/**
*
* @author BetaSteward_at_googlemail.com
*/
public class GainLifeEffect extends OneShotEffect {
@ -25,9 +25,8 @@ public class GainLifeEffect extends OneShotEffect {
public GainLifeEffect(DynamicValue life) {
super(Outcome.GainLife);
this.life = life;
setText();
}
public GainLifeEffect(DynamicValue life, String rule) {
super(Outcome.GainLife);
this.life = life;
@ -53,24 +52,24 @@ public class GainLifeEffect extends OneShotEffect {
return true;
}
private void setText() {
if (!staticText.isEmpty()) {
return;
@Override
public String getText(Mode mode) {
if (staticText != null && !staticText.isEmpty()) {
return staticText;
}
StringBuilder sb = new StringBuilder();
String message = life.getMessage();
sb.append("you gain ");
if (message.startsWith("that")) {
sb.append(message).append(' ');
} else if (message.isEmpty() || !message.equals("1")) {
} else if (message.isEmpty() || !life.toString().equals("1")) {
sb.append(life).append(' ');
}
sb.append("life");
if (!message.isEmpty() && !message.startsWith("that")) {
sb.append(message.equals("1") ? " equal to the number of " : " for each ");
sb.append(life.toString().equals("1") ? " equal to the number of " : " for each ");
sb.append(message);
}
staticText = sb.toString();
return sb.toString();
}
}

View file

@ -100,7 +100,7 @@ public class ReturnToHandTargetEffect extends OneShotEffect {
sb.append("target ");
}
sb.append(target.getTargetName());
if (target.getMaxNumberOfTargets() > 1 && !target.getTargetName().endsWith("s")) {
if (target.getMaxNumberOfTargets() > 1 && !target.getTargetName().endsWith("s") && !target.getTargetName().endsWith("control")) {
sb.append('s');
}
if (target.getMaxNumberOfTargets() > 1) {

View file

@ -155,7 +155,7 @@ public class DiscardCardYouChooseTargetEffect extends OneShotEffect {
}
private String setText() {
StringBuilder sb = new StringBuilder("Target ");
StringBuilder sb = new StringBuilder("target ");
switch (targetController) {
case OPPONENT:
sb.append("opponent");

View file

@ -316,6 +316,12 @@ public final class StaticFilters {
FILTER_CONTROLLED_A_PERMANENT.setLockedFilter(true);
}
public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_SHORT_TEXT = new FilterControlledPermanent("permanent");
static {
FILTER_CONTROLLED_PERMANENT_SHORT_TEXT.setLockedFilter(true);
}
public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_ARTIFACT = new FilterControlledArtifactPermanent();
static {

View file

@ -9,7 +9,7 @@ import mage.filter.common.FilterCreatureOrPlaneswalkerPermanent;
public class TargetCreatureOrPlaneswalkerAmount extends TargetPermanentAmount {
private static final FilterCreatureOrPlaneswalkerPermanent defaultFilter
= new FilterCreatureOrPlaneswalkerPermanent("target creatures or planeswalkers");
= new FilterCreatureOrPlaneswalkerPermanent("target creatures and/or planeswalkers");
public TargetCreatureOrPlaneswalkerAmount(int amount) {
super(amount, defaultFilter);