[AFC] various text fixes

This commit is contained in:
Evan Kranzler 2021-08-22 17:56:22 -04:00
parent 01fefff1b9
commit 13949d8e3e
33 changed files with 135 additions and 116 deletions

View file

@ -1,8 +1,6 @@
package mage.cards.b; package mage.cards.b;
import java.util.UUID; import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
@ -11,20 +9,30 @@ import mage.abilities.keyword.EquipAbility;
import mage.abilities.keyword.LifelinkAbility; import mage.abilities.keyword.LifelinkAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.AttachmentType;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import java.util.UUID;
/** /**
*
* @author BetaSteward_at_googlemail.com * @author BetaSteward_at_googlemail.com
*/ */
public final class BasiliskCollar extends CardImpl { public final class BasiliskCollar extends CardImpl {
public BasiliskCollar(UUID ownerId, CardSetInfo setInfo) { public BasiliskCollar(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{1}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}");
this.subtype.add(SubType.EQUIPMENT); this.subtype.add(SubType.EQUIPMENT);
Ability ability = new SimpleStaticAbility(new GainAbilityAttachedEffect(
DeathtouchAbility.getInstance(), AttachmentType.EQUIPMENT
));
ability.addEffect(new GainAbilityAttachedEffect(
LifelinkAbility.getInstance(), AttachmentType.EQUIPMENT
).setText("and lifelink"));
this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(2))); this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(2)));
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(LifelinkAbility.getInstance(), AttachmentType.EQUIPMENT)));
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(DeathtouchAbility.getInstance(), AttachmentType.EQUIPMENT)));
} }
private BasiliskCollar(final BasiliskCollar card) { private BasiliskCollar(final BasiliskCollar card) {

View file

@ -31,7 +31,7 @@ public final class BeltOfGiantStrength extends CardImpl {
// Equip {10}. This ability costs {X} less to activate where X is the power of the creature it targets. // Equip {10}. This ability costs {X} less to activate where X is the power of the creature it targets.
EquipAbility ability = new EquipAbility(10); EquipAbility ability = new EquipAbility(10);
ability.setCostReduceText("This ability costs {X} less to activate where X is the power of the creature it targets."); ability.setCostReduceText("This ability costs {X} less to activate, where X is the power of the creature it targets.");
ability.setCostAdjuster(BeltOfGiantStrengthAdjuster.instance); ability.setCostAdjuster(BeltOfGiantStrengthAdjuster.instance);
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -30,7 +30,7 @@ public final class BogardanHellkite extends CardImpl {
this.addAbility(FlashAbility.getInstance()); this.addAbility(FlashAbility.getInstance());
this.addAbility(FlyingAbility.getInstance()); this.addAbility(FlyingAbility.getInstance());
Ability ability = new EntersBattlefieldTriggeredAbility(new DamageMultiEffect(5), false); Ability ability = new EntersBattlefieldTriggeredAbility(new DamageMultiEffect(5, "it"), false);
ability.addTarget(new TargetAnyTargetAmount(5)); ability.addTarget(new TargetAnyTargetAmount(5));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -81,7 +81,7 @@ class CataclysmicGearhulkEffect extends OneShotEffect {
public CataclysmicGearhulkEffect() { public CataclysmicGearhulkEffect() {
super(Outcome.DestroyPermanent); super(Outcome.DestroyPermanent);
staticText = "each player chooses an artifact, a creature, an enchantment, and a planeswalker " + staticText = "each player chooses an artifact, a creature, an enchantment, and a planeswalker " +
"from among the nonland permanents they control then sacrifices the rest"; "from among the nonland permanents they control, then sacrifices the rest";
} }
public CataclysmicGearhulkEffect(CataclysmicGearhulkEffect effect) { public CataclysmicGearhulkEffect(CataclysmicGearhulkEffect effect) {

View file

@ -60,13 +60,13 @@ public final class CattiBrieOfMithralHall extends CardImpl {
// each Equipment attached to it. // each Equipment attached to it.
EquipmentAttachedCount amount = new EquipmentAttachedCount(); EquipmentAttachedCount amount = new EquipmentAttachedCount();
this.addAbility(new AttacksTriggeredAbility( this.addAbility(new AttacksTriggeredAbility(
new AddCountersSourceEffect(CounterType.P1P1.createInstance(), amount, false))); new AddCountersSourceEffect(CounterType.P1P1.createInstance(), amount, false).setText("put a +1/+1 counter on it for each Equipment attached to it")));
// {1}, Remove all +1/+1 counters from Catti-brie: It deals X damage to target // {1}, Remove all +1/+1 counters from Catti-brie: It deals X damage to target
// attacking or blocking creature an opponent controls, where X is the number of // attacking or blocking creature an opponent controls, where X is the number of
// counters removed this way. // counters removed this way.
Ability damageAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, Ability damageAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD,
new DamageTargetEffect(CattiBrieRemovedCounterValue.instance), new ManaCostsImpl("{1}")); new DamageTargetEffect(CattiBrieRemovedCounterValue.instance).setText("it deals X damage to target attacking or blocking creature an opponent controls, where X is the number of counters removed this way"), new ManaCostsImpl("{1}"));
damageAbility.addTarget(new TargetCreaturePermanent(filter)); damageAbility.addTarget(new TargetCreaturePermanent(filter));
damageAbility.addCost(new RemoveAllCountersSourceCost(CounterType.P1P1)); damageAbility.addCost(new RemoveAllCountersSourceCost(CounterType.P1P1));

View file

@ -1,7 +1,5 @@
package mage.cards.c; package mage.cards.c;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.ObjectColor; import mage.ObjectColor;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
@ -13,18 +11,20 @@ import mage.abilities.keyword.ProtectionAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.Zone; import mage.constants.SubType;
import java.util.UUID;
/** /**
*
* @author Loki * @author Loki
*/ */
public final class ChameleonColossus extends CardImpl { public final class ChameleonColossus extends CardImpl {
private static final SourcePermanentPowerCount xValue = new SourcePermanentPowerCount();
public ChameleonColossus(UUID ownerId, CardSetInfo setInfo) { public ChameleonColossus(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}{G}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}");
this.subtype.add(SubType.SHAPESHIFTER); this.subtype.add(SubType.SHAPESHIFTER);
this.power = new MageInt(4); this.power = new MageInt(4);
@ -37,8 +37,11 @@ public final class ChameleonColossus extends CardImpl {
this.addAbility(ProtectionAbility.from(ObjectColor.BLACK)); this.addAbility(ProtectionAbility.from(ObjectColor.BLACK));
// {2}{G}{G}: Chameleon Colossus gets +X/+X until end of turn, where X is its power. // {2}{G}{G}: Chameleon Colossus gets +X/+X until end of turn, where X is its power.
SourcePermanentPowerCount x = new SourcePermanentPowerCount(); this.addAbility(new SimpleActivatedAbility(
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(x, x, Duration.EndOfTurn, true), new ManaCostsImpl("{2}{G}{G}"))); new BoostSourceEffect(xValue, xValue, Duration.EndOfTurn, true)
.setText("{this} gets +X/+X until end of turn, where X is its power"),
new ManaCostsImpl<>("{2}{G}{G}")
));
} }
private ChameleonColossus(final ChameleonColossus card) { private ChameleonColossus(final ChameleonColossus card) {

View file

@ -28,8 +28,8 @@ import java.util.UUID;
*/ */
public final class CitadelSiege extends CardImpl { public final class CitadelSiege extends CardImpl {
private static final String ruleTrigger1 = "&bull Khans &mdash; At the beginning of combat on your turn, put two +1/+1 counters on target creature you control."; private static final String ruleTrigger1 = "&bull Khans &mdash; At the beginning of combat on your turn, put two +1/+1 counters on target creature you control.";
private static final String ruleTrigger2 = "&bull Dragons &mdash; At the beginning of combat on each opponent's turn, tap target creature that player controls."; private static final String ruleTrigger2 = "&bull Dragons &mdash; At the beginning of combat on each opponent's turn, tap target creature that player controls.";
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature controlled by the active player"); private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature controlled by the active player");
static { static {

View file

@ -30,7 +30,7 @@ public final class CuratorOfMysteries extends CardImpl {
this.addAbility(FlyingAbility.getInstance()); this.addAbility(FlyingAbility.getInstance());
// Whenever you cycle or discard another card, scry 1. // Whenever you cycle or discard another card, scry 1.
this.addAbility(new CycleOrDiscardControllerTriggeredAbility(new ScryEffect(1))); this.addAbility(new CycleOrDiscardControllerTriggeredAbility(new ScryEffect(1)).setTriggerPhrase("Whenever you cycle or discard another card, "));
// Cycling {U} // Cycling {U}
this.addAbility(new CyclingAbility(new ManaCostsImpl("{U}"))); this.addAbility(new CyclingAbility(new ManaCostsImpl("{U}")));

View file

@ -56,7 +56,7 @@ class CurseOfVerbosityEffect extends OneShotEffect {
CurseOfVerbosityEffect() { CurseOfVerbosityEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
this.staticText = "draw a card. Each opponent attacking that player does the same."; this.staticText = "you draw a card. Each opponent attacking that player does the same.";
} }
CurseOfVerbosityEffect(final CurseOfVerbosityEffect effect) { CurseOfVerbosityEffect(final CurseOfVerbosityEffect effect) {

View file

@ -64,7 +64,7 @@ class DanseMacabreEffect extends OneShotEffect {
"<br>1-14 | Return a creature card put into a graveyard " + "<br>1-14 | Return a creature card put into a graveyard " +
"this way to the battlefield under your control." + "this way to the battlefield under your control." +
"<br>15+ | Return up to two creature cards put into " + "<br>15+ | Return up to two creature cards put into " +
"a graveyard this way to the battlefield under your control"; "graveyards this way to the battlefield under your control";
} }
private DanseMacabreEffect(final DanseMacabreEffect effect) { private DanseMacabreEffect(final DanseMacabreEffect effect) {

View file

@ -22,7 +22,7 @@ public final class Explore extends CardImpl {
this.getSpellAbility().addEffect(new PlayAdditionalLandsControllerEffect(1, Duration.EndOfTurn)); this.getSpellAbility().addEffect(new PlayAdditionalLandsControllerEffect(1, Duration.EndOfTurn));
// Draw a card. // Draw a card.
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("<br>"));
} }
private Explore(final Explore card) { private Explore(final Explore card) {

View file

@ -100,7 +100,7 @@ class FeySteedTriggeredAbility extends TriggeredAbilityImpl {
@Override @Override
public String getRule() { public String getRule() {
return "Whenever a creature or planeswalker you control becomes the target of a spell or ability an opponent controls, you may draw a card"; return "Whenever a creature or planeswalker you control becomes the target of a spell or ability an opponent controls, you may draw a card.";
} }
@Override @Override

View file

@ -36,8 +36,8 @@ public final class FrontierSiege extends CardImpl {
filter.add(new AbilityPredicate(FlyingAbility.class)); filter.add(new AbilityPredicate(FlyingAbility.class));
} }
private static final String ruleTrigger1 = "&bull Khans &mdash; At the beginning of each of your main phases, add {G}{G}."; private static final String ruleTrigger1 = "&bull Khans &mdash; At the beginning of each of your main phases, add {G}{G}.";
private static final String ruleTrigger2 = "&bull Dragons &mdash; Whenever a creature with flying enters the battlefield under your control, you may have it fight target creature you don't control."; private static final String ruleTrigger2 = "&bull Dragons &mdash; Whenever a creature with flying enters the battlefield under your control, you may have it fight target creature you don't control.";
public FrontierSiege(UUID ownerId, CardSetInfo setInfo) { public FrontierSiege(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}");

View file

@ -43,7 +43,7 @@ class GratuitousViolenceReplacementEffect extends ReplacementEffectImpl {
GratuitousViolenceReplacementEffect() { GratuitousViolenceReplacementEffect() {
super(Duration.WhileOnBattlefield, Outcome.Damage); super(Duration.WhileOnBattlefield, Outcome.Damage);
staticText = "If a creature you control would deal damage to a permanent or player, it deals double that permanent to that creature or player instead"; staticText = "If a creature you control would deal damage to a permanent or player, it deals double that damage to that creature or player instead";
} }
GratuitousViolenceReplacementEffect(final GratuitousViolenceReplacementEffect effect) { GratuitousViolenceReplacementEffect(final GratuitousViolenceReplacementEffect effect) {

View file

@ -6,6 +6,8 @@ import mage.abilities.effects.common.DestroyTargetEffect;
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.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
/** /**
@ -20,7 +22,7 @@ public final class Hex extends CardImpl {
// Destroy six target creatures. // Destroy six target creatures.
this.getSpellAbility().addEffect(new DestroyTargetEffect()); this.getSpellAbility().addEffect(new DestroyTargetEffect());
this.getSpellAbility().addTarget(new TargetCreaturePermanent(6)); this.getSpellAbility().addTarget(new TargetPermanent(6, StaticFilters.FILTER_PERMANENT_CREATURES));
} }
private Hex(final Hex card) { private Hex(final Hex card) {

View file

@ -38,7 +38,7 @@ public final class ImmovableRod extends CardImpl {
this.addAbility(new SkipUntapOptionalAbility()); this.addAbility(new SkipUntapOptionalAbility());
// Whenever Immovable Rod becomes untapped, venture into the dungeon. // Whenever Immovable Rod becomes untapped, venture into the dungeon.
this.addAbility(new InspiredAbility(new VentureIntoTheDungeonEffect())); this.addAbility(new InspiredAbility(new VentureIntoTheDungeonEffect(), false, false));
// {3}{W}, {T}: For as long as Immovable Rod remains tapped, another target permanent loses all abilities and can't attack or block. // {3}{W}, {T}: For as long as Immovable Rod remains tapped, another target permanent loses all abilities and can't attack or block.
Ability ability = new SimpleActivatedAbility(new ImmovableRodAbilityEffect(), new ManaCostsImpl<>("{3}{W}")); Ability ability = new SimpleActivatedAbility(new ImmovableRodAbilityEffect(), new ManaCostsImpl<>("{3}{W}"));

View file

@ -60,7 +60,7 @@ class IndomitableMightEffect extends AsThoughEffectImpl {
IndomitableMightEffect() { IndomitableMightEffect() {
super(AsThoughEffectType.DAMAGE_NOT_BLOCKED, Duration.WhileOnBattlefield, Outcome.Damage); super(AsThoughEffectType.DAMAGE_NOT_BLOCKED, Duration.WhileOnBattlefield, Outcome.Damage);
this.staticText = "enchanted creature's controller may have it " + this.staticText = "enchanted creature's controller may have it " +
"assign combat damage as though it weren't blocked"; "assign its combat damage as though it weren't blocked";
} }
private IndomitableMightEffect(IndomitableMightEffect effect) { private IndomitableMightEffect(IndomitableMightEffect effect) {

View file

@ -1,29 +1,27 @@
package mage.cards.l; package mage.cards.l;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.BeginningOfCombatTriggeredAbility; import mage.abilities.common.BeginningOfCombatTriggeredAbility;
import mage.abilities.condition.common.CommanderInPlayCondition; import mage.abilities.condition.common.CommanderInPlayCondition;
import mage.abilities.decorator.ConditionalTriggeredAbility; import mage.abilities.decorator.ConditionalTriggeredAbility;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.constants.SubType;
import mage.abilities.keyword.HasteAbility; import mage.abilities.keyword.HasteAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.*;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.TargetController;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.token.ThopterColorlessToken; import mage.game.permanent.token.ThopterColorlessToken;
import mage.target.targetpointer.FixedTarget; import mage.game.permanent.token.Token;
import mage.target.targetpointer.FixedTargets;
import java.util.Objects;
import java.util.UUID;
import java.util.stream.Collectors;
/** /**
*
* @author TheElk801 * @author TheElk801
*/ */
public final class LoyalApprentice extends CardImpl { public final class LoyalApprentice extends CardImpl {
@ -42,13 +40,11 @@ public final class LoyalApprentice extends CardImpl {
// Lieutenant At the beginning of combat on your turn, if you control your commander, create a 1/1 colorless Thopter artifact creature token with flying. That token gains haste until end of turn. // Lieutenant At the beginning of combat on your turn, if you control your commander, create a 1/1 colorless Thopter artifact creature token with flying. That token gains haste until end of turn.
this.addAbility(new ConditionalTriggeredAbility( this.addAbility(new ConditionalTriggeredAbility(
new BeginningOfCombatTriggeredAbility( new BeginningOfCombatTriggeredAbility(
new LoyalApprenticeEffect(), new LoyalApprenticeEffect(), TargetController.YOU, false
TargetController.YOU, false ), CommanderInPlayCondition.instance, "<i>Lieutenant</i> &mdash; " +
), CommanderInPlayCondition.instance, "At the beginning of combat on your turn, if you control your commander, " +
"<i>Lieutenant</i> &mdash; At the beginning of combat " "create a 1/1 colorless Thopter artifact creature token with flying. " +
+ "on your turn, create a 1/1 colorless Thopter " "That token gains haste until end of turn."
+ "artifact creature token with flying. "
+ "That token gains haste until end of turn"
)); ));
} }
@ -81,15 +77,17 @@ class LoyalApprenticeEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
CreateTokenEffect effect = new CreateTokenEffect(new ThopterColorlessToken()); CreateTokenEffect effect = new CreateTokenEffect(new ThopterColorlessToken());
effect.apply(game, source); effect.apply(game, source);
effect.getLastAddedTokenIds().stream().map((tokenId) -> { Token token = new ThopterColorlessToken();
ContinuousEffect continuousEffect = new GainAbilityTargetEffect( token.putOntoBattlefield(1, game, source, source.getControllerId());
HasteAbility.getInstance(), Duration.EndOfTurn game.addEffect(new GainAbilityTargetEffect(
); HasteAbility.getInstance(), Duration.EndOfTurn
continuousEffect.setTargetPointer(new FixedTarget(tokenId, game)); ).setTargetPointer(new FixedTargets(
return continuousEffect; token.getLastAddedTokenIds()
}).forEachOrdered((continuousEffect) -> { .stream()
game.addEffect(continuousEffect, source); .map(game::getPermanent)
}); .filter(Objects::nonNull)
.collect(Collectors.toList()), game
)), source);
return true; return true;
} }
} }

View file

@ -47,7 +47,7 @@ public final class Nihiloor extends CardImpl {
// Whenever you attack with a creature an opponent owns, you gain 2 life and that player loses 2 life. // Whenever you attack with a creature an opponent owns, you gain 2 life and that player loses 2 life.
Ability ability = new AttacksAllTriggeredAbility( Ability ability = new AttacksAllTriggeredAbility(
new GainLifeEffect(1), false, filter, new GainLifeEffect(2), false, filter,
SetTargetPointer.PERMANENT, false SetTargetPointer.PERMANENT, false
).setTriggerPhrase("Whenever you attack with a creature an opponent owns, "); ).setTriggerPhrase("Whenever you attack with a creature an opponent owns, ");
ability.addEffect(new NihiloorLoseLifeEffect()); ability.addEffect(new NihiloorLoseLifeEffect());
@ -145,7 +145,7 @@ class NihiloorLoseLifeEffect extends OneShotEffect {
NihiloorLoseLifeEffect() { NihiloorLoseLifeEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
staticText = "you gain 2 life and that player loses 2 life"; staticText = "and that player loses 2 life";
} }
private NihiloorLoseLifeEffect(final NihiloorLoseLifeEffect effect) { private NihiloorLoseLifeEffect(final NihiloorLoseLifeEffect effect) {

View file

@ -35,8 +35,8 @@ import mage.target.targetpointer.FixedTarget;
*/ */
public final class OutpostSiege extends CardImpl { public final class OutpostSiege extends CardImpl {
private static final String ruleTrigger1 = "&bull Khans &mdash; At the beginning of your upkeep, exile the top card of your library. Until end of turn, you may play that card."; private static final String ruleTrigger1 = "&bull Khans &mdash; At the beginning of your upkeep, exile the top card of your library. Until end of turn, you may play that card.";
private static final String ruleTrigger2 = "&bull Dragons &mdash; Whenever a creature you control leaves the battlefield, {this} deals 1 damage to any target."; private static final String ruleTrigger2 = "&bull Dragons &mdash; Whenever a creature you control leaves the battlefield, {this} deals 1 damage to any target.";
public OutpostSiege(UUID ownerId, CardSetInfo setInfo) { public OutpostSiege(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{R}"); super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{R}");

View file

@ -24,8 +24,8 @@ import mage.target.common.TargetCardInYourGraveyard;
*/ */
public final class PalaceSiege extends CardImpl { public final class PalaceSiege extends CardImpl {
private static final String ruleTrigger1 = "&bull Khans &mdash; At the beginning of your upkeep, return target creature card from your graveyard to your hand."; private static final String ruleTrigger1 = "&bull Khans &mdash; At the beginning of your upkeep, return target creature card from your graveyard to your hand.";
private static final String ruleTrigger2 = "&bull Dragons &mdash; At the beginning of your upkeep, each opponent loses 2 life and you gain 2 life."; private static final String ruleTrigger2 = "&bull Dragons &mdash; At the beginning of your upkeep, each opponent loses 2 life and you gain 2 life.";
public PalaceSiege(UUID ownerId, CardSetInfo setInfo) { public PalaceSiege(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}{B}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}{B}");

View file

@ -24,7 +24,7 @@ import java.util.UUID;
*/ */
public final class PhantasmalImage extends CardImpl { public final class PhantasmalImage extends CardImpl {
private static final String effectText = "a copy of any creature on the battlefield, except it's an Illusion in addition to its other types and it has \"When this creature becomes the target of a spell or ability, sacrifice it.\""; private static final String effectText = "as a copy of any creature on the battlefield, except it's an Illusion in addition to its other types and it has \"When this creature becomes the target of a spell or ability, sacrifice it.\"";
private static final CopyApplier phantasmalImageApplier = new CopyApplier() { private static final CopyApplier phantasmalImageApplier = new CopyApplier() {
@Override @Override

View file

@ -22,11 +22,9 @@ import java.util.UUID;
* @author Loki * @author Loki
*/ */
public final class PuresteelPaladin extends CardImpl { public final class PuresteelPaladin extends CardImpl {
private static final FilterPermanent filter = new FilterControlledPermanent("Equipment");
static { private static final FilterPermanent filter
filter.add(SubType.EQUIPMENT.getPredicate()); = new FilterControlledPermanent(SubType.EQUIPMENT, "an Equipment");
}
public PuresteelPaladin(UUID ownerId, CardSetInfo setInfo) { public PuresteelPaladin(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}{W}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}{W}");
@ -37,16 +35,17 @@ public final class PuresteelPaladin extends CardImpl {
this.toughness = new MageInt(2); this.toughness = new MageInt(2);
// Whenever an Equipment enters the battlefield under your control, you may draw a card. // Whenever an Equipment enters the battlefield under your control, you may draw a card.
this.addAbility(new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), filter, true)); this.addAbility(new EntersBattlefieldControlledTriggeredAbility(
Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), filter, true
));
// <i>Metalcraft</i> &mdash; Equipment you control have equip {0} as long as you control three or more artifacts // <i>Metalcraft</i> &mdash; Equipment you control have equip {0} as long as you control three or more artifacts
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect( this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new GainAbilityControlledEffect(new EquipAbility(Outcome.AddAbility, new GenericManaCost(0)), Duration.WhileOnBattlefield, filter), new GainAbilityControlledEffect(new EquipAbility(
MetalcraftCondition.instance, Outcome.AddAbility, new GenericManaCost(0)
"<i>Metalcraft</i> &mdash; Equipment you control have equip {0} as long as you control three or more artifacts")) ), Duration.WhileOnBattlefield, filter), MetalcraftCondition.instance,
.setAbilityWord(AbilityWord.METALCRAFT) "equipment you control have equip {0} as long as you control three or more artifacts"
.addHint(MetalcraftHint.instance) )).setAbilityWord(AbilityWord.METALCRAFT).addHint(MetalcraftHint.instance));
);
} }
private PuresteelPaladin(final PuresteelPaladin card) { private PuresteelPaladin(final PuresteelPaladin card) {

View file

@ -27,7 +27,7 @@ public final class ReassemblingSkeleton extends CardImpl {
this.toughness = new MageInt(1); this.toughness = new MageInt(1);
// {1}{B}: Return Reassembling Skeleton from your graveyard to the battlefield tapped. // {1}{B}: Return Reassembling Skeleton from your graveyard to the battlefield tapped.
this.addAbility(new SimpleActivatedAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToBattlefieldEffect(true), new ManaCostsImpl("{1}{B}"))); this.addAbility(new SimpleActivatedAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToBattlefieldEffect(true, false), new ManaCostsImpl("{1}{B}")));
} }
private ReassemblingSkeleton(final ReassemblingSkeleton card) { private ReassemblingSkeleton(final ReassemblingSkeleton card) {

View file

@ -1,7 +1,5 @@
package mage.cards.s; package mage.cards.s;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@ -15,11 +13,11 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.TargetController; import mage.constants.TargetController;
import mage.constants.Zone;
import mage.game.permanent.token.DragonToken2; import mage.game.permanent.token.DragonToken2;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class SkylineDespot extends CardImpl { public final class SkylineDespot extends CardImpl {
@ -37,10 +35,12 @@ public final class SkylineDespot extends CardImpl {
this.addAbility(new EntersBattlefieldTriggeredAbility(new BecomesMonarchSourceEffect(), false)); this.addAbility(new EntersBattlefieldTriggeredAbility(new BecomesMonarchSourceEffect(), false));
// At the beginning of your upkeep, if you're the monarch, put a 5/5 red Dragon creature token with flying onto the battlefield. // At the beginning of your upkeep, if you're the monarch, put a 5/5 red Dragon creature token with flying onto the battlefield.
this.addAbility(new ConditionalInterveningIfTriggeredAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, this.addAbility(new ConditionalInterveningIfTriggeredAbility(
new CreateTokenEffect(new DragonToken2()), new BeginningOfUpkeepTriggeredAbility(
TargetController.YOU, false), MonarchIsSourceControllerCondition.instance, new CreateTokenEffect(new DragonToken2()), TargetController.YOU, false
"At the beginning of your upkeep, if you're the monarch, put a 5/5 red Dragon creature token with flying onto the battlefield.")); ), MonarchIsSourceControllerCondition.instance, "At the beginning of your upkeep, " +
"if you're the monarch, create a 5/5 red Dragon creature token with flying."
));
} }

View file

@ -40,7 +40,7 @@ public final class StorvaldFrostGiantJarl extends CardImpl {
// Other creatures you control have ward {3}. // Other creatures you control have ward {3}.
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
new WardAbility(new GenericManaCost(3)), Duration.WhileOnBattlefield, new WardAbility(new GenericManaCost(3)), Duration.WhileOnBattlefield,
StaticFilters.FILTER_CONTROLLED_CREATURES, true StaticFilters.FILTER_PERMANENT_CREATURES, true
))); )));
// Whenever Storvald, Frost Giant Jarl enters the battlefield or attacks, choose one or both // Whenever Storvald, Frost Giant Jarl enters the battlefield or attacks, choose one or both
@ -54,6 +54,8 @@ public final class StorvaldFrostGiantJarl extends CardImpl {
Mode mode = new Mode(new SetPowerToughnessTargetEffect(1, 1, Duration.EndOfTurn)); Mode mode = new Mode(new SetPowerToughnessTargetEffect(1, 1, Duration.EndOfTurn));
mode.addTarget(new TargetCreaturePermanent()); mode.addTarget(new TargetCreaturePermanent());
ability.addMode(mode); ability.addMode(mode);
ability.getModes().setMinModes(1);
ability.getModes().setMaxModes(2);
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -90,6 +90,6 @@ class ThunderbreakRegentTriggeredAbility extends TriggeredAbilityImpl {
@Override @Override
public String getRule() { public String getRule() {
return "Whenever a Dragon you control becomes the target of a spell or ability your opponent controls, {this} deals 3 damage to that player."; return "Whenever a Dragon you control becomes the target of a spell or ability an opponent controls, {this} deals 3 damage to that player.";
} }
} }

View file

@ -63,7 +63,7 @@ class UnderdarkRiftEffect extends OneShotEffect {
UnderdarkRiftEffect() { UnderdarkRiftEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
staticText = "roll a d10. Put a target artifact, creature, or planeswalker into its owner's library " + staticText = "roll a d10. Put target artifact, creature, or planeswalker into its owner's library " +
"just beneath the top X cards of that library, where X is the result"; "just beneath the top X cards of that library, where X is the result";
} }

View file

@ -1,7 +1,5 @@
package mage.cards.w; package mage.cards.w;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.AttacksOrBlocksEnchantedTriggeredAbility; import mage.abilities.common.AttacksOrBlocksEnchantedTriggeredAbility;
import mage.abilities.common.DealsDamageToAPlayerAttachedTriggeredAbility; import mage.abilities.common.DealsDamageToAPlayerAttachedTriggeredAbility;
@ -13,19 +11,14 @@ import mage.abilities.keyword.DeathtouchAbility;
import mage.abilities.keyword.EquipAbility; import mage.abilities.keyword.EquipAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AttachmentType; import mage.constants.*;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.constants.Zone;
import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.token.ZombieToken; import mage.game.permanent.token.ZombieToken;
import java.util.UUID;
/** /**
*
* @author zeffirojoe * @author zeffirojoe
*/ */
public final class WandOfOrcus extends CardImpl { public final class WandOfOrcus extends CardImpl {
@ -37,24 +30,30 @@ public final class WandOfOrcus extends CardImpl {
} }
public WandOfOrcus(UUID ownerId, CardSetInfo setInfo) { public WandOfOrcus(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[] { CardType.ARTIFACT }, "{2}{B}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{B}");
this.addSuperType(SuperType.LEGENDARY); this.addSuperType(SuperType.LEGENDARY);
this.subtype.add(SubType.EQUIPMENT); this.subtype.add(SubType.EQUIPMENT);
// Whenever equipped creature attacks or blocks, it and Zombies you control gain // Whenever equipped creature attacks or blocks, it and Zombies you control gain
// deathtouch until end of turn. // deathtouch until end of turn.
Ability deathTouchAbility = new AttacksOrBlocksEnchantedTriggeredAbility(Zone.BATTLEFIELD, Ability deathTouchAbility = new AttacksOrBlocksEnchantedTriggeredAbility(
new GainAbilityAttachedEffect(DeathtouchAbility.getInstance(), AttachmentType.EQUIPMENT, Zone.BATTLEFIELD,
Duration.EndOfTurn)); new GainAbilityAttachedEffect(
deathTouchAbility.addEffect( DeathtouchAbility.getInstance(), AttachmentType.EQUIPMENT, Duration.EndOfTurn
new GainAbilityControlledEffect(DeathtouchAbility.getInstance(), Duration.EndOfTurn, filter)); ).setText("it")
);
deathTouchAbility.addEffect(new GainAbilityControlledEffect(
DeathtouchAbility.getInstance(), Duration.EndOfTurn, filter
).concatBy("and"));
this.addAbility(deathTouchAbility); this.addAbility(deathTouchAbility);
// Whenever equipped creature deals combat damage to a player, create that many // Whenever equipped creature deals combat damage to a player, create that many
// 2/2 black Zombie creature tokens. // 2/2 black Zombie creature tokens.
this.addAbility(new DealsDamageToAPlayerAttachedTriggeredAbility(new WandOfOrcusZombieEffect(), "equipped", this.addAbility(new DealsDamageToAPlayerAttachedTriggeredAbility(
false, true)); new WandOfOrcusZombieEffect(), "equipped creature",
false, true
));
// Equip {3} // Equip {3}
this.addAbility(new EquipAbility(Outcome.AddAbility, new ManaCostsImpl<>("{3}"))); this.addAbility(new EquipAbility(Outcome.AddAbility, new ManaCostsImpl<>("{3}")));

View file

@ -57,7 +57,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 = "AFR"; // check all abilities and output cards with wrong abilities texts; private static final String FULL_ABILITIES_CHECK_SET_CODE = "AFC"; // 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

@ -41,7 +41,7 @@ public class PutCardIntoGraveFromAnywhereAllTriggeredAbility extends TriggeredAb
this.filter.add(targetController.getOwnerPredicate()); this.filter.add(targetController.getOwnerPredicate());
StringBuilder sb = new StringBuilder("Whenever "); StringBuilder sb = new StringBuilder("Whenever ");
sb.append(filter.getMessage()); sb.append(filter.getMessage());
sb.append(filter.getMessage().startsWith("one or more") ? " are" : "is"); sb.append(filter.getMessage().startsWith("one or more") ? " are" : " is");
sb.append(" put into "); sb.append(" put into ");
switch (targetController) { switch (targetController) {
case OPPONENT: case OPPONENT:

View file

@ -18,18 +18,30 @@ import mage.util.CardUtil;
*/ */
public class FabricateAbility extends EntersBattlefieldTriggeredAbility { public class FabricateAbility extends EntersBattlefieldTriggeredAbility {
private final int value;
public FabricateAbility(int value) { public FabricateAbility(int value) {
super(new FabricateEffect(value), false, true); super(new FabricateEffect(value), false, true);
this.value = value;
} }
public FabricateAbility(final FabricateAbility ability) { public FabricateAbility(final FabricateAbility ability) {
super(ability); super(ability);
this.value = ability.value;
} }
@Override @Override
public FabricateAbility copy() { public FabricateAbility copy() {
return new FabricateAbility(this); return new FabricateAbility(this);
} }
@Override
public String getRule() {
return "Fabricate " + value + " <i>(When this creature enters the battlefield, put "
+ CardUtil.numberToText(value, "a") + " +1/+1 counter" + (value > 1 ? "s" : "")
+ " on it or create " + CardUtil.numberToText(value, "a")
+ " 1/1 colorless Servo artifact creature token" + (value > 1 ? "s" : "") + ".)</i>";
}
} }
class FabricateEffect extends OneShotEffect { class FabricateEffect extends OneShotEffect {
@ -39,9 +51,6 @@ class FabricateEffect extends OneShotEffect {
FabricateEffect(int value) { FabricateEffect(int value) {
super(Outcome.Benefit); super(Outcome.Benefit);
this.value = value; this.value = value;
this.staticText = "Fabricate " + value
+ " <i>(When this creature enters the battlefield, put " + CardUtil.numberToText(value, "a") + " +1/+1 counter" + (value > 1 ? "s" : "")
+ " on it or create " + CardUtil.numberToText(value, "a") + " 1/1 colorless Servo artifact creature token" + (value > 1 ? "s" : "") + ".)</i>";
} }
FabricateEffect(final FabricateEffect effect) { FabricateEffect(final FabricateEffect effect) {
@ -68,8 +77,7 @@ class FabricateEffect extends OneShotEffect {
source, source,
game)) { game)) {
((Card) sourceObject).addCounters(CounterType.P1P1.createInstance(value), source.getControllerId(), source, game); ((Card) sourceObject).addCounters(CounterType.P1P1.createInstance(value), source.getControllerId(), source, game);
} } else {
else {
new ServoToken().putOntoBattlefield(value, game, source, controller.getId()); new ServoToken().putOntoBattlefield(value, game, source, controller.getId());
} }
return true; return true;

View file

@ -13,7 +13,7 @@ public enum PhaseStep {
DECLARE_BLOCKERS("Declare Blockers", 6, "declare blockers step", "DB"), DECLARE_BLOCKERS("Declare Blockers", 6, "declare blockers step", "DB"),
FIRST_COMBAT_DAMAGE("First Combat Damage", 7, "first combat damage", "FCD"), FIRST_COMBAT_DAMAGE("First Combat Damage", 7, "first combat damage", "FCD"),
COMBAT_DAMAGE("Combat Damage", 8, "combat damage step", "CD"), COMBAT_DAMAGE("Combat Damage", 8, "combat damage step", "CD"),
END_COMBAT("End Combat", 9, "end combat step", "EC"), END_COMBAT("End Combat", 9, "end of combat step", "EC"),
POSTCOMBAT_MAIN("Postcombat Main", 10, "postcombat main step", "M2"), POSTCOMBAT_MAIN("Postcombat Main", 10, "postcombat main step", "M2"),
END_TURN("End Turn", 11, "end turn step", "ET"), END_TURN("End Turn", 11, "end turn step", "ET"),
CLEANUP("Cleanup", 12, "cleanup step", "CL"); CLEANUP("Cleanup", 12, "cleanup step", "CL");