many the text fixes

This commit is contained in:
xenohedron 2023-11-19 21:37:37 -05:00
parent 8f89253b58
commit 1816c8ad73
99 changed files with 208 additions and 227 deletions

View file

@ -10,7 +10,6 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.Zone;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
/** /**
@ -24,7 +23,8 @@ public final class AbsoluteGrace extends CardImpl {
// All creatures have protection from black. // All creatures have protection from black.
Ability ability = ProtectionAbility.from(ObjectColor.BLACK); Ability ability = ProtectionAbility.from(ObjectColor.BLACK);
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(ability, Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES, false))); this.addAbility(new SimpleStaticAbility(new GainAbilityAllEffect(ability, Duration.WhileOnBattlefield,
StaticFilters.FILTER_PERMANENT_ALL_CREATURES, false)));
} }
private AbsoluteGrace(final AbsoluteGrace card) { private AbsoluteGrace(final AbsoluteGrace card) {

View file

@ -1,4 +1,3 @@
package mage.cards.a; package mage.cards.a;
import java.util.UUID; import java.util.UUID;
@ -11,7 +10,6 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.Zone;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
/** /**
@ -24,7 +22,8 @@ public final class AbsoluteLaw extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}");
Ability ability = ProtectionAbility.from(ObjectColor.RED); Ability ability = ProtectionAbility.from(ObjectColor.RED);
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(ability, Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES, false))); this.addAbility(new SimpleStaticAbility(new GainAbilityAllEffect(ability, Duration.WhileOnBattlefield,
StaticFilters.FILTER_PERMANENT_ALL_CREATURES, false)));
} }
private AbsoluteLaw(final AbsoluteLaw card) { private AbsoluteLaw(final AbsoluteLaw card) {

View file

@ -1,28 +1,26 @@
package mage.cards.a; package mage.cards.a;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.ExileSourceCost; import mage.abilities.costs.common.ExileSourceCost;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.cards.*; import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.Zone; import mage.constants.Zone;
import mage.game.Game; import mage.game.Game;
import mage.game.GameState;
import mage.players.PlayerList; import java.util.UUID;
/** /**
*
* @author azra1l <algee2005@gmail.com> * @author azra1l <algee2005@gmail.com>
*/ */
public final class AeonEngine extends CardImpl { public final class AeonEngine extends CardImpl {
public AeonEngine(UUID ownerId, CardSetInfo setInfo) { public AeonEngine(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{5}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{5}");
// Aeon Engine enters the battlefield tapped. // Aeon Engine enters the battlefield tapped.
this.addAbility(new EntersBattlefieldTappedAbility()); this.addAbility(new EntersBattlefieldTappedAbility());
@ -44,9 +42,10 @@ public final class AeonEngine extends CardImpl {
} }
class AeonEngineEffect extends OneShotEffect { class AeonEngineEffect extends OneShotEffect {
public AeonEngineEffect() {
AeonEngineEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
this.staticText = "Reverse the game turn order."; this.staticText = "Reverse the game's turn order.";
} }
private AeonEngineEffect(final AeonEngineEffect effect) { private AeonEngineEffect(final AeonEngineEffect effect) {

View file

@ -35,7 +35,7 @@ public final class ArcaneSpyglass extends CardImpl {
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new GenericManaCost(2)); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new GenericManaCost(2));
ability.addCost(new TapSourceCost()); ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter))); ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter)));
ability.addEffect(new AddCountersSourceEffect(CounterType.CHARGE.createInstance())); ability.addEffect(new AddCountersSourceEffect(CounterType.CHARGE.createInstance()).concatBy("and"));
this.addAbility(ability); this.addAbility(ability);
// Remove three charge counters from Arcane Spyglass: Draw a card. // Remove three charge counters from Arcane Spyglass: Draw a card.

View file

@ -1,4 +1,3 @@
package mage.cards.a; package mage.cards.a;
import java.util.UUID; import java.util.UUID;
@ -20,10 +19,9 @@ public final class Attunement extends CardImpl {
public Attunement(UUID ownerId, CardSetInfo setInfo) { public Attunement(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{U}"); super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{U}");
// Return Attunement to its owner's hand: Draw three cards, then discard four cards. // Return Attunement to its owner's hand: Draw three cards, then discard four cards.
SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(3), new ReturnToHandFromBattlefieldSourceCost()); SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(3), new ReturnToHandFromBattlefieldSourceCost());
ability.addEffect(new DiscardControllerEffect(4)); ability.addEffect(new DiscardControllerEffect(4).concatBy(", then"));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,4 +1,3 @@
package mage.cards.a; package mage.cards.a;
import java.util.UUID; import java.util.UUID;
@ -31,7 +30,8 @@ public final class AvacynianMissionaries extends CardImpl {
// At the beginning of your end step, if Avacynian Missionaries is equipped, transform it. // At the beginning of your end step, if Avacynian Missionaries is equipped, transform it.
this.addAbility(new TransformAbility()); this.addAbility(new TransformAbility());
this.addAbility(new BeginningOfEndStepTriggeredAbility(Zone.BATTLEFIELD, new TransformSourceEffect(), TargetController.YOU, EquippedSourceCondition.instance, false)); this.addAbility(new BeginningOfEndStepTriggeredAbility(Zone.BATTLEFIELD, new TransformSourceEffect().setText("transform it"),
TargetController.YOU, EquippedSourceCondition.instance, false));
} }

View file

@ -1,4 +1,3 @@
package mage.cards.b; package mage.cards.b;
import mage.MageInt; import mage.MageInt;
@ -12,8 +11,7 @@ import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.filter.common.FilterControlledPermanent; import mage.filter.StaticFilters;
import mage.target.common.TargetControlledPermanent;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import java.util.UUID; import java.util.UUID;
@ -34,7 +32,7 @@ public final class BarrinMasterWizard extends CardImpl {
//{2}, Sacrifice a permanent: Return target creature to its owner's hand. //{2}, Sacrifice a permanent: Return target creature to its owner's hand.
SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), new ManaCostsImpl<>("{2}")); SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), new ManaCostsImpl<>("{2}"));
ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledPermanent()))); ability.addCost(new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_PERMANENT_SHORT_TEXT));
ability.addTarget(new TargetCreaturePermanent()); ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -38,7 +38,7 @@ public final class BlitzwingAdaptiveAssailant extends CardImpl {
// At the beginning of combat on your turn, choose flying or indestructible at random. Blitzwing gains that ability until end of turn. // At the beginning of combat on your turn, choose flying or indestructible at random. Blitzwing gains that ability until end of turn.
this.addAbility(new BeginningOfCombatTriggeredAbility( this.addAbility(new BeginningOfCombatTriggeredAbility(
new BlitzwingCruelTormentorEffect(), TargetController.YOU, false new BlitzwingAdaptiveAssailantEffect(), TargetController.YOU, false
)); ));
// Whenever Blitzwing deals combat damage to a player, convert it. // Whenever Blitzwing deals combat damage to a player, convert it.

View file

@ -1,4 +1,3 @@
package mage.cards.b; package mage.cards.b;
import java.util.UUID; import java.util.UUID;
@ -20,10 +19,11 @@ public final class Breach extends CardImpl {
public Breach(UUID ownerId, CardSetInfo setInfo) { public Breach(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{B}"); super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{B}");
// Target creature gets +2/+0 and gains fear until end of turn. // Target creature gets +2/+0 and gains fear until end of turn.
this.getSpellAbility().addEffect(new BoostTargetEffect(2, 0, Duration.EndOfTurn)); this.getSpellAbility().addEffect(new BoostTargetEffect(2, 0, Duration.EndOfTurn)
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(FearAbility.getInstance(), Duration.EndOfTurn)); .setText("target creature gets +2/+0"));
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(FearAbility.getInstance(), Duration.EndOfTurn)
.setText("and gains fear until end of turn"));
this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addTarget(new TargetCreaturePermanent());
} }

View file

@ -1,4 +1,3 @@
package mage.cards.b; package mage.cards.b;
import java.util.UUID; import java.util.UUID;
@ -41,7 +40,8 @@ public final class Burnout extends CardImpl {
// Draw a card at the beginning of the next turn's upkeep. // Draw a card at the beginning of the next turn's upkeep.
this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect( this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(
new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse), false)); new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse), false)
.concatBy("<br>"));
} }
private Burnout(final Burnout card) { private Burnout(final Burnout card) {
@ -56,7 +56,7 @@ public final class Burnout extends CardImpl {
class BurnoutCounterTargetEffect extends OneShotEffect { class BurnoutCounterTargetEffect extends OneShotEffect {
public BurnoutCounterTargetEffect() { BurnoutCounterTargetEffect() {
super(Outcome.Detriment); super(Outcome.Detriment);
} }

View file

@ -18,7 +18,7 @@ import java.util.UUID;
public final class CavalcadeOfCalamity extends CardImpl { public final class CavalcadeOfCalamity extends CardImpl {
private static final FilterCreaturePermanent filter private static final FilterCreaturePermanent filter
= new FilterCreaturePermanent("creaure you control with power 1 or less"); = new FilterCreaturePermanent("creature you control with power 1 or less");
static { static {
filter.add(TargetController.YOU.getControllerPredicate()); filter.add(TargetController.YOU.getControllerPredicate());

View file

@ -32,7 +32,7 @@ public final class Cindervines extends CardImpl {
// Whenever an opponent casts a noncreature spell, Cindervines deals 1 damage to that player. // Whenever an opponent casts a noncreature spell, Cindervines deals 1 damage to that player.
this.addAbility(new SpellCastOpponentTriggeredAbility( this.addAbility(new SpellCastOpponentTriggeredAbility(
Zone.BATTLEFIELD, new DamageTargetEffect(1, true, "that player"), Zone.BATTLEFIELD, new DamageTargetEffect(1, true, "that player"),
StaticFilters.FILTER_SPELL_NON_CREATURE, false, SetTargetPointer.PLAYER StaticFilters.FILTER_SPELL_A_NON_CREATURE, false, SetTargetPointer.PLAYER
)); ));
// {1}, Sacrifice Cindervines: Destroy target artifact or enchantment. Cindervines deals 2 damage to that permanent's controller. // {1}, Sacrifice Cindervines: Destroy target artifact or enchantment. Cindervines deals 2 damage to that permanent's controller.

View file

@ -1,4 +1,3 @@
package mage.cards.c; package mage.cards.c;
import java.util.UUID; import java.util.UUID;
@ -11,7 +10,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.target.common.TargetControlledPermanent; import mage.filter.StaticFilters;
/** /**
* *
@ -24,7 +23,7 @@ public final class ClawsOfGix extends CardImpl {
//{1}, Sacrifice a permanent: You gain 1 life. //{1}, Sacrifice a permanent: You gain 1 life.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(1), new GenericManaCost(1)); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(1), new GenericManaCost(1));
ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent())); ability.addCost(new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_PERMANENT_SHORT_TEXT));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -65,7 +65,7 @@ class CliffsideRescuerEffect extends OneShotEffect {
CliffsideRescuerEffect() { CliffsideRescuerEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
staticText = "Target permanent you control gets protection from each opponent until end of turn."; staticText = "Target permanent you control gains protection from each of your opponents until end of turn.";
} }
private CliffsideRescuerEffect(final CliffsideRescuerEffect effect) { private CliffsideRescuerEffect(final CliffsideRescuerEffect effect) {

View file

@ -1,4 +1,3 @@
package mage.cards.c; package mage.cards.c;
import java.util.UUID; import java.util.UUID;
@ -7,7 +6,7 @@ import mage.abilities.keyword.UndauntedAbility;
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.common.FilterNonlandPermanent; import mage.filter.StaticFilters;
/** /**
* *
@ -21,7 +20,7 @@ public final class CoastalBreach extends CardImpl {
// Undaunted // Undaunted
this.addAbility(new UndauntedAbility()); this.addAbility(new UndauntedAbility());
// Return all nonland permanents to their owners' hands. // Return all nonland permanents to their owners' hands.
this.getSpellAbility().addEffect(new ReturnToHandFromBattlefieldAllEffect(new FilterNonlandPermanent())); this.getSpellAbility().addEffect(new ReturnToHandFromBattlefieldAllEffect(StaticFilters.FILTER_PERMANENTS_NON_LAND));
} }
private CoastalBreach(final CoastalBreach card) { private CoastalBreach(final CoastalBreach card) {

View file

@ -2,7 +2,6 @@ package mage.cards.c;
import java.util.UUID; import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.TriggeredAbilityImpl; import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
@ -86,7 +85,7 @@ class ContestedWarZoneAbility extends TriggeredAbilityImpl {
@Override @Override
public String getRule() { public String getRule() {
return "Whenever a creature deals combat damage to you, that creature's controller gains control of {this}"; return "Whenever a creature deals combat damage to you, that creature's controller gains control of {this}.";
} }
} }

View file

@ -24,12 +24,14 @@ import java.util.UUID;
*/ */
public final class ConversionChamber extends CardImpl { public final class ConversionChamber extends CardImpl {
private static final FilterArtifactCard filter = new FilterArtifactCard("artifact card from a graveyard");
public ConversionChamber(UUID ownerId, CardSetInfo setInfo) { public ConversionChamber(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
// {2}, {T}: Exile target artifact card from a graveyard. Put a charge counter on Conversion Chamber. // {2}, {T}: Exile target artifact card from a graveyard. Put a charge counter on Conversion Chamber.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(), new GenericManaCost(2)); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(), new GenericManaCost(2));
ability.addEffect(new AddCountersSourceEffect(CounterType.CHARGE.createInstance())); ability.addEffect(new AddCountersSourceEffect(CounterType.CHARGE.createInstance()));
ability.addTarget(new TargetCardInGraveyard(new FilterArtifactCard("artifact card from a graveyard"))); ability.addTarget(new TargetCardInGraveyard(filter));
ability.addCost(new TapSourceCost()); ability.addCost(new TapSourceCost());
this.addAbility(ability); this.addAbility(ability);
// {2}, {T}, Remove a charge counter from Conversion Chamber: Create a 3/3 colorless Golem artifact creature token. // {2}, {T}, Remove a charge counter from Conversion Chamber: Create a 3/3 colorless Golem artifact creature token.

View file

@ -34,7 +34,7 @@ public final class CorpseCur extends CardImpl {
this.power = new MageInt(2); this.power = new MageInt(2);
this.toughness = new MageInt(2); this.toughness = new MageInt(2);
this.addAbility(InfectAbility.getInstance()); this.addAbility(InfectAbility.getInstance());
Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect()); Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect(), true);
ability.addTarget(new TargetCardInYourGraveyard(filter)); ability.addTarget(new TargetCardInYourGraveyard(filter));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -56,7 +56,7 @@ class CurseOfBountyEffect extends OneShotEffect {
CurseOfBountyEffect() { CurseOfBountyEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
this.staticText = "untap all nonland permanents you control. Each opponent attacking that player does the same."; this.staticText = "untap all nonland permanents you control. Each opponent attacking that player untaps all nonland permanents they control.";
} }
private CurseOfBountyEffect(final CurseOfBountyEffect effect) { private CurseOfBountyEffect(final CurseOfBountyEffect effect) {

View file

@ -3,7 +3,6 @@ package mage.cards.c;
import java.util.UUID; import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl; import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect;
@ -17,7 +16,6 @@ import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.game.Game; import mage.game.Game;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.game.stack.Spell; import mage.game.stack.Spell;
import mage.players.Player; import mage.players.Player;
@ -59,14 +57,10 @@ public final class CurseOfVengeance extends CardImpl {
class CurseOfVengeanceTriggeredAbility extends TriggeredAbilityImpl { class CurseOfVengeanceTriggeredAbility extends TriggeredAbilityImpl {
public CurseOfVengeanceTriggeredAbility() { CurseOfVengeanceTriggeredAbility() {
super(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.SPITE.createInstance(), Outcome.Detriment), false); super(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.SPITE.createInstance(), Outcome.Detriment), false);
} }
public CurseOfVengeanceTriggeredAbility(Effect effect, boolean optional, String text) {
super(Zone.BATTLEFIELD, effect, optional);
}
private CurseOfVengeanceTriggeredAbility(final CurseOfVengeanceTriggeredAbility ability) { private CurseOfVengeanceTriggeredAbility(final CurseOfVengeanceTriggeredAbility ability) {
super(ability); super(ability);
} }
@ -92,7 +86,7 @@ class CurseOfVengeanceTriggeredAbility extends TriggeredAbilityImpl {
@Override @Override
public String getRule() { public String getRule() {
return "Whenever enchanted player casts a spell, put a spite counter on {this}"; return "Whenever enchanted player casts a spell, put a spite counter on {this}.";
} }
@Override @Override
@ -103,8 +97,9 @@ class CurseOfVengeanceTriggeredAbility extends TriggeredAbilityImpl {
class CurseOfVengeancePlayerLosesTriggeredAbility extends TriggeredAbilityImpl { class CurseOfVengeancePlayerLosesTriggeredAbility extends TriggeredAbilityImpl {
public CurseOfVengeancePlayerLosesTriggeredAbility() { CurseOfVengeancePlayerLosesTriggeredAbility() {
super(Zone.BATTLEFIELD, new CurseOfVengeanceDrawLifeEffect(), false); super(Zone.BATTLEFIELD, new CurseOfVengeanceDrawLifeEffect(), false);
setTriggerPhrase("When enchanted player loses the game, ");
} }
private CurseOfVengeancePlayerLosesTriggeredAbility(final CurseOfVengeancePlayerLosesTriggeredAbility ability) { private CurseOfVengeancePlayerLosesTriggeredAbility(final CurseOfVengeancePlayerLosesTriggeredAbility ability) {
@ -127,16 +122,11 @@ class CurseOfVengeancePlayerLosesTriggeredAbility extends TriggeredAbilityImpl {
return sourceObject != null && sourceObject.isAttachedTo(event.getPlayerId()); return sourceObject != null && sourceObject.isAttachedTo(event.getPlayerId());
} }
@Override
public String getRule() {
return "When enchanted player loses the game, you gain X life and "
+ "draw X cards, where X is the number of spite counters on {this}";
}
} }
class CurseOfVengeanceDrawLifeEffect extends OneShotEffect { class CurseOfVengeanceDrawLifeEffect extends OneShotEffect {
public CurseOfVengeanceDrawLifeEffect() { CurseOfVengeanceDrawLifeEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
staticText = "you gain X life and draw X cards, where X is the " staticText = "you gain X life and draw X cards, where X is the "
+ "number of spite counters on {this}"; + "number of spite counters on {this}";

View file

@ -1,4 +1,3 @@
package mage.cards.d; package mage.cards.d;
import java.util.UUID; import java.util.UUID;
@ -23,7 +22,7 @@ import mage.filter.predicate.mageobject.AbilityPredicate;
*/ */
public final class DauthiWarlord extends CardImpl { public final class DauthiWarlord extends CardImpl {
private static final FilterPermanent filter = new FilterCreaturePermanent("creatures with shadow"); private static final FilterPermanent filter = new FilterCreaturePermanent("creatures with shadow on the battlefield");
static{ static{
filter.add(new AbilityPredicate(ShadowAbility.class)); filter.add(new AbilityPredicate(ShadowAbility.class));

View file

@ -20,9 +20,10 @@ public final class DenyTheWitch extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}{U}{B}"); super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}{U}{B}");
// Counter target spell, activated ability, or triggered ability. Its controller loses life equal to the number of creatures you control. // Counter target spell, activated ability, or triggered ability. Its controller loses life equal to the number of creatures you control.
this.getSpellAbility().addEffect(new CounterTargetEffect()); this.getSpellAbility().addEffect(new CounterTargetEffect().setText("Counter target spell, activated ability, or triggered ability"));
this.getSpellAbility().addTarget(new TargetStackObject()); this.getSpellAbility().addTarget(new TargetStackObject());
this.getSpellAbility().addEffect(new LoseLifeTargetControllerEffect(CreaturesYouControlCount.instance)); this.getSpellAbility().addEffect(new LoseLifeTargetControllerEffect(CreaturesYouControlCount.instance)
.setText("Its controller loses life equal to the number of creatures you control"));
this.getSpellAbility().addHint(CreaturesYouControlHint.instance); this.getSpellAbility().addHint(CreaturesYouControlHint.instance);
} }

View file

@ -42,7 +42,7 @@ public final class EldraziObligator extends CardImpl {
DoIfCostPaid costPaidEffect = new DoIfCostPaid(new GainControlTargetEffect(Duration.EndOfTurn), new ManaCostsImpl<>("{1}{C}")); DoIfCostPaid costPaidEffect = new DoIfCostPaid(new GainControlTargetEffect(Duration.EndOfTurn), new ManaCostsImpl<>("{1}{C}"));
Effect untapEffect = new UntapTargetEffect(); Effect untapEffect = new UntapTargetEffect();
untapEffect.setText("untap that creature,"); untapEffect.setText(", untap that creature,");
Effect hasteEffect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn); Effect hasteEffect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn);
hasteEffect.setText("and it gains haste until end of turn"); hasteEffect.setText("and it gains haste until end of turn");
costPaidEffect.addEffect(untapEffect); costPaidEffect.addEffect(untapEffect);

View file

@ -1,4 +1,3 @@
package mage.cards.e; package mage.cards.e;
import java.util.UUID; import java.util.UUID;
@ -36,7 +35,8 @@ public final class Enervate extends CardImpl {
this.getSpellAbility().addTarget(new TargetPermanent(filter)); this.getSpellAbility().addTarget(new TargetPermanent(filter));
// Draw a card at the beginning of the next turn's upkeep. // Draw a card at the beginning of the next turn's upkeep.
this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false)); this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(
new DrawCardSourceControllerEffect(1)), false).concatBy("<br>"));
} }
private Enervate(final Enervate card) { private Enervate(final Enervate card) {

View file

@ -48,7 +48,7 @@ class EssenceFluxEffect extends OneShotEffect {
EssenceFluxEffect() { EssenceFluxEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
staticText = "return that card to the battlefield under its owner's control. If it's a Spirit, put a +1/+1 counter on it"; staticText = ", then return that card to the battlefield under its owner's control. If it's a Spirit, put a +1/+1 counter on it";
} }
private EssenceFluxEffect(final EssenceFluxEffect effect) { private EssenceFluxEffect(final EssenceFluxEffect effect) {

View file

@ -53,9 +53,9 @@ public final class FatalGrudge extends CardImpl {
class FatalGrudgeEffect extends OneShotEffect { class FatalGrudgeEffect extends OneShotEffect {
public FatalGrudgeEffect() { FatalGrudgeEffect() {
super(Outcome.Sacrifice); super(Outcome.Sacrifice);
this.staticText = "each opponent chooses a permanent they control that shares a type with the sacrificed permanent and sacrifices it"; this.staticText = "each opponent chooses a permanent they control that shares a card type with the sacrificed permanent and sacrifices it";
} }
private FatalGrudgeEffect(final FatalGrudgeEffect effect) { private FatalGrudgeEffect(final FatalGrudgeEffect effect) {

View file

@ -43,7 +43,7 @@ public final class FearsomeTemper extends CardImpl {
Ability grantedAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CantBeBlockedByTargetSourceEffect(Duration.EndOfTurn), new ManaCostsImpl<>("{2}{R}")); Ability grantedAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CantBeBlockedByTargetSourceEffect(Duration.EndOfTurn), new ManaCostsImpl<>("{2}{R}"));
grantedAbility.addTarget(new TargetCreaturePermanent()); grantedAbility.addTarget(new TargetCreaturePermanent());
effect = new GainAbilityAttachedEffect(grantedAbility, AttachmentType.AURA, Duration.WhileOnBattlefield); effect = new GainAbilityAttachedEffect(grantedAbility, AttachmentType.AURA, Duration.WhileOnBattlefield);
effect.setText("and has \"{2}{R}: Target creature can't block this creature this turn"); effect.setText("and has \"{2}{R}: Target creature can't block this creature this turn.\"");
ability.addEffect(effect); ability.addEffect(effect);
this.addAbility(ability); this.addAbility(ability);

View file

@ -27,7 +27,8 @@ public final class FeralInstinct extends CardImpl {
// Draw a card at the beginning of the next turn's upkeep. // Draw a card at the beginning of the next turn's upkeep.
this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect( this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(
new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse), false)); new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse), false)
.concatBy("<br>"));
} }
private FeralInstinct(final FeralInstinct card) { private FeralInstinct(final FeralInstinct card) {

View file

@ -27,7 +27,8 @@ public final class FeveredStrength extends CardImpl {
// Draw a card at the beginning of the next turn's upkeep. // Draw a card at the beginning of the next turn's upkeep.
this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect( this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(
new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse), false)); new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse), false)
.concatBy("<br>"));
} }
private FeveredStrength(final FeveredStrength card) { private FeveredStrength(final FeveredStrength card) {

View file

@ -28,12 +28,13 @@ public final class Foreshadow extends CardImpl {
// Choose a card name, then target opponent puts the top card of their library into their graveyard. If that card has the chosen name, you draw a card. // Choose a card name, then target opponent puts the top card of their library into their graveyard. If that card has the chosen name, you draw a card.
this.getSpellAbility().addEffect(new ChooseACardNameEffect(ChooseACardNameEffect.TypeOfName.ALL)); this.getSpellAbility().addEffect(new ChooseACardNameEffect(ChooseACardNameEffect.TypeOfName.ALL));
this.getSpellAbility().addEffect(new ForeshadowEffect().concatBy("then")); this.getSpellAbility().addEffect(new ForeshadowEffect().concatBy(", then"));
this.getSpellAbility().addTarget(new TargetOpponent()); this.getSpellAbility().addTarget(new TargetOpponent());
// Draw a card at the beginning of the next turn's upkeep. // Draw a card at the beginning of the next turn's upkeep.
this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect( this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(
new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false)); new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false)
.concatBy("<br>"));
} }
private Foreshadow(final Foreshadow card) { private Foreshadow(final Foreshadow card) {
@ -50,7 +51,7 @@ class ForeshadowEffect extends OneShotEffect {
ForeshadowEffect() { ForeshadowEffect() {
super(Outcome.DrawCard); super(Outcome.DrawCard);
this.staticText = "target opponent mills a card. If that card has the chosen name, you draw a card"; this.staticText = "target opponent mills a card. If a card with the chosen name was milled this way, you draw a card";
} }
private ForeshadowEffect(final ForeshadowEffect effect) { private ForeshadowEffect(final ForeshadowEffect effect) {

View file

@ -27,7 +27,7 @@ public final class Frostling extends CardImpl {
this.power = new MageInt(1); this.power = new MageInt(1);
this.toughness = new MageInt(1); this.toughness = new MageInt(1);
// Sacrifice Frostling: Frostling deals 1 damage to target creature. // Sacrifice Frostling: Frostling deals 1 damage to target creature.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new SacrificeSourceCost()); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1, "it"), new SacrificeSourceCost());
ability.addTarget(new TargetCreaturePermanent()); ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -35,7 +35,7 @@ public final class GhostLitRaider extends CardImpl {
ability.addTarget(new TargetCreaturePermanent()); ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability); this.addAbility(ability);
// Channel - {3}{R}, Discard Ghost-Lit Raider: Ghost-Lit Raider deals 4 damage to target creature. // Channel - {3}{R}, Discard Ghost-Lit Raider: Ghost-Lit Raider deals 4 damage to target creature.
Ability ability2 = new ChannelAbility("{3}{R}", new DamageTargetEffect(4)); Ability ability2 = new ChannelAbility("{3}{R}", new DamageTargetEffect(4, "it"));
ability2.addTarget(new TargetCreaturePermanent()); ability2.addTarget(new TargetCreaturePermanent());
this.addAbility(ability2); this.addAbility(ability2);
} }

View file

@ -85,7 +85,7 @@ class GiftOfDoomEffect extends OneShotEffect {
GiftOfDoomEffect() { GiftOfDoomEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
staticText = "attach it to a creature"; staticText = "you may attach it to a creature";
} }
private GiftOfDoomEffect(final GiftOfDoomEffect effect) { private GiftOfDoomEffect(final GiftOfDoomEffect effect) {

View file

@ -1,4 +1,3 @@
package mage.cards.g; package mage.cards.g;
import java.util.UUID; import java.util.UUID;
@ -25,7 +24,8 @@ public final class GloriousEnd extends CardImpl {
// At the beginning of your next end step, you lose the game. // At the beginning of your next end step, you lose the game.
getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect( getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(
new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new LoseGameSourceControllerEffect(), TargetController.YOU))); new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new LoseGameSourceControllerEffect(), TargetController.YOU))
.concatBy("<br>"));
} }
private GloriousEnd(final GloriousEnd card) { private GloriousEnd(final GloriousEnd card) {

View file

@ -1,4 +1,3 @@
package mage.cards.g; package mage.cards.g;
import java.util.UUID; import java.util.UUID;
@ -25,12 +24,11 @@ import mage.target.TargetPermanent;
*/ */
public final class GoblinWizard extends CardImpl { public final class GoblinWizard extends CardImpl {
private static final FilterPermanentCard filter = new FilterPermanentCard("Goblin"); private static final FilterPermanentCard filterCard = new FilterPermanentCard("a Goblin permanent card");
private static final FilterPermanent goblinPermanent = new FilterPermanent("Goblin"); private static final FilterPermanent filter2 = new FilterPermanent(SubType.GOBLIN, "Goblin");
static { static {
filter.add(SubType.GOBLIN.getPredicate()); filterCard.add(SubType.GOBLIN.getPredicate());
goblinPermanent.add(SubType.GOBLIN.getPredicate());
} }
public GoblinWizard(UUID ownerId, CardSetInfo setInfo) { public GoblinWizard(UUID ownerId, CardSetInfo setInfo) {
@ -45,13 +43,13 @@ public final class GoblinWizard extends CardImpl {
// {tap}: You may put a Goblin permanent card from your hand onto the battlefield. // {tap}: You may put a Goblin permanent card from your hand onto the battlefield.
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD,
new PutCardFromHandOntoBattlefieldEffect(filter), new PutCardFromHandOntoBattlefieldEffect(filterCard),
new TapSourceCost())); new TapSourceCost()));
// {R}: Target Goblin gains protection from white until end of turn. // {R}: Target Goblin gains protection from white until end of turn.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
new GainAbilityTargetEffect(ProtectionAbility.from(ObjectColor.WHITE), Duration.EndOfTurn), new ManaCostsImpl<>("{R}")); new GainAbilityTargetEffect(ProtectionAbility.from(ObjectColor.WHITE), Duration.EndOfTurn), new ManaCostsImpl<>("{R}"));
Target target = new TargetPermanent(goblinPermanent); Target target = new TargetPermanent(filter2);
ability.addTarget(target); ability.addTarget(target);
this.addAbility(ability); this.addAbility(ability);

View file

@ -1,4 +1,3 @@
package mage.cards.g; package mage.cards.g;
import java.util.UUID; import java.util.UUID;
@ -35,7 +34,8 @@ public final class GorillaWarCry extends CardImpl {
this.getSpellAbility().addEffect(effect); this.getSpellAbility().addEffect(effect);
// Draw a card at the beginning of the next turn's upkeep. // Draw a card at the beginning of the next turn's upkeep.
this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false)); this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(
new DrawCardSourceControllerEffect(1)), false).concatBy("<br>"));
} }
private GorillaWarCry(final GorillaWarCry card) { private GorillaWarCry(final GorillaWarCry card) {

View file

@ -15,6 +15,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.*;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.ColorPredicate; import mage.filter.predicate.mageobject.ColorPredicate;
@ -32,11 +33,12 @@ import java.util.UUID;
public final class GrandArchitect extends CardImpl { public final class GrandArchitect extends CardImpl {
private static final FilterCreaturePermanent boostFilter = new FilterCreaturePermanent("blue creatures"); private static final FilterCreaturePermanent boostFilter = new FilterCreaturePermanent("blue creatures");
private static final FilterCreaturePermanent targetFilter = new FilterCreaturePermanent("artifact creature"); private static final FilterControlledCreaturePermanent tapFilter = new FilterControlledCreaturePermanent("untapped blue creature you control");
static { static {
boostFilter.add(new ColorPredicate(ObjectColor.BLUE)); boostFilter.add(new ColorPredicate(ObjectColor.BLUE));
targetFilter.add(CardType.ARTIFACT.getPredicate()); tapFilter.add(new ColorPredicate(ObjectColor.BLUE));
tapFilter.add(TappedPredicate.UNTAPPED);
} }
public GrandArchitect(UUID ownerId, CardSetInfo setInfo) { public GrandArchitect(UUID ownerId, CardSetInfo setInfo) {
@ -52,14 +54,11 @@ public final class GrandArchitect extends CardImpl {
// {U}: Target artifact creature becomes blue until end of turn. // {U}: Target artifact creature becomes blue until end of turn.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GrandArchitectEffect(), new ManaCostsImpl<>("{U}")); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GrandArchitectEffect(), new ManaCostsImpl<>("{U}"));
ability.addTarget(new TargetPermanent(targetFilter)); ability.addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_CREATURE));
this.addAbility(ability); this.addAbility(ability);
// Tap an untapped blue creature you control: Add {C}{C}. Spend this mana only to cast artifact spells or activate abilities of artifacts. // Tap an untapped blue creature you control: Add {C}{C}. Spend this mana only to cast artifact spells or activate abilities of artifacts.
FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped blue creature"); this.addAbility(new GrandArchitectManaAbility(tapFilter));
filter.add(new ColorPredicate(ObjectColor.BLUE));
filter.add(TappedPredicate.UNTAPPED);
this.addAbility(new GrandArchitectManaAbility(filter));
} }
private GrandArchitect(final GrandArchitect card) { private GrandArchitect(final GrandArchitect card) {
@ -75,7 +74,7 @@ public final class GrandArchitect extends CardImpl {
class GrandArchitectEffect extends ContinuousEffectImpl { class GrandArchitectEffect extends ContinuousEffectImpl {
public GrandArchitectEffect() { GrandArchitectEffect() {
super(Duration.EndOfTurn, Layer.ColorChangingEffects_5, SubLayer.NA, Outcome.Detriment); super(Duration.EndOfTurn, Layer.ColorChangingEffects_5, SubLayer.NA, Outcome.Detriment);
staticText = "Target artifact creature becomes blue until end of turn"; staticText = "Target artifact creature becomes blue until end of turn";
} }
@ -129,7 +128,7 @@ class GrandArchitectManaAbility extends ActivatedManaAbilityImpl {
class GrandArchitectConditionalMana extends ConditionalMana { class GrandArchitectConditionalMana extends ConditionalMana {
public GrandArchitectConditionalMana() { GrandArchitectConditionalMana() {
super(Mana.ColorlessMana(2)); super(Mana.ColorlessMana(2));
staticText = "Spend this mana only to cast artifact spells or activate abilities of artifacts"; staticText = "Spend this mana only to cast artifact spells or activate abilities of artifacts";
addCondition(new GrandArchitectManaCondition()); addCondition(new GrandArchitectManaCondition());

View file

@ -1,4 +1,3 @@
package mage.cards.g; package mage.cards.g;
import mage.MageInt; import mage.MageInt;
@ -13,7 +12,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.filter.StaticFilters; import mage.filter.common.FilterArtifactCard;
import mage.target.common.TargetCardInGraveyard; import mage.target.common.TargetCardInGraveyard;
import java.util.UUID; import java.util.UUID;
@ -23,6 +22,8 @@ import java.util.UUID;
*/ */
public final class GraveRobbers extends CardImpl { public final class GraveRobbers extends CardImpl {
private static final FilterArtifactCard filter = new FilterArtifactCard("artifact card from a graveyard");
public GraveRobbers(UUID ownerId, CardSetInfo setInfo) { public GraveRobbers(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{B}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{B}");
this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.HUMAN);
@ -33,7 +34,7 @@ public final class GraveRobbers extends CardImpl {
// {B}, {tap}: Exile target artifact card from a graveyard. You gain 2 life. // {B}, {tap}: Exile target artifact card from a graveyard. You gain 2 life.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(), new ManaCostsImpl<>("{B}")); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(), new ManaCostsImpl<>("{B}"));
ability.addCost(new TapSourceCost()); ability.addCost(new TapSourceCost());
ability.addTarget(new TargetCardInGraveyard(StaticFilters.FILTER_CARD_ARTIFACT_FROM_YOUR_GRAVEYARD)); ability.addTarget(new TargetCardInGraveyard(filter));
ability.addEffect(new GainLifeEffect(2)); ability.addEffect(new GainLifeEffect(2));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,4 +1,3 @@
package mage.cards.g; package mage.cards.g;
import java.util.UUID; import java.util.UUID;
@ -26,7 +25,8 @@ public final class Gravebind extends CardImpl {
getSpellAbility().addTarget(new TargetCreaturePermanent()); getSpellAbility().addTarget(new TargetCreaturePermanent());
// Draw a card at the beginning of the next turn's upkeep. // Draw a card at the beginning of the next turn's upkeep.
this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false)); this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(
new DrawCardSourceControllerEffect(1)), false).concatBy("<br>"));
} }
private Gravebind(final Gravebind card) { private Gravebind(final Gravebind card) {

View file

@ -1,4 +1,3 @@
package mage.cards.g; package mage.cards.g;
import java.util.UUID; import java.util.UUID;
@ -23,7 +22,7 @@ public final class GripOfTheRoil extends CardImpl {
// Tap target creature. It doesn't untap during its controller's next untap step. // Tap target creature. It doesn't untap during its controller's next untap step.
this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addTarget(new TargetCreaturePermanent());
this.getSpellAbility().addEffect(new TapTargetEffect()); this.getSpellAbility().addEffect(new TapTargetEffect());
this.getSpellAbility().addEffect(new DontUntapInControllersNextUntapStepTargetEffect()); this.getSpellAbility().addEffect(new DontUntapInControllersNextUntapStepTargetEffect("It"));
// Draw a card. // Draw a card.
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("<br>")); this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("<br>"));

View file

@ -46,14 +46,14 @@ public final class GruulSpellbreaker extends CardImpl {
new GainAbilityControllerEffect( new GainAbilityControllerEffect(
HexproofAbility.getInstance(), HexproofAbility.getInstance(),
Duration.WhileOnBattlefield Duration.WhileOnBattlefield
), MyTurnCondition.instance, "As long as it's your turn, you and" ), MyTurnCondition.instance, "As long as it's your turn, you"
) )
); );
ability.addEffect(new ConditionalContinuousEffect( ability.addEffect(new ConditionalContinuousEffect(
new GainAbilitySourceEffect( new GainAbilitySourceEffect(
HexproofAbility.getInstance(), HexproofAbility.getInstance(),
Duration.WhileOnBattlefield Duration.WhileOnBattlefield
), MyTurnCondition.instance, "{this} have hexproof." ), MyTurnCondition.instance, "and {this} have hexproof."
)); ));
ability.addHint(MyTurnHint.instance); ability.addHint(MyTurnHint.instance);
this.addAbility(ability); this.addAbility(ability);

View file

@ -50,7 +50,7 @@ class HarvestHandReturnTransformedEffect extends OneShotEffect {
HarvestHandReturnTransformedEffect() { HarvestHandReturnTransformedEffect() {
super(Outcome.PutCardInPlay); super(Outcome.PutCardInPlay);
this.staticText = "Return {this} to the battlefield transformed under your control"; this.staticText = "return it to the battlefield transformed under your control";
} }
private HarvestHandReturnTransformedEffect(final HarvestHandReturnTransformedEffect effect) { private HarvestHandReturnTransformedEffect(final HarvestHandReturnTransformedEffect effect) {

View file

@ -13,7 +13,6 @@ import mage.target.common.TargetLandPermanent;
import java.util.UUID; import java.util.UUID;
/** /**
* @author fireshoes * @author fireshoes
*/ */
@ -27,7 +26,6 @@ public final class Icequake extends CardImpl {
this.getSpellAbility().addEffect(new IcequakeEffect()); this.getSpellAbility().addEffect(new IcequakeEffect());
this.getSpellAbility().addTarget(new TargetLandPermanent()); this.getSpellAbility().addTarget(new TargetLandPermanent());
} }
private Icequake(final Icequake card) { private Icequake(final Icequake card) {
@ -42,9 +40,9 @@ public final class Icequake extends CardImpl {
class IcequakeEffect extends OneShotEffect { class IcequakeEffect extends OneShotEffect {
public IcequakeEffect() { IcequakeEffect() {
super(Outcome.Damage); super(Outcome.Damage);
this.staticText = "Destroy target land.<br>If that land was a snow land, {this} deals 1 damage to that land's controller."; this.staticText = "Destroy target land. If that land was a snow land, {this} deals 1 damage to that land's controller.";
} }
private IcequakeEffect(final IcequakeEffect effect) { private IcequakeEffect(final IcequakeEffect effect) {

View file

@ -5,7 +5,6 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.TokenPredicate; import mage.filter.predicate.permanent.TokenPredicate;
@ -16,11 +15,17 @@ import java.util.UUID;
*/ */
public final class IncandescentAria extends CardImpl { public final class IncandescentAria extends CardImpl {
private static final FilterPermanent filter = new FilterCreaturePermanent("nontoken creature");
static {
filter.add(TokenPredicate.FALSE);
}
public IncandescentAria(UUID ownerId, CardSetInfo setInfo) { public IncandescentAria(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{R}{G}{W}"); super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{R}{G}{W}");
// Incandescent Aria deals 3 damage to each nontoken creature. // Incandescent Aria deals 3 damage to each nontoken creature.
this.getSpellAbility().addEffect(new DamageAllEffect(3, StaticFilters.FILTER_CREATURE_NON_TOKEN)); this.getSpellAbility().addEffect(new DamageAllEffect(3, filter));
} }
private IncandescentAria(final IncandescentAria card) { private IncandescentAria(final IncandescentAria card) {

View file

@ -56,9 +56,9 @@ public final class InsultInjury extends SplitCard {
class InsultDoubleDamageEffect extends ReplacementEffectImpl { class InsultDoubleDamageEffect extends ReplacementEffectImpl {
public InsultDoubleDamageEffect() { InsultDoubleDamageEffect() {
super(Duration.EndOfTurn, Outcome.Damage); super(Duration.EndOfTurn, Outcome.Damage);
staticText = "If a source you control would deal damage this turn, it deals double that damage to that permanent or player instead."; staticText = "If a source you control would deal damage this turn, it deals double that damage instead.";
} }
private InsultDoubleDamageEffect(final InsultDoubleDamageEffect effect) { private InsultDoubleDamageEffect(final InsultDoubleDamageEffect effect) {

View file

@ -19,7 +19,7 @@ import java.util.UUID;
public final class KjeldoranFrostbeast extends CardImpl { public final class KjeldoranFrostbeast extends CardImpl {
private static final FilterPermanent filter private static final FilterPermanent filter
= new FilterCreaturePermanent("creatures blocking or blocked by it"); = new FilterCreaturePermanent("creatures blocking or blocked by {this}");
static { static {
filter.add(BlockingOrBlockedBySourcePredicate.EITHER); filter.add(BlockingOrBlockedBySourcePredicate.EITHER);

View file

@ -43,7 +43,7 @@ public final class KuonOgreAscendant extends CardImpl {
this.addAbility(new BeginningOfEndStepTriggeredAbility( this.addAbility(new BeginningOfEndStepTriggeredAbility(
Zone.BATTLEFIELD, Zone.BATTLEFIELD,
new FlipSourceEffect(new KuonsEssenceToken()), new FlipSourceEffect(new KuonsEssenceToken()),
TargetController.ANY, TargetController.NEXT,
KuonOgreAscendantCondition.instance, false)); KuonOgreAscendantCondition.instance, false));
} }

View file

@ -37,7 +37,7 @@ public final class MaelstromDjinn extends CardImpl {
// When Maelstrom Djinn is turned face up, put two time counters on it and it gains vanishing. // When Maelstrom Djinn is turned face up, put two time counters on it and it gains vanishing.
Ability ability = new TurnedFaceUpSourceTriggeredAbility( Ability ability = new TurnedFaceUpSourceTriggeredAbility(
new AddCountersSourceEffect(CounterType.TIME.createInstance(2)) new AddCountersSourceEffect(CounterType.TIME.createInstance(2)).setText("put two time counters on it")
); );
ability.addEffect(new GainAbilitySourceEffect( ability.addEffect(new GainAbilitySourceEffect(
new VanishingAbility(0), Duration.WhileOnBattlefield new VanishingAbility(0), Duration.WhileOnBattlefield

View file

@ -1,4 +1,3 @@
package mage.cards.m; package mage.cards.m;
import java.util.UUID; import java.util.UUID;
@ -24,7 +23,7 @@ public final class Metrognome extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}");
// When a spell or ability an opponent controls causes you to discard Metrognome, create four 1/1 colorless Gnome artifact creature tokens. // When a spell or ability an opponent controls causes you to discard Metrognome, create four 1/1 colorless Gnome artifact creature tokens.
this.addAbility(new DiscardedByOpponentTriggeredAbility(new CreateTokenEffect(new GnomeToken(), 4))); this.addAbility(new DiscardedByOpponentTriggeredAbility(new CreateTokenEffect(new GnomeToken(), 4), true));
// {4}, {tap}: Create a 1/1 colorless Gnome artifact creature token. // {4}, {tap}: Create a 1/1 colorless Gnome artifact creature token.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new GnomeToken()), new ManaCostsImpl<>("{4}")); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new GnomeToken()), new ManaCostsImpl<>("{4}"));

View file

@ -24,6 +24,8 @@ import mage.target.common.TargetCardInGraveyard;
*/ */
public final class MyrWelder extends CardImpl { public final class MyrWelder extends CardImpl {
private static final FilterArtifactCard filter = new FilterArtifactCard("artifact card from a graveyard");
public MyrWelder(UUID ownerId, CardSetInfo setInfo) { public MyrWelder(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}");
this.subtype.add(SubType.MYR); this.subtype.add(SubType.MYR);
@ -32,7 +34,7 @@ public final class MyrWelder extends CardImpl {
// Imprint - {tap}: Exile target artifact card from a graveyard // Imprint - {tap}: Exile target artifact card from a graveyard
SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new MyrWelderEffect(), new TapSourceCost()); SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new MyrWelderEffect(), new TapSourceCost());
ability.addTarget(new TargetCardInGraveyard(new FilterArtifactCard("artifact card from a graveyard"))); ability.addTarget(new TargetCardInGraveyard(filter));
this.addAbility(ability.setAbilityWord(AbilityWord.IMPRINT)); this.addAbility(ability.setAbilityWord(AbilityWord.IMPRINT));
// Myr Welder has all activated abilities of all cards exiled with it // Myr Welder has all activated abilities of all cards exiled with it
@ -53,7 +55,7 @@ public final class MyrWelder extends CardImpl {
class MyrWelderEffect extends OneShotEffect { class MyrWelderEffect extends OneShotEffect {
public MyrWelderEffect() { MyrWelderEffect() {
super(Outcome.Exile); super(Outcome.Exile);
staticText = "Exile target artifact card from a graveyard"; staticText = "Exile target artifact card from a graveyard";
} }

View file

@ -1,4 +1,3 @@
package mage.cards.n; package mage.cards.n;
import java.util.UUID; import java.util.UUID;
@ -49,9 +48,10 @@ public final class NissasJudgment extends CardImpl {
class NissasJudgmentEffect extends OneShotEffect { class NissasJudgmentEffect extends OneShotEffect {
public NissasJudgmentEffect() { NissasJudgmentEffect() {
super(Outcome.Damage); super(Outcome.Damage);
this.staticText = "Choose up to one target creature an opponent controls. Each creature you control with a +1/+1 counter on it deals damage equal to its power to that creature"; this.staticText = "Choose up to one target creature an opponent controls. Each creature you control with a +1/+1 counter on it deals damage equal to its power to that creature";
this.concatPrefix = "<br>";
} }
private NissasJudgmentEffect(final NissasJudgmentEffect effect) { private NissasJudgmentEffect(final NissasJudgmentEffect effect) {

View file

@ -30,7 +30,7 @@ import mage.target.common.TargetControlledCreaturePermanent;
*/ */
public final class ONaginata extends CardImpl { public final class ONaginata extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("creature you control with 3 or more power "); private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("creature with power 3 or greater");
static { static {
filter.add(new PowerPredicate(ComparisonType.MORE_THAN, 2)); filter.add(new PowerPredicate(ComparisonType.MORE_THAN, 2));

View file

@ -29,7 +29,7 @@ public final class OngoingInvestigation extends CardImpl {
this.addAbility(new DealCombatDamageControlledTriggeredAbility(new InvestigateEffect())); this.addAbility(new DealCombatDamageControlledTriggeredAbility(new InvestigateEffect()));
// {1}{G}, Exile a creature card from your graveyard: Investigate. You gain 2 life. // {1}{G}, Exile a creature card from your graveyard: Investigate. You gain 2 life.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new InvestigateEffect(), new ManaCostsImpl<>("{1}{G}")); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new InvestigateEffect().setText("investigate"), new ManaCostsImpl<>("{1}{G}"));
ability.addCost(new ExileFromGraveCost(new TargetCardInYourGraveyard(new FilterCreatureCard("a creature card from your graveyard")))); ability.addCost(new ExileFromGraveCost(new TargetCardInYourGraveyard(new FilterCreatureCard("a creature card from your graveyard"))));
ability.addEffect(new GainLifeEffect(2)); ability.addEffect(new GainLifeEffect(2));
this.addAbility(ability); this.addAbility(ability);

View file

@ -30,7 +30,8 @@ public final class Portent extends CardImpl {
this.getSpellAbility().addEffect(new PortentEffect()); this.getSpellAbility().addEffect(new PortentEffect());
this.getSpellAbility().addTarget(new TargetPlayer()); this.getSpellAbility().addTarget(new TargetPlayer());
// Draw a card at the beginning of the next turn's upkeep. // Draw a card at the beginning of the next turn's upkeep.
this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false)); this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(
new DrawCardSourceControllerEffect(1)), false).concatBy("<br>"));
} }
private Portent(final Portent card) { private Portent(final Portent card) {

View file

@ -1,8 +1,6 @@
package mage.cards.p; package mage.cards.p;
import java.util.UUID; import java.util.UUID;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.UntapTargetEffect; import mage.abilities.effects.common.UntapTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.common.continuous.GainControlTargetEffect; import mage.abilities.effects.common.continuous.GainControlTargetEffect;
@ -31,7 +29,7 @@ public final class PressIntoService extends CardImpl {
this.getSpellAbility().addTarget(new TargetCreaturePermanent()); // First target is used by Support this.getSpellAbility().addTarget(new TargetCreaturePermanent()); // First target is used by Support
this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.EndOfTurn) this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.EndOfTurn)
.setText("Gain control of target creature until end of turn") .setText("Gain control of target creature until end of turn").concatBy("<br>")
.setTargetPointer(new SecondTargetPointer()) .setTargetPointer(new SecondTargetPointer())
); );
this.getSpellAbility().addEffect(new UntapTargetEffect() this.getSpellAbility().addEffect(new UntapTargetEffect()

View file

@ -1,4 +1,3 @@
package mage.cards.q; package mage.cards.q;
import java.util.UUID; import java.util.UUID;
@ -31,7 +30,8 @@ public final class Quagnoth extends CardImpl {
this.addAbility(ShroudAbility.getInstance()); this.addAbility(ShroudAbility.getInstance());
// When a spell or ability an opponent controls causes you to discard Quagnoth, return it to your hand. // When a spell or ability an opponent controls causes you to discard Quagnoth, return it to your hand.
this.addAbility(new DiscardedByOpponentTriggeredAbility(new ReturnToHandSourceEffect())); this.addAbility(new DiscardedByOpponentTriggeredAbility(new ReturnToHandSourceEffect()
.setText("return it to your hand"), true));
} }
private Quagnoth(final Quagnoth card) { private Quagnoth(final Quagnoth card) {

View file

@ -1,4 +1,3 @@
package mage.cards.q; package mage.cards.q;
import java.util.UUID; import java.util.UUID;
@ -27,7 +26,8 @@ public final class QuicksilverGargantuan extends CardImpl {
this.toughness = new MageInt(7); this.toughness = new MageInt(7);
Ability ability = new EntersBattlefieldAbility(new CopyPermanentEffect(new QuicksilverGargantuanCopyApplier()), Ability ability = new EntersBattlefieldAbility(new CopyPermanentEffect(new QuicksilverGargantuanCopyApplier()),
"You may have {this} enter the battlefield as a copy of any creature on the battlefield, except it's 7/7"); true, null, null,
"as a copy of any creature on the battlefield, except it's 7/7");
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -48,9 +48,9 @@ public final class RagsRiches extends SplitCard {
class RichesEffect extends OneShotEffect { class RichesEffect extends OneShotEffect {
public RichesEffect() { RichesEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
this.staticText = "Each opponent chooses a creature they control. You gain control of each of those creatures."; this.staticText = "Each opponent chooses a creature they control. You gain control of those creatures.";
} }
private RichesEffect(final RichesEffect effect) { private RichesEffect(final RichesEffect effect) {

View file

@ -34,7 +34,7 @@ public final class RhetCropSpearmaster extends CardImpl {
effect.setText("it gets +1/+0"); effect.setText("it gets +1/+0");
BecomesExertSourceTriggeredAbility ability = new BecomesExertSourceTriggeredAbility(effect); BecomesExertSourceTriggeredAbility ability = new BecomesExertSourceTriggeredAbility(effect);
effect = new GainAbilitySourceEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn); effect = new GainAbilitySourceEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn);
effect.setText(" and gains first strike until end of turn"); effect.setText("and gains first strike until end of turn");
ability.addEffect(effect); ability.addEffect(effect);
this.addAbility(new ExertAbility(ability)); this.addAbility(new ExertAbility(ability));
} }

View file

@ -1,4 +1,3 @@
package mage.cards.r; package mage.cards.r;
import java.util.UUID; import java.util.UUID;
@ -33,8 +32,7 @@ public final class RiptideSurvivor extends CardImpl {
this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{U}{U}"))); this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{U}{U}")));
// When Riptide Survivor is turned face up, discard two cards, then draw three cards. // When Riptide Survivor is turned face up, discard two cards, then draw three cards.
Ability ability = new TurnedFaceUpSourceTriggeredAbility(new DiscardControllerEffect(2)); Ability ability = new TurnedFaceUpSourceTriggeredAbility(new DiscardControllerEffect(2));
Effect effect = new DrawCardSourceControllerEffect(3); Effect effect = new DrawCardSourceControllerEffect(3).concatBy(", then");
effect.setText("then draw three cards");
ability.addEffect(effect); ability.addEffect(effect);
this.addAbility(ability); this.addAbility(ability);
} }
@ -48,4 +46,3 @@ public final class RiptideSurvivor extends CardImpl {
return new RiptideSurvivor(this); return new RiptideSurvivor(this);
} }
} }

View file

@ -32,7 +32,7 @@ public final class RocketLauncher extends CardImpl {
new GenericManaCost(2), RocketLauncherCondition.instance); new GenericManaCost(2), RocketLauncherCondition.instance);
ability.addTarget(new TargetAnyTarget()); ability.addTarget(new TargetAnyTarget());
ability.addEffect(new CreateDelayedTriggeredAbilityEffect( ability.addEffect(new CreateDelayedTriggeredAbilityEffect(
new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new DestroySourceEffect(true)) new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new DestroySourceEffect())
).setText("destroy {this} at the beginning of the next end step")); ).setText("destroy {this} at the beginning of the next end step"));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -24,7 +24,7 @@ public final class SavageSmash extends CardImpl {
this.getSpellAbility().addEffect(new BoostTargetEffect(2, 2, Duration.EndOfTurn)); this.getSpellAbility().addEffect(new BoostTargetEffect(2, 2, Duration.EndOfTurn));
this.getSpellAbility().addEffect( this.getSpellAbility().addEffect(
new FightTargetsEffect().setText("It fights target creature you don't control." + new FightTargetsEffect().setText("It fights target creature you don't control." +
"<i>(Each deals damage equal to its power to the other.)</i>") " <i>(Each deals damage equal to its power to the other.)</i>")
); );
this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent()); this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent());
this.getSpellAbility().addTarget(new TargetCreaturePermanent(StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL)); this.getSpellAbility().addTarget(new TargetCreaturePermanent(StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL));

View file

@ -23,7 +23,7 @@ public final class SearingBlood extends CardImpl {
this.getSpellAbility().addEffect(new DamageTargetEffect(2)); this.getSpellAbility().addEffect(new DamageTargetEffect(2));
this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect( this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(
new WhenTargetDiesDelayedTriggeredAbility( new WhenTargetDiesDelayedTriggeredAbility(
new DamageTargetEffect(3, true, "that creature's controller"), new DamageTargetEffect(3, true, "the creature's controller"),
SetTargetPointer.PLAYER SetTargetPointer.PLAYER
) )
)); ));

View file

@ -1,4 +1,3 @@
package mage.cards.s; package mage.cards.s;
import java.util.UUID; import java.util.UUID;
@ -40,7 +39,7 @@ public final class ShadowGuildmage extends CardImpl {
// {R}, {tap}: Shadow Guildmage deals 1 damage to any target and 1 damage to you. // {R}, {tap}: Shadow Guildmage deals 1 damage to any target and 1 damage to you.
ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new ManaCostsImpl<>("{R}")); ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new ManaCostsImpl<>("{R}"));
ability.addCost(new TapSourceCost()); ability.addCost(new TapSourceCost());
ability.addEffect(new DamageControllerEffect(1)); ability.addEffect(new DamageControllerEffect(1).setText("and 1 damage to you"));
ability.addTarget(new TargetAnyTarget()); ability.addTarget(new TargetAnyTarget());
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -34,7 +34,7 @@ public final class SirenOfTheSilentSong extends CardImpl {
// <i>Inspired</i> &mdash; Whenever Siren of the Silent Song becomes untapped, each opponent discards a card, then puts the top card of their library into their graveyard. // <i>Inspired</i> &mdash; Whenever Siren of the Silent Song becomes untapped, each opponent discards a card, then puts the top card of their library into their graveyard.
Ability ability = new InspiredAbility(new DiscardEachPlayerEffect(TargetController.OPPONENT)); Ability ability = new InspiredAbility(new DiscardEachPlayerEffect(TargetController.OPPONENT));
Effect effect = new MillCardsEachPlayerEffect(1, TargetController.OPPONENT); Effect effect = new MillCardsEachPlayerEffect(1, TargetController.OPPONENT);
effect.setText(", then mills a card"); effect.setText(", then each opponent mills a card");
ability.addEffect(effect); ability.addEffect(effect);
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,7 +1,6 @@
package mage.cards.s; package mage.cards.s;
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.BoostEquippedEffect; import mage.abilities.effects.common.continuous.BoostEquippedEffect;
@ -13,9 +12,10 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AttachmentType; import mage.constants.AttachmentType;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.Zone; import mage.constants.SubType;
import java.util.UUID;
/** /**
* *
@ -27,12 +27,14 @@ public final class Skinwing extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}"); super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}");
this.subtype.add(SubType.EQUIPMENT); this.subtype.add(SubType.EQUIPMENT);
// Living Weapom // Living weapon
this.addAbility(new LivingWeaponAbility()); this.addAbility(new LivingWeaponAbility());
// Equipped creature gets +2/+2 and has flying // Equipped creature gets +2/+2 and has flying
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(2, 2))); Ability ability = new SimpleStaticAbility(new BoostEquippedEffect(2, 2));
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(FlyingAbility.getInstance(), AttachmentType.EQUIPMENT))); ability.addEffect(new GainAbilityAttachedEffect(FlyingAbility.getInstance(), AttachmentType.EQUIPMENT)
.setText("and has flying"));
this.addAbility(ability);
// Equip {6} // Equip {6}
this.addAbility(new EquipAbility(Outcome.BoostCreature, new GenericManaCost(6), false)); this.addAbility(new EquipAbility(Outcome.BoostCreature, new GenericManaCost(6), false));

View file

@ -56,7 +56,7 @@ class SleeperAgentChangeControlEffect extends ContinuousEffectImpl {
public SleeperAgentChangeControlEffect() { public SleeperAgentChangeControlEffect() {
super(Duration.Custom, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); super(Duration.Custom, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl);
staticText = "target opponent gains control of {this}"; staticText = "target opponent gains control of it";
} }
private SleeperAgentChangeControlEffect(final SleeperAgentChangeControlEffect effect) { private SleeperAgentChangeControlEffect(final SleeperAgentChangeControlEffect effect) {
@ -79,5 +79,3 @@ class SleeperAgentChangeControlEffect extends ContinuousEffectImpl {
return false; return false;
} }
} }

View file

@ -1,4 +1,3 @@
package mage.cards.s; package mage.cards.s;
import java.util.UUID; import java.util.UUID;
@ -32,7 +31,8 @@ public final class Solfatara extends CardImpl {
// Draw a card at the beginning of the next turn's upkeep. // Draw a card at the beginning of the next turn's upkeep.
this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect( this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(
new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse), false)); new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse), false)
.concatBy("<br>"));
} }
private Solfatara(final Solfatara card) { private Solfatara(final Solfatara card) {
@ -47,9 +47,9 @@ public final class Solfatara extends CardImpl {
class SolfataraEffect extends ContinuousRuleModifyingEffectImpl { class SolfataraEffect extends ContinuousRuleModifyingEffectImpl {
public SolfataraEffect() { SolfataraEffect() {
super(Duration.EndOfTurn, Outcome.Detriment); super(Duration.EndOfTurn, Outcome.Detriment);
staticText = "Target player can't play land cards this turn"; staticText = "Target player can't play lands this turn";
} }
private SolfataraEffect(final SolfataraEffect effect) { private SolfataraEffect(final SolfataraEffect effect) {

View file

@ -1,4 +1,3 @@
package mage.cards.s; package mage.cards.s;
import java.util.UUID; import java.util.UUID;
@ -42,7 +41,8 @@ public final class StoneHavenOutfitter extends CardImpl {
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, filter, false))); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, filter, false)));
// Whenever an equipped creature you control dies, draw a card. // Whenever an equipped creature you control dies, draw a card.
this.addAbility(new DiesCreatureTriggeredAbility(new DrawCardSourceControllerEffect(1), false, filter)); this.addAbility(new DiesCreatureTriggeredAbility(new DrawCardSourceControllerEffect(1), false, filter)
.setTriggerPhrase("Whenever an equipped creature you control dies, "));
} }
private StoneHavenOutfitter(final StoneHavenOutfitter card) { private StoneHavenOutfitter(final StoneHavenOutfitter card) {

View file

@ -1,7 +1,8 @@
package mage.cards.s; package mage.cards.s;
import java.util.UUID; 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.BoostEquippedEffect; import mage.abilities.effects.common.continuous.BoostEquippedEffect;
@ -15,7 +16,6 @@ import mage.constants.AttachmentType;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.Zone;
/** /**
* *
@ -31,8 +31,10 @@ public final class Strandwalker extends CardImpl {
this.addAbility(new LivingWeaponAbility()); this.addAbility(new LivingWeaponAbility());
// Equipped creature gets +2/+4 and has reach. // Equipped creature gets +2/+4 and has reach.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(2, 4))); Ability ability = new SimpleStaticAbility(new BoostEquippedEffect(2, 4));
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(ReachAbility.getInstance(), AttachmentType.EQUIPMENT))); ability.addEffect(new GainAbilityAttachedEffect(ReachAbility.getInstance(), AttachmentType.EQUIPMENT)
.setText("and has reach"));
this.addAbility(ability);
// Equip {4} // Equip {4}
this.addAbility(new EquipAbility(Outcome.BoostCreature, new GenericManaCost(4), false)); this.addAbility(new EquipAbility(Outcome.BoostCreature, new GenericManaCost(4), false));

View file

@ -52,7 +52,7 @@ class SummaryJudgementEffect extends OneShotEffect {
super(Outcome.Benefit); super(Outcome.Benefit);
staticText = "{this} deals 3 damage to target tapped creature." + staticText = "{this} deals 3 damage to target tapped creature." +
"<br><i>Addendum</i> &mdash; If you cast this spell during your main phase, " + "<br><i>Addendum</i> &mdash; If you cast this spell during your main phase, " +
"it deals 5 damage."; "it deals 5 damage instead.";
} }
private SummaryJudgementEffect(final SummaryJudgementEffect effect) { private SummaryJudgementEffect(final SummaryJudgementEffect effect) {

View file

@ -32,7 +32,7 @@ public final class SurviveTheNight extends CardImpl {
this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addTarget(new TargetCreaturePermanent());
// Investigate. // Investigate.
this.getSpellAbility().addEffect(new InvestigateEffect()); this.getSpellAbility().addEffect(new InvestigateEffect().concatBy("<br>"));
} }
private SurviveTheNight(final SurviveTheNight card) { private SurviveTheNight(final SurviveTheNight card) {

View file

@ -1,4 +1,3 @@
package mage.cards.s; package mage.cards.s;
import java.util.UUID; import java.util.UUID;
@ -22,7 +21,7 @@ public final class SymbolOfUnsummoning extends CardImpl {
this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addTarget(new TargetCreaturePermanent());
this.getSpellAbility().addEffect(new ReturnToHandTargetEffect()); this.getSpellAbility().addEffect(new ReturnToHandTargetEffect());
// Draw a card. // Draw a card.
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("<br>"));
} }
private SymbolOfUnsummoning(final SymbolOfUnsummoning card) { private SymbolOfUnsummoning(final SymbolOfUnsummoning card) {

View file

@ -30,7 +30,7 @@ import mage.watchers.common.AttackedThisTurnWatcher;
public final class TaigamOjutaiMaster extends CardImpl { public final class TaigamOjutaiMaster extends CardImpl {
private static final String effectText = "Whenever you cast an instant or sorcery spell from your hand, if {this} attacked this turn, that spell gains rebound."; private static final String effectText = "Whenever you cast an instant or sorcery spell from your hand, if {this} attacked this turn, that spell gains rebound.";
private static final FilterSpell filter = new FilterSpell("Instant, Sorcery, and Dragon spells you control"); private static final FilterSpell filter = new FilterSpell("Instant, sorcery, and Dragon spells you control");
static { static {
filter.add( filter.add(

View file

@ -36,7 +36,7 @@ public final class TheHauntOfHightower extends CardImpl {
// Whenever The Haunt of Hightower attacks, defending player discards a card. // Whenever The Haunt of Hightower attacks, defending player discards a card.
this.addAbility(new AttacksTriggeredAbility( this.addAbility(new AttacksTriggeredAbility(
new DiscardTargetEffect(1), false, new DiscardTargetEffect(1), false,
"Whenever {this} attacks, defending player discards a card", SetTargetPointer.PLAYER "Whenever {this} attacks, defending player discards a card.", SetTargetPointer.PLAYER
)); ));
// Whenever a card is put into an opponent's graveyard from anywhere, put a +1/+1 counter on The Haunt of Hightower. // Whenever a card is put into an opponent's graveyard from anywhere, put a +1/+1 counter on The Haunt of Hightower.

View file

@ -34,7 +34,7 @@ public final class ThornThallid extends CardImpl {
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new AddCountersSourceEffect(CounterType.SPORE.createInstance()), TargetController.YOU, false)); this.addAbility(new BeginningOfUpkeepTriggeredAbility(new AddCountersSourceEffect(CounterType.SPORE.createInstance()), TargetController.YOU, false));
// Remove three spore counters from Thorn Thallid: Thorn Thallid deals 1 damage to any target. // Remove three spore counters from Thorn Thallid: Thorn Thallid deals 1 damage to any target.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
new DamageTargetEffect(1), new DamageTargetEffect(1, "it"),
new RemoveCountersSourceCost(CounterType.SPORE.createInstance(3))); new RemoveCountersSourceCost(CounterType.SPORE.createInstance(3)));
ability.addTarget(new TargetAnyTarget()); ability.addTarget(new TargetAnyTarget());
this.addAbility(ability); this.addAbility(ability);

View file

@ -22,7 +22,8 @@ public final class TidyConclusion extends CardImpl {
// Destroy target creature. You gain 1 life for each artifact you control. // Destroy target creature. You gain 1 life for each artifact you control.
this.getSpellAbility().addEffect(new DestroyTargetEffect()); this.getSpellAbility().addEffect(new DestroyTargetEffect());
this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addTarget(new TargetCreaturePermanent());
this.getSpellAbility().addEffect(new GainLifeEffect(ArtifactYouControlCount.instance)); this.getSpellAbility().addEffect(new GainLifeEffect(ArtifactYouControlCount.instance)
.setText("you gain 1 life for each artifact you control"));
this.getSpellAbility().addHint(ArtifactYouControlHint.instance); this.getSpellAbility().addHint(ArtifactYouControlHint.instance);
} }

View file

@ -47,7 +47,7 @@ public final class TinderWall extends CardImpl {
this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.RedMana(2), new SacrificeSourceCost())); this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.RedMana(2), new SacrificeSourceCost()));
// {R}, Sacrifice Tinder Wall: Tinder Wall deals 2 damage to target creature it's blocking. // {R}, Sacrifice Tinder Wall: Tinder Wall deals 2 damage to target creature it's blocking.
Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(2), new ManaCostsImpl<>("{R}")); Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(2, "it"), new ManaCostsImpl<>("{R}"));
ability.addCost(new SacrificeSourceCost()); ability.addCost(new SacrificeSourceCost());
ability.addTarget(new TargetPermanent(filter)); ability.addTarget(new TargetPermanent(filter));
this.addAbility(ability); this.addAbility(ability);

View file

@ -27,7 +27,7 @@ public final class TumbleMagnet extends CardImpl {
this.addAbility(new EntersBattlefieldAbility( this.addAbility(new EntersBattlefieldAbility(
new AddCountersSourceEffect(CounterType.CHARGE.createInstance(3)), new AddCountersSourceEffect(CounterType.CHARGE.createInstance(3)),
"{this} enters the battlefield with three charge counters on it" "with three charge counters on it"
)); ));
Ability ability = new SimpleActivatedAbility( Ability ability = new SimpleActivatedAbility(

View file

@ -23,7 +23,7 @@ public final class UndercitysEmbrace extends CardImpl {
// Target opponent sacrifices a creature. If you control a creature with power 4 or greater, you gain 4 life. // Target opponent sacrifices a creature. If you control a creature with power 4 or greater, you gain 4 life.
this.getSpellAbility().addEffect(new SacrificeEffect( this.getSpellAbility().addEffect(new SacrificeEffect(
StaticFilters.FILTER_PERMANENT_A_CREATURE, 1, "target player" StaticFilters.FILTER_PERMANENT_A_CREATURE, 1, "target opponent"
)); ));
this.getSpellAbility().addTarget(new TargetOpponent()); this.getSpellAbility().addTarget(new TargetOpponent());
this.getSpellAbility().addEffect(new ConditionalOneShotEffect( this.getSpellAbility().addEffect(new ConditionalOneShotEffect(

View file

@ -1,4 +1,3 @@
package mage.cards.u; package mage.cards.u;
import java.util.UUID; import java.util.UUID;
@ -23,7 +22,8 @@ public final class UnityOfPurpose extends CardImpl {
// Untap each creature you control with a +1/+1 counter on it. // Untap each creature you control with a +1/+1 counter on it.
this.getSpellAbility().addEffect(new UntapAllControllerEffect( this.getSpellAbility().addEffect(new UntapAllControllerEffect(
StaticFilters.FILTER_EACH_CONTROLLED_CREATURE_P1P1, "Untap each creature you control with a +1/+1 counter on it")); StaticFilters.FILTER_EACH_CONTROLLED_CREATURE_P1P1, "Untap each creature you control with a +1/+1 counter on it")
.concatBy("<br>"));
} }
private UnityOfPurpose(final UnityOfPurpose card) { private UnityOfPurpose(final UnityOfPurpose card) {

View file

@ -1,5 +1,3 @@
package mage.cards.u; package mage.cards.u;
import java.util.UUID; import java.util.UUID;
@ -21,8 +19,10 @@ public final class UnnaturalPredation extends CardImpl {
public UnnaturalPredation (UUID ownerId, CardSetInfo setInfo) { public UnnaturalPredation (UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{G}"); super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{G}");
this.getSpellAbility().addEffect(new BoostTargetEffect(1, 1, Duration.EndOfTurn)); this.getSpellAbility().addEffect(new BoostTargetEffect(1, 1, Duration.EndOfTurn)
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn)); .setText("Target creature gets +1/+1"));
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn)
.setText("and gains trample until end of turn"));
this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addTarget(new TargetCreaturePermanent());
} }

View file

@ -33,12 +33,11 @@ public final class VeiledApparition extends CardImpl {
public VeiledApparition(UUID ownerId, CardSetInfo setInfo) { public VeiledApparition(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}");
// When an opponent casts a spell, if Veiled Apparition is an enchantment, Veiled Apparition becomes a 3/3 Illusion creature with flying and "At the beginning of your upkeep, sacrifice Veiled Apparition unless you pay {1}{U}." // When an opponent casts a spell, if Veiled Apparition is an enchantment, Veiled Apparition becomes a 3/3 Illusion creature with flying and "At the beginning of your upkeep, sacrifice Veiled Apparition unless you pay {1}{U}."
TriggeredAbility ability = new SpellCastOpponentTriggeredAbility(new BecomesCreatureSourceEffect(new VeilApparitionToken(), null, Duration.WhileOnBattlefield), TriggeredAbility ability = new SpellCastOpponentTriggeredAbility(new BecomesCreatureSourceEffect(new VeilApparitionToken(), null, Duration.WhileOnBattlefield),
filter, false); filter, false);
this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, new SourceMatchesFilterCondition(StaticFilters.FILTER_PERMANENT_ENCHANTMENT), this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, new SourceMatchesFilterCondition(StaticFilters.FILTER_PERMANENT_ENCHANTMENT),
"When an opponent casts a spell, if {this} is an enchantment, {this} becomes a 3/3 Illusion creature with flying and \"At the beginning of your upkeep, sacrifice Veiled Apparition unless you pay {1}{U}.")); "When an opponent casts a spell, if {this} is an enchantment, {this} becomes a 3/3 Illusion creature with flying and \"At the beginning of your upkeep, sacrifice Veiled Apparition unless you pay {1}{U}.\""));
} }

View file

@ -30,7 +30,7 @@ public final class VeiledSentry extends CardImpl {
this.addAbility(new ConditionalInterveningIfTriggeredAbility( this.addAbility(new ConditionalInterveningIfTriggeredAbility(
new SpellCastOpponentTriggeredAbility(new VeiledSentryEffect(), false), new SpellCastOpponentTriggeredAbility(new VeiledSentryEffect(), false),
condition, "When an opponent casts a spell, if {this} is an enchantment, " + condition, "When an opponent casts a spell, if {this} is an enchantment, " +
"{this} becomes an Illusion creature with power and toughness equal to that spell's mana value." "{this} becomes an Illusion creature with power and toughness each equal to that spell's mana value."
)); ));
} }

View file

@ -52,7 +52,7 @@ class WelcomeToTheFoldEffect extends GainControlTargetEffect {
public WelcomeToTheFoldEffect(Duration duration, boolean fixedControl) { public WelcomeToTheFoldEffect(Duration duration, boolean fixedControl) {
super(duration, fixedControl); super(duration, fixedControl);
staticText = "Gain control of target creature if its toughness is 2 or less. If Welcome to the Fold's madness cost was paid, instead gain control of that creature if its toughness is X or less"; staticText = "Gain control of target creature if its toughness is 2 or less. If this spell's madness cost was paid, instead gain control of that creature if its toughness is X or less";
} }
private WelcomeToTheFoldEffect(final WelcomeToTheFoldEffect effect) { private WelcomeToTheFoldEffect(final WelcomeToTheFoldEffect effect) {

View file

@ -41,7 +41,7 @@ public final class Wiitigo extends CardImpl {
// Wiitigo enters the battlefield with six +1/+1 counters on it. // Wiitigo enters the battlefield with six +1/+1 counters on it.
this.addAbility(new EntersBattlefieldAbility( this.addAbility(new EntersBattlefieldAbility(
new AddCountersSourceEffect(CounterType.P1P1.createInstance(6)))); new AddCountersSourceEffect(CounterType.P1P1.createInstance(6)), "with six +1/+1 counters on it"));
// At the beginning of your upkeep, put a +1/+1 counter on Wiitigo if it has blocked or been blocked since your last upkeep. Otherwise, remove a +1/+1 counter from it. // At the beginning of your upkeep, put a +1/+1 counter on Wiitigo if it has blocked or been blocked since your last upkeep. Otherwise, remove a +1/+1 counter from it.
Ability triggeredAbility = new BeginningOfUpkeepTriggeredAbility( Ability triggeredAbility = new BeginningOfUpkeepTriggeredAbility(
@ -49,7 +49,7 @@ public final class Wiitigo extends CardImpl {
new AddCountersSourceEffect(CounterType.P1P1.createInstance(1)), new AddCountersSourceEffect(CounterType.P1P1.createInstance(1)),
new RemoveCounterSourceEffect(CounterType.P1P1.createInstance(1)), new RemoveCounterSourceEffect(CounterType.P1P1.createInstance(1)),
new BlockedOrBeenBlockedSinceYourLastUpkeepCondition(), new BlockedOrBeenBlockedSinceYourLastUpkeepCondition(),
"put a +1/+1 counter on enchanted creature if it blocked or been blocked since your last " "put a +1/+1 counter on {this} if it has blocked or been blocked since your last "
+ "upkeep. Otherwise, remove a +1/+1 counter from it"), + "upkeep. Otherwise, remove a +1/+1 counter from it"),
TargetController.YOU, TargetController.YOU,
false); false);

View file

@ -2330,7 +2330,7 @@ public class VerifyCardDataTest {
} }
// remove unnecessary reminder text // remove unnecessary reminder text
refText = refText.replaceAll("^\\(.+(can be paid with|ransforms from).+\\)\n", ""); refText = refText.replaceAll("^\\(.+(can be paid with|ransforms from|represents).+\\)\n", "");
// mana ability fix // mana ability fix
// Current implementation makes one Activated Ability per kind of color. // Current implementation makes one Activated Ability per kind of color.

View file

@ -226,7 +226,7 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge
} }
} }
if (replaceRuleText && triggerPhrase != null) { if (replaceRuleText && triggerPhrase != null) {
superRule = superRule.replaceFirst("^((?:you may )?sacrifice |put a [^ ]+ counter on |return )?\\{this\\}", "$1it"); superRule = superRule.replaceFirst("^((?:you may )?sacrifice |put an? [^ ]+ counter on |return |transform )?\\{this\\}", "$1it");
} }
sb.append(superRule); sb.append(superRule);
if (triggersOnceEachTurn) { if (triggersOnceEachTurn) {
@ -272,6 +272,8 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge
|| effect instanceof ReturnToHandSourceEffect || effect instanceof ReturnToHandSourceEffect
|| effect instanceof ShuffleIntoLibrarySourceEffect || effect instanceof ShuffleIntoLibrarySourceEffect
|| effect instanceof ExileSourceEffect || effect instanceof ExileSourceEffect
|| effect instanceof FlipSourceEffect
|| effect instanceof DestroySourceEffect
) ? "When " : "Whenever "); ) ? "When " : "Whenever ");
} }

View file

@ -19,7 +19,7 @@ public class BecomesTappedAttachedTriggeredAbility extends TriggeredAbilityImpl
public BecomesTappedAttachedTriggeredAbility(Effect effect, String description, boolean isOptional) { public BecomesTappedAttachedTriggeredAbility(Effect effect, String description, boolean isOptional) {
super(Zone.BATTLEFIELD, effect, isOptional); super(Zone.BATTLEFIELD, effect, isOptional);
setTriggerPhrase("Whenever " + description + " becomes tapped, "); setTriggerPhrase(getWhen() + description + " becomes tapped, ");
} }
protected BecomesTappedAttachedTriggeredAbility(final BecomesTappedAttachedTriggeredAbility ability) { protected BecomesTappedAttachedTriggeredAbility(final BecomesTappedAttachedTriggeredAbility ability) {

View file

@ -18,6 +18,7 @@ public class BlocksSourceTriggeredAbility extends TriggeredAbilityImpl {
public BlocksSourceTriggeredAbility(Effect effect, boolean optional) { public BlocksSourceTriggeredAbility(Effect effect, boolean optional) {
super(Zone.BATTLEFIELD, effect, optional); super(Zone.BATTLEFIELD, effect, optional);
setTriggerPhrase("Whenever {this} blocks, "); setTriggerPhrase("Whenever {this} blocks, ");
this.replaceRuleText = true;
} }
protected BlocksSourceTriggeredAbility(final BlocksSourceTriggeredAbility ability) { protected BlocksSourceTriggeredAbility(final BlocksSourceTriggeredAbility ability) {

View file

@ -2,9 +2,6 @@ package mage.abilities.common;
import mage.abilities.TriggeredAbilityImpl; import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.Effect; import mage.abilities.effects.Effect;
import mage.abilities.effects.common.ExileSourceEffect;
import mage.abilities.effects.common.SacrificeSourceEffect;
import mage.abilities.effects.common.ShuffleIntoLibrarySourceEffect;
import mage.constants.Zone; import mage.constants.Zone;
import mage.game.Game; import mage.game.Game;
import mage.game.events.DamagedEvent; import mage.game.events.DamagedEvent;
@ -25,10 +22,7 @@ public class DealsCombatDamageToAPlayerTriggeredAbility extends TriggeredAbility
public DealsCombatDamageToAPlayerTriggeredAbility(Effect effect, boolean optional, boolean setTargetPointer) { public DealsCombatDamageToAPlayerTriggeredAbility(Effect effect, boolean optional, boolean setTargetPointer) {
super(Zone.BATTLEFIELD, effect, optional); super(Zone.BATTLEFIELD, effect, optional);
this.setTargetPointer = setTargetPointer; this.setTargetPointer = setTargetPointer;
boolean textWhen = !optional && (effect instanceof SacrificeSourceEffect setTriggerPhrase(getWhen() + "{this} deals combat damage to a player, ");
|| effect instanceof ShuffleIntoLibrarySourceEffect
|| effect instanceof ExileSourceEffect);
setTriggerPhrase((textWhen ? "When" : "Whenever") + " {this} deals combat damage to a player, ");
this.replaceRuleText = true; this.replaceRuleText = true;
} }

View file

@ -5,7 +5,6 @@ import mage.abilities.effects.Effect;
import mage.constants.Zone; import mage.constants.Zone;
import mage.game.Game; import mage.game.Game;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.game.stack.StackObject; import mage.game.stack.StackObject;
/** /**
@ -17,9 +16,10 @@ public class DiscardedByOpponentTriggeredAbility extends TriggeredAbilityImpl {
this(effect, false); this(effect, false);
} }
public DiscardedByOpponentTriggeredAbility(Effect effect, boolean optional) { public DiscardedByOpponentTriggeredAbility(Effect effect, boolean textCardName) {
super(Zone.GRAVEYARD, effect, optional); super(Zone.GRAVEYARD, effect, false);
setTriggerPhrase("When a spell or ability an opponent controls causes you to discard this card, "); setTriggerPhrase("When a spell or ability an opponent controls causes you to discard "
+ (textCardName ? "{this}, " : "this card, "));
} }
protected DiscardedByOpponentTriggeredAbility(final DiscardedByOpponentTriggeredAbility ability) { protected DiscardedByOpponentTriggeredAbility(final DiscardedByOpponentTriggeredAbility ability) {

View file

@ -1,4 +1,3 @@
package mage.abilities.common; package mage.abilities.common;
import mage.abilities.TriggeredAbilityImpl; import mage.abilities.TriggeredAbilityImpl;
@ -18,7 +17,7 @@ public class DrawCardControllerTriggeredAbility extends TriggeredAbilityImpl {
public DrawCardControllerTriggeredAbility(Zone zone, Effect effect, boolean optional) { public DrawCardControllerTriggeredAbility(Zone zone, Effect effect, boolean optional) {
super(zone, effect, optional); super(zone, effect, optional);
setTriggerPhrase("Whenever you draw a card, "); setTriggerPhrase(getWhen() + "you draw a card, ");
} }
protected DrawCardControllerTriggeredAbility(final DrawCardControllerTriggeredAbility ability) { protected DrawCardControllerTriggeredAbility(final DrawCardControllerTriggeredAbility ability) {

View file

@ -105,6 +105,7 @@ public class Effects extends ArrayList<Effect> {
// add punctuation to very last rule. // add punctuation to very last rule.
if (lastRule != null && lastRule.length() > 3 if (lastRule != null && lastRule.length() > 3
&& !lastRule.endsWith(".") && !lastRule.endsWith(".")
&& !lastRule.endsWith("!")
&& !lastRule.endsWith("\"") && !lastRule.endsWith("\"")
&& !lastRule.endsWith(".]") && !lastRule.endsWith(".]")
&& !lastRule.startsWith("<b>LEVEL ") && !lastRule.startsWith("<b>LEVEL ")

View file

@ -1,4 +1,3 @@
package mage.abilities.effects.common; package mage.abilities.effects.common;
import mage.abilities.Ability; import mage.abilities.Ability;
@ -21,7 +20,7 @@ public class DestroySourceEffect extends OneShotEffect {
public DestroySourceEffect(boolean noRegen) { public DestroySourceEffect(boolean noRegen) {
super(Outcome.DestroyPermanent); super(Outcome.DestroyPermanent);
this.noRegen = noRegen; this.noRegen = noRegen;
staticText = "destroy {this}"; staticText = "destroy {this}" + (noRegen ? ". It can't be regenerated" : "");
} }
protected DestroySourceEffect(final DestroySourceEffect effect) { protected DestroySourceEffect(final DestroySourceEffect effect) {

View file

@ -21,7 +21,7 @@ public class FlipSourceEffect extends OneShotEffect {
public FlipSourceEffect(Token flipToken) { public FlipSourceEffect(Token flipToken) {
super(Outcome.BecomeCreature); super(Outcome.BecomeCreature);
this.flipToken = flipToken; this.flipToken = flipToken;
staticText = "flip it"; staticText = "flip {this}";
} }
protected FlipSourceEffect(final FlipSourceEffect effect) { protected FlipSourceEffect(final FlipSourceEffect effect) {

View file

@ -17,7 +17,7 @@ public class CantAttackBlockUnlessPaysSourceEffect extends PayCostToAttackBlockE
public CantAttackBlockUnlessPaysSourceEffect(Cost cost, RestrictType restrictType) { public CantAttackBlockUnlessPaysSourceEffect(Cost cost, RestrictType restrictType) {
super(Duration.WhileOnBattlefield, Outcome.Detriment, restrictType, cost); super(Duration.WhileOnBattlefield, Outcome.Detriment, restrictType, cost);
staticText = "{this} can't " + restrictType.toString() + " unless you " + (cost == null ? "" : cost.getText()) staticText = "{this} can't " + restrictType.toString() + " unless you " + (cost == null ? "" : cost.getText())
+ (restrictType == RestrictType.ATTACK ? " <i>(This cost is paid as attackers are declared.)</i>" : ""); + (restrictType == RestrictType.ATTACK ? ". <i>(This cost is paid as attackers are declared.)</i>" : "");
} }
public CantAttackBlockUnlessPaysSourceEffect(ManaCosts manaCosts, RestrictType restrictType) { public CantAttackBlockUnlessPaysSourceEffect(ManaCosts manaCosts, RestrictType restrictType) {

View file

@ -28,6 +28,7 @@ public class InspiredAbility extends TriggeredAbilityImpl {
setAbilityWord(AbilityWord.INSPIRED); setAbilityWord(AbilityWord.INSPIRED);
} }
setTriggerPhrase("Whenever {this} becomes untapped, "); setTriggerPhrase("Whenever {this} becomes untapped, ");
this.replaceRuleText = true;
} }
protected InspiredAbility(final InspiredAbility ability) { protected InspiredAbility(final InspiredAbility ability) {

View file

@ -75,7 +75,8 @@ public class ProtectionAbility extends StaticAbility {
@Override @Override
public String getRule() { public String getRule() {
return "protection from " + filter.getMessage() + (removeAuras ? "" : ". This effect doesn't remove Auras."); return (flavorWord == null ? "protection from " : CardUtil.italicizeWithEmDash(flavorWord) + "Protection from ")
+ filter.getMessage() + (removeAuras ? "" : ". This effect doesn't remove Auras.");
} }
public boolean canTarget(MageObject source, Game game) { public boolean canTarget(MageObject source, Game game) {
@ -125,7 +126,7 @@ public class ProtectionAbility extends StaticAbility {
return true; return true;
} }
private static final String getFilterText(ObjectColor color) { private static String getFilterText(ObjectColor color) {
return CardUtil.concatWithAnd( return CardUtil.concatWithAnd(
color.getColors() color.getColors()
.stream() .stream()