[MH1] various text fixes

This commit is contained in:
Evan Kranzler 2021-06-12 19:26:02 -04:00
parent df6acb697d
commit 9fd29bae06
24 changed files with 64 additions and 67 deletions

View file

@ -1,8 +1,9 @@
package mage.cards.c; package mage.cards.c;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.CantBlockAbility; import mage.abilities.common.CantBlockAbility;
import mage.abilities.keyword.CantBeBlockedSourceAbility; import mage.abilities.effects.common.combat.CantBeBlockedSourceEffect;
import mage.abilities.keyword.ChangelingAbility; import mage.abilities.keyword.ChangelingAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
@ -27,8 +28,9 @@ public final class ChangelingOutcast extends CardImpl {
this.addAbility(new ChangelingAbility()); this.addAbility(new ChangelingAbility());
// Changeling Outcast can't block and can't be blocked. // Changeling Outcast can't block and can't be blocked.
this.addAbility(new CantBlockAbility()); Ability ability = new CantBlockAbility();
this.addAbility(new CantBeBlockedSourceAbility()); ability.addEffect(new CantBeBlockedSourceEffect().setText("and can't be blocked"));
this.addAbility(ability);
} }
private ChangelingOutcast(final ChangelingOutcast card) { private ChangelingOutcast(final ChangelingOutcast card) {

View file

@ -25,7 +25,7 @@ public final class Exclude extends CardImpl {
this.getSpellAbility().addTarget(new TargetSpell(new FilterCreatureSpell())); this.getSpellAbility().addTarget(new TargetSpell(new FilterCreatureSpell()));
// Draw a card. // Draw a card.
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("<br>"));
} }
private Exclude(final Exclude card) { private Exclude(final Exclude card) {

View file

@ -28,7 +28,9 @@ public final class FirstSphereGargantua extends CardImpl {
this.toughness = new MageInt(4); this.toughness = new MageInt(4);
// When First-Sphere Gargantua enters the battlefield, you draw a card and you lose 1 life. // When First-Sphere Gargantua enters the battlefield, you draw a card and you lose 1 life.
Ability ability = new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1)); Ability ability = new EntersBattlefieldTriggeredAbility(
new DrawCardSourceControllerEffect(1).setText("you draw a card")
);
ability.addEffect(new LoseLifeSourceControllerEffect(1).concatBy("and")); ability.addEffect(new LoseLifeSourceControllerEffect(1).concatBy("and"));
this.addAbility(ability); this.addAbility(ability);

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.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterArtifactOrEnchantmentPermanent; import mage.filter.common.FilterArtifactOrEnchantmentPermanent;
import mage.filter.common.FilterOwnedCard; import mage.filter.common.FilterOwnedCard;
import mage.filter.predicate.mageobject.ColorPredicate; import mage.filter.predicate.mageobject.ColorPredicate;
@ -45,10 +44,7 @@ public final class ForceOfVigor extends CardImpl {
// Destroy up to two target artifacts and/or enchantments. // Destroy up to two target artifacts and/or enchantments.
this.getSpellAbility().addEffect(new DestroyTargetEffect()); this.getSpellAbility().addEffect(new DestroyTargetEffect());
this.getSpellAbility().addTarget(new TargetPermanent( this.getSpellAbility().addTarget(new TargetPermanent(0, 2, filter2, false));
0, 2,
StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT, false
));
} }
private ForceOfVigor(final ForceOfVigor card) { private ForceOfVigor(final ForceOfVigor card) {

View file

@ -33,7 +33,7 @@ public final class GeomancersGambit extends CardImpl {
this.getSpellAbility().addTarget(new TargetLandPermanent()); this.getSpellAbility().addTarget(new TargetLandPermanent());
// Draw a card. // Draw a card.
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("<br>"));
} }
private GeomancersGambit(final GeomancersGambit card) { private GeomancersGambit(final GeomancersGambit card) {

View file

@ -1,31 +1,32 @@
package mage.cards.i; package mage.cards.i;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.CantBlockAbility; import mage.abilities.common.CantBlockAbility;
import mage.abilities.keyword.CantBeBlockedSourceAbility; import mage.abilities.effects.common.combat.CantBeBlockedSourceEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import java.util.UUID;
/** /**
*
* @author North * @author North
*/ */
public final class InkfathomInfiltrator extends CardImpl { public final class InkfathomInfiltrator extends CardImpl {
public InkfathomInfiltrator(UUID ownerId, CardSetInfo setInfo) { public InkfathomInfiltrator(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{U/B}{U/B}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U/B}{U/B}");
this.subtype.add(SubType.MERFOLK); this.subtype.add(SubType.MERFOLK);
this.subtype.add(SubType.ROGUE); this.subtype.add(SubType.ROGUE);
this.power = new MageInt(2); this.power = new MageInt(2);
this.toughness = new MageInt(1); this.toughness = new MageInt(1);
this.addAbility(new CantBlockAbility()); Ability ability = new CantBlockAbility();
this.addAbility(new CantBeBlockedSourceAbility()); ability.addEffect(new CantBeBlockedSourceEffect().setText("and can't be blocked"));
this.addAbility(ability);
} }
private InkfathomInfiltrator(final InkfathomInfiltrator card) { private InkfathomInfiltrator(final InkfathomInfiltrator card) {

View file

@ -44,9 +44,9 @@ public final class RangerCaptainOfEos extends CardImpl {
this.toughness = new MageInt(3); this.toughness = new MageInt(3);
// When Ranger-Captain of Eos enters the battlefield, you may search your library for a creature card with converted mana cost 1 or less, reveal it, put it into your hand, then shuffle your library. // When Ranger-Captain of Eos enters the battlefield, you may search your library for a creature card with converted mana cost 1 or less, reveal it, put it into your hand, then shuffle your library.
this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInHandEffect( this.addAbility(new EntersBattlefieldTriggeredAbility(
new TargetCardInLibrary(0, 1, filter), true new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true), true
), true)); ));
// Sacrifice Ranger-Captain of Eos: Your opponents can't cast noncreature spells this turn. // Sacrifice Ranger-Captain of Eos: Your opponents can't cast noncreature spells this turn.
this.addAbility(new SimpleActivatedAbility(new RangerCaptainOfEosEffect(), new SacrificeSourceCost())); this.addAbility(new SimpleActivatedAbility(new RangerCaptainOfEosEffect(), new SacrificeSourceCost()));

View file

@ -1,7 +1,5 @@
package mage.cards.r; package mage.cards.r;
import java.util.UUID;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
@ -14,23 +12,26 @@ import mage.constants.Duration;
import mage.constants.TimingRule; import mage.constants.TimingRule;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/** /**
*
* @author jeffwadsworth * @author jeffwadsworth
*/ */
public final class RecklessCharge extends CardImpl { public final class RecklessCharge extends CardImpl {
public RecklessCharge(UUID ownerId, CardSetInfo setInfo) { public RecklessCharge(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{R}"); super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{R}");
// Target creature gets +3/+0 and gains haste until end of turn. // Target creature gets +3/+0 and gains haste until end of turn.
this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addTarget(new TargetCreaturePermanent());
this.getSpellAbility().addEffect(new BoostTargetEffect(3, 0, Duration.EndOfTurn)); this.getSpellAbility().addEffect(new BoostTargetEffect(3, 0)
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn)); .setText("target creature gets +3/+0"));
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(
HasteAbility.getInstance(), Duration.EndOfTurn
).setText("and gains haste until end of turn"));
// Flashback {2}{R} // Flashback {2}{R}
this.addAbility(new FlashbackAbility(new ManaCostsImpl("{2}{R}"), TimingRule.INSTANT)); this.addAbility(new FlashbackAbility(new ManaCostsImpl<>("{2}{R}"), TimingRule.INSTANT));
} }
private RecklessCharge(final RecklessCharge card) { private RecklessCharge(final RecklessCharge card) {

View file

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

View file

@ -40,13 +40,13 @@ public final class SoulStrikeTechnique extends CardImpl {
// Enchanted creature gets +1/+1 and has vigilance. // Enchanted creature gets +1/+1 and has vigilance.
ability = new SimpleStaticAbility(new BoostEnchantedEffect(1, 1)); ability = new SimpleStaticAbility(new BoostEnchantedEffect(1, 1));
ability.addEffect(new GainAbilityAttachedEffect( ability.addEffect(new GainAbilityAttachedEffect(
VigilanceAbility.getInstance(), AttachmentType.AURA) VigilanceAbility.getInstance(), AttachmentType.AURA
); ).setText("and has vigilance"));
this.addAbility(ability); this.addAbility(ability);
// When enchanted creature dies, manifest the top card of your library. // When enchanted creature dies, manifest the top card of your library.
this.addAbility(new DiesAttachedTriggeredAbility( this.addAbility(new DiesAttachedTriggeredAbility(
new ManifestEffect(1), "enchanted" new ManifestEffect(1), "enchanted creature"
)); ));
} }

View file

@ -50,7 +50,7 @@ public final class Soulherder extends CardImpl {
Ability ability = new BeginningOfEndStepTriggeredAbility( Ability ability = new BeginningOfEndStepTriggeredAbility(
new ExileTargetForSourceEffect(), TargetController.YOU, true new ExileTargetForSourceEffect(), TargetController.YOU, true
); );
ability.addEffect(new ReturnToBattlefieldUnderOwnerControlTargetEffect(false, false).concatBy("then")); ability.addEffect(new ReturnToBattlefieldUnderOwnerControlTargetEffect(false, false).concatBy(","));
ability.addTarget(new TargetControlledCreaturePermanent(filter)); ability.addTarget(new TargetControlledCreaturePermanent(filter));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -40,7 +40,7 @@ public final class SwordOfFireAndIce extends CardImpl {
// Whenever equipped creature deals combat damage to a player, Sword of Fire // Whenever equipped creature deals combat damage to a player, Sword of Fire
// and Ice deals 2 damage to any target and you draw a card. // and Ice deals 2 damage to any target and you draw a card.
ability = new DealsDamageToAPlayerAttachedTriggeredAbility( ability = new DealsDamageToAPlayerAttachedTriggeredAbility(
new DamageTargetEffect(2), "equipped", false new DamageTargetEffect(2), "equipped creature", false
); );
ability.addEffect(new DrawCardSourceControllerEffect(1).concatBy("and")); ability.addEffect(new DrawCardSourceControllerEffect(1).concatBy("and"));
ability.addTarget(new TargetAnyTarget()); ability.addTarget(new TargetAnyTarget());

View file

@ -51,7 +51,7 @@ public final class SwordOfHearthAndHome extends CardImpl {
// Whenever equipped creature deals combat damage to a player, exile up to one target creature you own, then search your library for a basic land card. Put both cards onto the battlefield under your control, then shuffle. // Whenever equipped creature deals combat damage to a player, exile up to one target creature you own, then search your library for a basic land card. Put both cards onto the battlefield under your control, then shuffle.
ability = new DealsDamageToAPlayerAttachedTriggeredAbility( ability = new DealsDamageToAPlayerAttachedTriggeredAbility(
new SwordOfHearthAndHomeEffect(), "equipped", false new SwordOfHearthAndHomeEffect(), "equipped creature", false
); );
ability.addTarget(new TargetPermanent(0, 1, filter)); ability.addTarget(new TargetPermanent(0, 1, filter));
this.addAbility(ability); this.addAbility(ability);

View file

@ -40,7 +40,7 @@ public final class SwordOfLightAndShadow extends CardImpl {
// Whenever equipped creature deals combat damage to a player, you gain 3 life and you may return up to one target creature card from your graveyard to your hand. // Whenever equipped creature deals combat damage to a player, you gain 3 life and you may return up to one target creature card from your graveyard to your hand.
ability = new DealsDamageToAPlayerAttachedTriggeredAbility( ability = new DealsDamageToAPlayerAttachedTriggeredAbility(
new GainLifeEffect(3), "equipped", false new GainLifeEffect(3), "equipped creature", false
); );
ability.addEffect(new SwordOfLightAndShadowEffect()); ability.addEffect(new SwordOfLightAndShadowEffect());
ability.addTarget(new TargetCardInYourGraveyard( ability.addTarget(new TargetCardInYourGraveyard(

View file

@ -42,7 +42,7 @@ public final class SwordOfSinewAndSteel extends CardImpl {
ability = new DealsDamageToAPlayerAttachedTriggeredAbility( ability = new DealsDamageToAPlayerAttachedTriggeredAbility(
new DestroyTargetEffect(false, true) new DestroyTargetEffect(false, true)
.setText("destroy up to one target planeswalker and up to one target artifact."), .setText("destroy up to one target planeswalker and up to one target artifact."),
"equipped", false "equipped creature", false
); );
ability.addTarget(new TargetPlaneswalkerPermanent(0, 1)); ability.addTarget(new TargetPlaneswalkerPermanent(0, 1));
ability.addTarget(new TargetArtifactPermanent(0, 1)); ability.addTarget(new TargetArtifactPermanent(0, 1));

View file

@ -45,7 +45,7 @@ public final class SwordOfTruthAndJustice extends CardImpl {
// Whenever equipped creature deals combat damage to a player, put a +1/+1 counter on a creature you control, then proliferate. // Whenever equipped creature deals combat damage to a player, put a +1/+1 counter on a creature you control, then proliferate.
this.addAbility(new DealsDamageToAPlayerAttachedTriggeredAbility( this.addAbility(new DealsDamageToAPlayerAttachedTriggeredAbility(
new SwordOfTruthAndJusticeEffect(), "equipped", false new SwordOfTruthAndJusticeEffect(), "equipped creature", false
)); ));
// Equip {2} // Equip {2}

View file

@ -18,7 +18,7 @@ import java.util.UUID;
*/ */
public final class TheFirstSliver extends CardImpl { public final class TheFirstSliver extends CardImpl {
private static final FilterCard filter = new FilterCard("Sliver spells you cast"); private static final FilterCard filter = new FilterCard("Sliver spells");
static { static {
filter.add(SubType.SLIVER.getPredicate()); filter.add(SubType.SLIVER.getPredicate());

View file

@ -1,29 +1,30 @@
package mage.cards.t; package mage.cards.t;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.CantBlockAbility; import mage.abilities.common.CantBlockAbility;
import mage.abilities.keyword.CantBeBlockedSourceAbility; import mage.abilities.effects.common.combat.CantBeBlockedSourceEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import java.util.UUID;
/** /**
* @author Loki * @author Loki
*/ */
public final class TormentedSoul extends CardImpl { public final class TormentedSoul extends CardImpl {
public TormentedSoul(UUID ownerId, CardSetInfo setInfo) { public TormentedSoul(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{B}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}");
this.subtype.add(SubType.SPIRIT); this.subtype.add(SubType.SPIRIT);
this.power = new MageInt(1); this.power = new MageInt(1);
this.toughness = new MageInt(1); this.toughness = new MageInt(1);
this.addAbility(new CantBlockAbility()); Ability ability = new CantBlockAbility();
this.addAbility(new CantBeBlockedSourceAbility()); ability.addEffect(new CantBeBlockedSourceEffect().setText("and can't be blocked"));
this.addAbility(ability);
} }
private TormentedSoul(final TormentedSoul card) { private TormentedSoul(final TormentedSoul card) {
@ -34,5 +35,4 @@ public final class TormentedSoul extends CardImpl {
public TormentedSoul copy() { public TormentedSoul copy() {
return new TormentedSoul(this); return new TormentedSoul(this);
} }
} }

View file

@ -36,7 +36,7 @@ public final class TributeMage extends CardImpl {
// When Tribute Mage enters the battlefield, you may search your library for an artifact card with converted mana cost 2, reveal that card, put it into your hand, then shuffle your library. // When Tribute Mage enters the battlefield, you may search your library for an artifact card with converted mana cost 2, reveal that card, put it into your hand, then shuffle your library.
this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInHandEffect( this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInHandEffect(
new TargetCardInLibrary(0, 1, filter), true, true new TargetCardInLibrary(filter), true, true
), true)); ), true));
} }

View file

@ -36,7 +36,7 @@ public final class UndeadAugur extends CardImpl {
// Whenever Undead Augur or another Zombie you control dies, you draw a card and you lose 1 life. // Whenever Undead Augur or another Zombie you control dies, you draw a card and you lose 1 life.
Ability ability = new DiesThisOrAnotherCreatureTriggeredAbility( Ability ability = new DiesThisOrAnotherCreatureTriggeredAbility(
new DrawCardSourceControllerEffect(1).concatBy("you"), false, filter new DrawCardSourceControllerEffect(1).setText("you draw a card"), false, filter
); );
ability.addEffect(new LoseLifeSourceControllerEffect(1).concatBy("and")); ability.addEffect(new LoseLifeSourceControllerEffect(1).concatBy("and"));
this.addAbility(ability); this.addAbility(ability);

View file

@ -76,7 +76,7 @@ class UrzaLordHighArtificerEffect extends OneShotEffect {
UrzaLordHighArtificerEffect() { UrzaLordHighArtificerEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
this.staticText = "Shuffle your library, then exile the top card of your library. " + this.staticText = "Shuffle your library, then exile the top card. " +
"Until end of turn, you may play that card without paying its mana cost"; "Until end of turn, you may play that card without paying its mana cost";
} }

View file

@ -1,28 +1,30 @@
package mage.cards.w; package mage.cards.w;
import java.util.UUID;
import mage.abilities.effects.common.SacrificeEffect; import mage.abilities.effects.common.SacrificeEffect;
import mage.abilities.keyword.StormAbility; import mage.abilities.keyword.StormAbility;
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.FilterPermanent;
import mage.filter.common.FilterAttackingCreature; import mage.filter.common.FilterAttackingCreature;
import mage.target.TargetPlayer; import mage.target.TargetPlayer;
import java.util.UUID;
/** /**
*
* @author Plopman * @author Plopman
*/ */
public final class WingShards extends CardImpl { public final class WingShards extends CardImpl {
public WingShards(UUID ownerId, CardSetInfo setInfo) { private static final FilterPermanent filter = new FilterAttackingCreature("an attacking creature");
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{W}{W}");
public WingShards(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}{W}");
// Target player sacrifices an attacking creature. // Target player sacrifices an attacking creature.
this.getSpellAbility().addEffect(new SacrificeEffect(new FilterAttackingCreature(), 1, "Target player")); this.getSpellAbility().addEffect(new SacrificeEffect(filter, 1, "Target player"));
this.getSpellAbility().addTarget(new TargetPlayer()); this.getSpellAbility().addTarget(new TargetPlayer());
// Storm // Storm
this.addAbility(new StormAbility()); this.addAbility(new StormAbility());
} }

View file

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

View file

@ -1,12 +1,10 @@
package mage.abilities.common; package mage.abilities.common;
import mage.abilities.effects.common.combat.CantBlockSourceEffect;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.Zone; import mage.constants.Zone;
import mage.abilities.effects.common.combat.CantBlockSourceEffect;
/** /**
*
* @author maurer.it_at_gmail.com * @author maurer.it_at_gmail.com
*/ */
public class CantBlockAbility extends SimpleStaticAbility { public class CantBlockAbility extends SimpleStaticAbility {
@ -19,11 +17,6 @@ public class CantBlockAbility extends SimpleStaticAbility {
super(ability); super(ability);
} }
@Override
public String getRule() {
return "{this} can't block.";
}
@Override @Override
public CantBlockAbility copy() { public CantBlockAbility copy() {
return new CantBlockAbility(this); return new CantBlockAbility(this);