[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() { public AeveProgenitorOozeNonLegendaryEffect() {
super(Duration.WhileOnBattlefield, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Benefit); 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) { private AeveProgenitorOozeNonLegendaryEffect(final AeveProgenitorOozeNonLegendaryEffect effect) {

View file

@ -52,7 +52,7 @@ public final class ArcusAcolyte extends CardImpl {
this.addAbility(new SimpleStaticAbility(new GainAbilityAllEffect( this.addAbility(new SimpleStaticAbility(new GainAbilityAllEffect(
new OutlastAbility(new ManaCostsImpl<>("{G/W}")), new OutlastAbility(new ManaCostsImpl<>("{G/W}")),
Duration.WhileOnBattlefield, filter, true 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) { 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. // As long as you've discarded a card this turn, you may pay {B/R} to cast this spell.
this.addAbility(new AlternativeCostSourceAbility( this.addAbility(new AlternativeCostSourceAbility(
new ManaCostsImpl<>("{B/R}"), ControllerDiscardedThisTurnCondition.instance, 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()); ).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. // 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( 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. // 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))); this.addAbility(new SimpleStaticAbility(new BoostEquippedEffect(1, 0)));
// Equip {2} // Equip {2}
this.addAbility(new EquipAbility(1)); this.addAbility(new EquipAbility(2));
} }
private BarbedSpike(final BarbedSpike card) { 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. // 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); TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new WinGameSourceControllerEffect(), TargetController.YOU, false);
this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, new SourceHasCounterCondition(CounterType.LUCK, 10, Integer.MAX_VALUE), 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) { private ChanceEncounter(final ChanceEncounter card) {

View file

@ -8,10 +8,11 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import static mage.filter.StaticFilters.FILTER_PERMANENT_CREATURES;
import java.util.UUID; import java.util.UUID;
import static mage.filter.StaticFilters.FILTER_PERMANENT_CREATURES;
/** /**
* @author jmharmon * @author jmharmon
*/ */
@ -23,10 +24,15 @@ public final class Damn extends CardImpl {
// Destroy target creature. A creature destroyed this way cant be regenerated. // Destroy target creature. A creature destroyed this way cant be regenerated.
this.getSpellAbility().addTarget(new TargetCreaturePermanent()); 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.) // 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) { private Damn(final Damn card) {

View file

@ -2,7 +2,7 @@ package mage.cards.d;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapTargetCost; import mage.abilities.costs.common.TapTargetCost;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
@ -44,7 +44,10 @@ public final class Dermotaxi extends CardImpl {
this.toughness = new MageInt(0); this.toughness = new MageInt(0);
// Imprint As Dermotaxi enters the battlefield, exile a creature card from a graveyard. // 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. // 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( this.addAbility(new SimpleActivatedAbility(
@ -105,7 +108,7 @@ class DermotaxiCopyEffect extends OneShotEffect {
DermotaxiCopyEffect() { DermotaxiCopyEffect() {
super(Outcome.Benefit); 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"; "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.Cost;
import mage.abilities.costs.common.DiscardHandCost; import mage.abilities.costs.common.DiscardHandCost;
import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.mana.AddManaOfAnyColorEffect;
import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.effects.mana.BasicManaEffect;
import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.abilities.mana.ActivatedManaAbilityImpl;
@ -47,7 +48,8 @@ public final class DiamondLion extends CardImpl {
class DiamondLionAbility extends ActivatedManaAbilityImpl { class DiamondLionAbility extends ActivatedManaAbilityImpl {
public DiamondLionAbility() { 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.addCost(new SacrificeSourceCost());
this.netMana.add(new Mana(0, 0, 0, 0, 0, 0, 3, 0)); this.netMana.add(new Mana(0, 0, 0, 0, 0, 0, 3, 0));
} }

View file

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

View file

@ -22,7 +22,7 @@ import java.util.UUID;
*/ */
public final class DiscipleOfTheSun extends CardImpl { 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 { static {
filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 4)); filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 4));

View file

@ -15,7 +15,7 @@ import mage.filter.FilterSpell;
*/ */
public final class EnchantresssPresence extends CardImpl { 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 { static {
filter.add(CardType.ENCHANTMENT.getPredicate()); 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. // Filigree Attendant's power is equal to the number of artifacts you control.
this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerSourceEffect( this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerSourceEffect(
ArtifactYouControlCount.instance, Duration.EndOfGame, SubLayer.CharacteristicDefining_7a 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) { 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. // 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( this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new BoostSourceEffect(1, 0, Duration.WhileOnBattlefield), DeliriumCondition.instance, 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)); )).setAbilityWord(AbilityWord.DELIRIUM).addHint(CardTypesInGraveyardHint.YOU));
} }

View file

@ -1,7 +1,5 @@
package mage.cards.f; package mage.cards.f;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.condition.Condition; import mage.abilities.condition.Condition;
import mage.abilities.costs.Cost; import mage.abilities.costs.Cost;
@ -12,13 +10,15 @@ import mage.abilities.effects.common.GainLifeEffect;
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.filter.StaticFilters;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.target.common.TargetAnyTarget; import mage.target.common.TargetAnyTarget;
import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetControlledPermanent;
import java.util.UUID;
/** /**
*
* @author weirddan455 * @author weirddan455
*/ */
public final class FoundryHelix extends CardImpl { 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}"); super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{R}{W}");
// As an additional cost to cast this spell, sacrifice a permanent. // 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. // 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)); this.getSpellAbility().addEffect(new DamageTargetEffect(4));

View file

@ -30,7 +30,7 @@ public final class GaeasWill extends CardImpl {
this.color.setGreen(true); this.color.setGreen(true);
// Suspend 4{G} // 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. // Until end of turn, you may play land cards and cast spells from your graveyard.
this.getSpellAbility().addEffect(new GaeasWillGraveyardEffect()); this.getSpellAbility().addEffect(new GaeasWillGraveyardEffect());
@ -57,7 +57,7 @@ class GaeasWillGraveyardEffect extends ContinuousEffectImpl {
public GaeasWillGraveyardEffect(Duration duration) { public GaeasWillGraveyardEffect(Duration duration) {
super(duration, Layer.PlayerEffects, SubLayer.NA, Outcome.Benefit); 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) { private GaeasWillGraveyardEffect(final GaeasWillGraveyardEffect effect) {
@ -84,7 +84,7 @@ class GaeassWillReplacementEffect extends ReplacementEffectImpl {
public GaeassWillReplacementEffect() { public GaeassWillReplacementEffect() {
super(Duration.EndOfTurn, Outcome.Detriment); 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) { 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}"); 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. // 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().addTarget(new TargetAnyTarget());
this.getSpellAbility().setAbilityWord(AbilityWord.CONVERGE); this.getSpellAbility().setAbilityWord(AbilityWord.CONVERGE);

View file

@ -7,7 +7,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import mage.game.permanent.token.FoodToken; import mage.game.permanent.token.FoodToken;
import mage.target.common.TargetCardInGraveyard; import mage.target.common.TargetCardInYourGraveyard;
import java.util.UUID; 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. // Return target creature card from your graveyard to the battlefield. Create a Food token.
this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect()); this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect());
this.getSpellAbility().addEffect(new CreateTokenEffect(new FoodToken())); 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) { 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. // {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.addCost(new RemoveCountersSourceCost(CounterType.P1P1.createInstance()));
ability.addTarget(new TargetAnyTarget()); ability.addTarget(new TargetAnyTarget());
this.addAbility(ability); 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. // At the beginning of each player's upkeep, that player discards a card.
this.addAbility(new BeginningOfUpkeepTriggeredAbility( this.addAbility(new BeginningOfUpkeepTriggeredAbility(
Zone.BATTLEFIELD, new DiscardTargetEffect(1), Zone.BATTLEFIELD, new DiscardTargetEffect(1),
TargetController.EACH_PLAYER, false, true TargetController.ACTIVE, false, true
)); ));
// Madness {1}{B}{B} // Madness {1}{B}{B}

View file

@ -28,7 +28,7 @@ public final class PhantasmalDreadmaw extends CardImpl {
this.addAbility(TrampleAbility.getInstance()); this.addAbility(TrampleAbility.getInstance());
// When Phantasmal Dreadmaw becomes the target of a spell or ability, sacrifice it. // 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) { 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.abilities.hint.common.CardTypesInGraveyardHint;
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.SubType; import mage.constants.SubType;
import mage.constants.Zone; import mage.constants.Zone;
@ -44,7 +45,7 @@ public final class RavingVisionary extends CardImpl {
new ManaCostsImpl<>("{2}{U}"), DeliriumCondition.instance new ManaCostsImpl<>("{2}{U}"), DeliriumCondition.instance
); );
ability.addCost(new TapSourceCost()); ability.addCost(new TapSourceCost());
this.addAbility(ability.addHint(CardTypesInGraveyardHint.YOU)); this.addAbility(ability.addHint(CardTypesInGraveyardHint.YOU).setAbilityWord(AbilityWord.DELIRIUM));
} }
private RavingVisionary(final RavingVisionary card) { private RavingVisionary(final RavingVisionary card) {

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. // Domain This spell costs {2} less to cast for each basic land type among lands you control.
this.addAbility(new SimpleStaticAbility(Zone.ALL, this.addAbility(new SimpleStaticAbility(Zone.ALL,
new SpellCostReductionForEachSourceEffect(2, xValue) 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)); ).addHint(DomainHint.instance).setAbilityWord(AbilityWord.DOMAIN));
// Flying // Flying

View file

@ -1,7 +1,6 @@
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.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@ -11,13 +10,13 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.filter.common.FilterControlledLandPermanent; import mage.filter.StaticFilters;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
/** import java.util.UUID;
*
* @author LoneFox
/**
* @author LoneFox
*/ */
public final class SeaDrake extends CardImpl { public final class SeaDrake extends CardImpl {
@ -31,7 +30,7 @@ public final class SeaDrake extends CardImpl {
this.addAbility(FlyingAbility.getInstance()); this.addAbility(FlyingAbility.getInstance());
// When Sea Drake enters the battlefield, return two target lands you control to their owner's hand. // 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 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); this.addAbility(ability);
} }

View file

@ -10,6 +10,7 @@ import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect; import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect; import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect;
import mage.abilities.effects.common.TapSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
@ -39,9 +40,11 @@ public final class SteelDromedary extends CardImpl {
this.toughness = new MageInt(2); this.toughness = new MageInt(2);
// Steel Dromedary enters the battlefield tapped with two +1/+1 counters on it. // Steel Dromedary enters the battlefield tapped with two +1/+1 counters on it.
this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect( Ability ability = new EntersBattlefieldAbility(
CounterType.P1P1.createInstance(2) new TapSourceEffect(), "tapped with two +1/+1 counters on it"
), "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. // Steel Dromedary doesn't untap during your untap step if it has a +1/+1 counter on it.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousRuleModifyingEffect( 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"))); ).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. // 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 new SteelDromedaryEffect(), TargetController.YOU, true
); );
ability.addTarget(new TargetCreaturePermanent()); ability.addTarget(new TargetCreaturePermanent());
@ -70,7 +73,7 @@ class SteelDromedaryEffect extends OneShotEffect {
SteelDromedaryEffect() { SteelDromedaryEffect() {
super(Outcome.Benefit); 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) { 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.abilities.hint.common.DomainHint;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.*;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.target.common.TargetCardInGraveyard; import mage.target.common.TargetCardInGraveyard;
import java.util.UUID; 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. // 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( this.addAbility(new SimpleStaticAbility(
Zone.ALL, new SetPowerToughnessSourceEffect(xValue, Duration.EndOfGame) Zone.ALL, new SetPowerToughnessSourceEffect(xValue, Duration.EndOfGame)
).addHint(DomainHint.instance)); ).addHint(DomainHint.instance).setAbilityWord(AbilityWord.DOMAIN));
// Whenever Territorial Kavu attacks, choose one // Whenever Territorial Kavu attacks, choose one
// Discard a card. If you do, draw a card. // Discard a card. If you do, draw a card.

View file

@ -1,11 +1,10 @@
package mage.cards.t; package mage.cards.t;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.AsEntersBattlefieldAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect; import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
@ -19,13 +18,18 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.*;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.watchers.common.CastSpellLastTurnWatcher; import mage.watchers.common.CastSpellLastTurnWatcher;
import java.util.UUID;
/** /**
* @author Fubs * @author Fubs
*/ */
public final class ThrastaTempestsRoar extends CardImpl { 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) { public ThrastaTempestsRoar(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{10}{G}{G}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{10}{G}{G}");
addSuperType(SuperType.LEGENDARY); addSuperType(SuperType.LEGENDARY);
@ -34,11 +38,9 @@ public final class ThrastaTempestsRoar extends CardImpl {
this.toughness = new MageInt(7); this.toughness = new MageInt(7);
// This spell costs 3 less to cast for each other spell cast this turn // This spell costs 3 less to cast for each other spell cast this turn
ThrastaDynamicValue spellCastCount = new ThrastaDynamicValue(); this.addAbility(new SimpleStaticAbility(
//spellCastCount does not need -1 because cast count increases only after current spell cast/reduction. Zone.ALL, new SpellCostReductionForEachSourceEffect(3, ThrastaDynamicValue.instance)
this.addAbility(new SimpleStaticAbility(Zone.ALL, new SpellCostReductionForEachSourceEffect(3, spellCastCount)) ).addHint(hint));
.addHint(new ValueHint("spell cast", spellCastCount))
);
// Trample, Haste, and Trample over planeswalkers // Trample, Haste, and Trample over planeswalkers
this.addAbility(TrampleAbility.getInstance()); this.addAbility(TrampleAbility.getInstance());
@ -46,20 +48,25 @@ public final class ThrastaTempestsRoar extends CardImpl {
this.addAbility(TrampleOverPlaneswalkersAbility.getInstance()); this.addAbility(TrampleOverPlaneswalkersAbility.getInstance());
// Thrasta has hexproof as long as it entered the battlefield this turn. // Thrasta has hexproof as long as it entered the battlefield this turn.
this.addAbility(new AsEntersBattlefieldAbility(new GainAbilitySourceEffect(HexproofAbility.getInstance(), Duration.EndOfTurn))); 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); super(card);
} }
@Override @Override
public ThrastaTempestsRoar copy() { public ThrastaTempestsRoar copy() {
return new mage.cards.t.ThrastaTempestsRoar(this); return new ThrastaTempestsRoar(this);
} }
} }
class ThrastaDynamicValue implements DynamicValue { enum ThrastaDynamicValue implements DynamicValue {
instance;
@Override @Override
public int calculate(Game game, Ability sourceAbility, Effect effect) { public int calculate(Game game, Ability sourceAbility, Effect effect) {
CastSpellLastTurnWatcher watcher = game.getState().getWatcher(CastSpellLastTurnWatcher.class); CastSpellLastTurnWatcher watcher = game.getState().getWatcher(CastSpellLastTurnWatcher.class);
@ -71,7 +78,7 @@ class ThrastaDynamicValue implements DynamicValue {
@Override @Override
public ThrastaDynamicValue copy() { public ThrastaDynamicValue copy() {
return new ThrastaDynamicValue(); return this;
} }
@Override @Override
@ -81,7 +88,16 @@ class ThrastaDynamicValue implements DynamicValue {
@Override @Override
public String getMessage() { 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. // Tizerus Charger escapes with your choice of a +1/+1 counter or a flying counter on it.
this.addAbility(new EntersBattlefieldAbility( this.addAbility(new EntersBattlefieldAbility(
new TizerusChargerEffect(), null, "{this} escapes " + 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}"); super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{U}{U}");
// Return all permanents to their owners' hands. // 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) { 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)); ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
this.addAbility(new EntersBattlefieldTriggeredAbility( this.addAbility(new EntersBattlefieldTriggeredAbility(
new DoWhenCostPaid(ability, new ExileFromGraveCost( new DoWhenCostPaid(ability, new ExileFromGraveCost(
new TargetCardInYourGraveyard(2, StaticFilters.FILTER_CARD) new TargetCardInYourGraveyard(2, StaticFilters.FILTER_CARD_CARDS)
), "Exile two cards from your graveyard?") ), "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 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 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 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; package mage.abilities.effects.common;
import mage.constants.Outcome;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.constants.Outcome;
import mage.game.Game; import mage.game.Game;
import mage.players.Player; import mage.players.Player;
/** /**
*
* @author BetaSteward_at_googlemail.com * @author BetaSteward_at_googlemail.com
*/ */
public class GainLifeEffect extends OneShotEffect { public class GainLifeEffect extends OneShotEffect {
@ -25,7 +25,6 @@ public class GainLifeEffect extends OneShotEffect {
public GainLifeEffect(DynamicValue life) { public GainLifeEffect(DynamicValue life) {
super(Outcome.GainLife); super(Outcome.GainLife);
this.life = life; this.life = life;
setText();
} }
public GainLifeEffect(DynamicValue life, String rule) { public GainLifeEffect(DynamicValue life, String rule) {
@ -53,24 +52,24 @@ public class GainLifeEffect extends OneShotEffect {
return true; return true;
} }
private void setText() { @Override
if (!staticText.isEmpty()) { public String getText(Mode mode) {
return; if (staticText != null && !staticText.isEmpty()) {
return staticText;
} }
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
String message = life.getMessage(); String message = life.getMessage();
sb.append("you gain "); sb.append("you gain ");
if (message.startsWith("that")) { if (message.startsWith("that")) {
sb.append(message).append(' '); 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).append(' ');
} }
sb.append("life"); sb.append("life");
if (!message.isEmpty() && !message.startsWith("that")) { 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); 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 ");
} }
sb.append(target.getTargetName()); 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'); sb.append('s');
} }
if (target.getMaxNumberOfTargets() > 1) { if (target.getMaxNumberOfTargets() > 1) {

View file

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

View file

@ -316,6 +316,12 @@ public final class StaticFilters {
FILTER_CONTROLLED_A_PERMANENT.setLockedFilter(true); 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(); public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_ARTIFACT = new FilterControlledArtifactPermanent();
static { static {

View file

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