diff --git a/Mage.Sets/src/mage/cards/b/BasiliskCollar.java b/Mage.Sets/src/mage/cards/b/BasiliskCollar.java
index ea8359855d0..2b6e623ac71 100644
--- a/Mage.Sets/src/mage/cards/b/BasiliskCollar.java
+++ b/Mage.Sets/src/mage/cards/b/BasiliskCollar.java
@@ -1,8 +1,6 @@
-
-
package mage.cards.b;
-import java.util.UUID;
+import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
@@ -11,20 +9,30 @@ import mage.abilities.keyword.EquipAbility;
import mage.abilities.keyword.LifelinkAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
+import mage.constants.AttachmentType;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.SubType;
+
+import java.util.UUID;
/**
- *
* @author BetaSteward_at_googlemail.com
*/
public final class BasiliskCollar extends CardImpl {
public BasiliskCollar(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{1}");
+ super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}");
this.subtype.add(SubType.EQUIPMENT);
+
+ Ability ability = new SimpleStaticAbility(new GainAbilityAttachedEffect(
+ DeathtouchAbility.getInstance(), AttachmentType.EQUIPMENT
+ ));
+ ability.addEffect(new GainAbilityAttachedEffect(
+ LifelinkAbility.getInstance(), AttachmentType.EQUIPMENT
+ ).setText("and lifelink"));
+
this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(2)));
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(LifelinkAbility.getInstance(), AttachmentType.EQUIPMENT)));
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(DeathtouchAbility.getInstance(), AttachmentType.EQUIPMENT)));
}
private BasiliskCollar(final BasiliskCollar card) {
diff --git a/Mage.Sets/src/mage/cards/b/BeltOfGiantStrength.java b/Mage.Sets/src/mage/cards/b/BeltOfGiantStrength.java
index 2e89bfc7796..72ccd75714a 100644
--- a/Mage.Sets/src/mage/cards/b/BeltOfGiantStrength.java
+++ b/Mage.Sets/src/mage/cards/b/BeltOfGiantStrength.java
@@ -31,7 +31,7 @@ public final class BeltOfGiantStrength extends CardImpl {
// Equip {10}. This ability costs {X} less to activate where X is the power of the creature it targets.
EquipAbility ability = new EquipAbility(10);
- ability.setCostReduceText("This ability costs {X} less to activate where X is the power of the creature it targets.");
+ ability.setCostReduceText("This ability costs {X} less to activate, where X is the power of the creature it targets.");
ability.setCostAdjuster(BeltOfGiantStrengthAdjuster.instance);
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/b/BogardanHellkite.java b/Mage.Sets/src/mage/cards/b/BogardanHellkite.java
index ec478040380..2ea935eafa8 100644
--- a/Mage.Sets/src/mage/cards/b/BogardanHellkite.java
+++ b/Mage.Sets/src/mage/cards/b/BogardanHellkite.java
@@ -30,7 +30,7 @@ public final class BogardanHellkite extends CardImpl {
this.addAbility(FlashAbility.getInstance());
this.addAbility(FlyingAbility.getInstance());
- Ability ability = new EntersBattlefieldTriggeredAbility(new DamageMultiEffect(5), false);
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DamageMultiEffect(5, "it"), false);
ability.addTarget(new TargetAnyTargetAmount(5));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/c/CataclysmicGearhulk.java b/Mage.Sets/src/mage/cards/c/CataclysmicGearhulk.java
index bcadd109ed8..f86a5525c8c 100644
--- a/Mage.Sets/src/mage/cards/c/CataclysmicGearhulk.java
+++ b/Mage.Sets/src/mage/cards/c/CataclysmicGearhulk.java
@@ -81,7 +81,7 @@ class CataclysmicGearhulkEffect extends OneShotEffect {
public CataclysmicGearhulkEffect() {
super(Outcome.DestroyPermanent);
staticText = "each player chooses an artifact, a creature, an enchantment, and a planeswalker " +
- "from among the nonland permanents they control then sacrifices the rest";
+ "from among the nonland permanents they control, then sacrifices the rest";
}
public CataclysmicGearhulkEffect(CataclysmicGearhulkEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/c/CattiBrieOfMithralHall.java b/Mage.Sets/src/mage/cards/c/CattiBrieOfMithralHall.java
index 06a4c725b8b..8f7f644c4f1 100644
--- a/Mage.Sets/src/mage/cards/c/CattiBrieOfMithralHall.java
+++ b/Mage.Sets/src/mage/cards/c/CattiBrieOfMithralHall.java
@@ -60,13 +60,13 @@ public final class CattiBrieOfMithralHall extends CardImpl {
// each Equipment attached to it.
EquipmentAttachedCount amount = new EquipmentAttachedCount();
this.addAbility(new AttacksTriggeredAbility(
- new AddCountersSourceEffect(CounterType.P1P1.createInstance(), amount, false)));
+ new AddCountersSourceEffect(CounterType.P1P1.createInstance(), amount, false).setText("put a +1/+1 counter on it for each Equipment attached to it")));
// {1}, Remove all +1/+1 counters from Catti-brie: It deals X damage to target
// attacking or blocking creature an opponent controls, where X is the number of
// counters removed this way.
Ability damageAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD,
- new DamageTargetEffect(CattiBrieRemovedCounterValue.instance), new ManaCostsImpl("{1}"));
+ new DamageTargetEffect(CattiBrieRemovedCounterValue.instance).setText("it deals X damage to target attacking or blocking creature an opponent controls, where X is the number of counters removed this way"), new ManaCostsImpl("{1}"));
damageAbility.addTarget(new TargetCreaturePermanent(filter));
damageAbility.addCost(new RemoveAllCountersSourceCost(CounterType.P1P1));
diff --git a/Mage.Sets/src/mage/cards/c/ChameleonColossus.java b/Mage.Sets/src/mage/cards/c/ChameleonColossus.java
index 46f5dcf1a54..3ff65c8fdbb 100644
--- a/Mage.Sets/src/mage/cards/c/ChameleonColossus.java
+++ b/Mage.Sets/src/mage/cards/c/ChameleonColossus.java
@@ -1,7 +1,5 @@
-
package mage.cards.c;
-import java.util.UUID;
import mage.MageInt;
import mage.ObjectColor;
import mage.abilities.common.SimpleActivatedAbility;
@@ -13,18 +11,20 @@ import mage.abilities.keyword.ProtectionAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Duration;
-import mage.constants.Zone;
+import mage.constants.SubType;
+
+import java.util.UUID;
/**
- *
* @author Loki
*/
public final class ChameleonColossus extends CardImpl {
+ private static final SourcePermanentPowerCount xValue = new SourcePermanentPowerCount();
+
public ChameleonColossus(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}{G}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}");
this.subtype.add(SubType.SHAPESHIFTER);
this.power = new MageInt(4);
@@ -37,8 +37,11 @@ public final class ChameleonColossus extends CardImpl {
this.addAbility(ProtectionAbility.from(ObjectColor.BLACK));
// {2}{G}{G}: Chameleon Colossus gets +X/+X until end of turn, where X is its power.
- SourcePermanentPowerCount x = new SourcePermanentPowerCount();
- this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(x, x, Duration.EndOfTurn, true), new ManaCostsImpl("{2}{G}{G}")));
+ this.addAbility(new SimpleActivatedAbility(
+ new BoostSourceEffect(xValue, xValue, Duration.EndOfTurn, true)
+ .setText("{this} gets +X/+X until end of turn, where X is its power"),
+ new ManaCostsImpl<>("{2}{G}{G}")
+ ));
}
private ChameleonColossus(final ChameleonColossus card) {
diff --git a/Mage.Sets/src/mage/cards/c/CitadelSiege.java b/Mage.Sets/src/mage/cards/c/CitadelSiege.java
index aacd3764d6f..2a85891efa1 100644
--- a/Mage.Sets/src/mage/cards/c/CitadelSiege.java
+++ b/Mage.Sets/src/mage/cards/c/CitadelSiege.java
@@ -28,8 +28,8 @@ import java.util.UUID;
*/
public final class CitadelSiege extends CardImpl {
- private static final String ruleTrigger1 = "&bull Khans — At the beginning of combat on your turn, put two +1/+1 counters on target creature you control.";
- private static final String ruleTrigger2 = "&bull Dragons — At the beginning of combat on each opponent's turn, tap target creature that player controls.";
+ private static final String ruleTrigger1 = "&bull Khans — At the beginning of combat on your turn, put two +1/+1 counters on target creature you control.";
+ private static final String ruleTrigger2 = "&bull Dragons — At the beginning of combat on each opponent's turn, tap target creature that player controls.";
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature controlled by the active player");
static {
diff --git a/Mage.Sets/src/mage/cards/c/CuratorOfMysteries.java b/Mage.Sets/src/mage/cards/c/CuratorOfMysteries.java
index 76a343228e7..89676d6ec06 100644
--- a/Mage.Sets/src/mage/cards/c/CuratorOfMysteries.java
+++ b/Mage.Sets/src/mage/cards/c/CuratorOfMysteries.java
@@ -30,7 +30,7 @@ public final class CuratorOfMysteries extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// Whenever you cycle or discard another card, scry 1.
- this.addAbility(new CycleOrDiscardControllerTriggeredAbility(new ScryEffect(1)));
+ this.addAbility(new CycleOrDiscardControllerTriggeredAbility(new ScryEffect(1)).setTriggerPhrase("Whenever you cycle or discard another card, "));
// Cycling {U}
this.addAbility(new CyclingAbility(new ManaCostsImpl("{U}")));
diff --git a/Mage.Sets/src/mage/cards/c/CurseOfVerbosity.java b/Mage.Sets/src/mage/cards/c/CurseOfVerbosity.java
index 090e20a3f00..f822a0ab1ec 100644
--- a/Mage.Sets/src/mage/cards/c/CurseOfVerbosity.java
+++ b/Mage.Sets/src/mage/cards/c/CurseOfVerbosity.java
@@ -56,7 +56,7 @@ class CurseOfVerbosityEffect extends OneShotEffect {
CurseOfVerbosityEffect() {
super(Outcome.Benefit);
- this.staticText = "draw a card. Each opponent attacking that player does the same.";
+ this.staticText = "you draw a card. Each opponent attacking that player does the same.";
}
CurseOfVerbosityEffect(final CurseOfVerbosityEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/d/DanseMacabre.java b/Mage.Sets/src/mage/cards/d/DanseMacabre.java
index 5753679b2df..bc06ebb0b0a 100644
--- a/Mage.Sets/src/mage/cards/d/DanseMacabre.java
+++ b/Mage.Sets/src/mage/cards/d/DanseMacabre.java
@@ -64,7 +64,7 @@ class DanseMacabreEffect extends OneShotEffect {
"
1-14 | Return a creature card put into a graveyard " +
"this way to the battlefield under your control." +
"
15+ | Return up to two creature cards put into " +
- "a graveyard this way to the battlefield under your control";
+ "graveyards this way to the battlefield under your control";
}
private DanseMacabreEffect(final DanseMacabreEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/e/Explore.java b/Mage.Sets/src/mage/cards/e/Explore.java
index 4d5a761209f..a9c8dded2cf 100644
--- a/Mage.Sets/src/mage/cards/e/Explore.java
+++ b/Mage.Sets/src/mage/cards/e/Explore.java
@@ -22,7 +22,7 @@ public final class Explore extends CardImpl {
this.getSpellAbility().addEffect(new PlayAdditionalLandsControllerEffect(1, Duration.EndOfTurn));
// Draw a card.
- this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1));
+ this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("
"));
}
private Explore(final Explore card) {
diff --git a/Mage.Sets/src/mage/cards/f/FeySteed.java b/Mage.Sets/src/mage/cards/f/FeySteed.java
index 6266d63078f..d32680df56c 100644
--- a/Mage.Sets/src/mage/cards/f/FeySteed.java
+++ b/Mage.Sets/src/mage/cards/f/FeySteed.java
@@ -100,7 +100,7 @@ class FeySteedTriggeredAbility extends TriggeredAbilityImpl {
@Override
public String getRule() {
- return "Whenever a creature or planeswalker you control becomes the target of a spell or ability an opponent controls, you may draw a card";
+ return "Whenever a creature or planeswalker you control becomes the target of a spell or ability an opponent controls, you may draw a card.";
}
@Override
diff --git a/Mage.Sets/src/mage/cards/f/FrontierSiege.java b/Mage.Sets/src/mage/cards/f/FrontierSiege.java
index 0d8a8cc70fb..a3c645e2e3b 100644
--- a/Mage.Sets/src/mage/cards/f/FrontierSiege.java
+++ b/Mage.Sets/src/mage/cards/f/FrontierSiege.java
@@ -36,8 +36,8 @@ public final class FrontierSiege extends CardImpl {
filter.add(new AbilityPredicate(FlyingAbility.class));
}
- private static final String ruleTrigger1 = "&bull Khans — At the beginning of each of your main phases, add {G}{G}.";
- private static final String ruleTrigger2 = "&bull Dragons — Whenever a creature with flying enters the battlefield under your control, you may have it fight target creature you don't control.";
+ private static final String ruleTrigger1 = "&bull Khans — At the beginning of each of your main phases, add {G}{G}.";
+ private static final String ruleTrigger2 = "&bull Dragons — Whenever a creature with flying enters the battlefield under your control, you may have it fight target creature you don't control.";
public FrontierSiege(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}");
diff --git a/Mage.Sets/src/mage/cards/g/GratuitousViolence.java b/Mage.Sets/src/mage/cards/g/GratuitousViolence.java
index f0065a838e4..8097bc0b884 100644
--- a/Mage.Sets/src/mage/cards/g/GratuitousViolence.java
+++ b/Mage.Sets/src/mage/cards/g/GratuitousViolence.java
@@ -43,7 +43,7 @@ class GratuitousViolenceReplacementEffect extends ReplacementEffectImpl {
GratuitousViolenceReplacementEffect() {
super(Duration.WhileOnBattlefield, Outcome.Damage);
- staticText = "If a creature you control would deal damage to a permanent or player, it deals double that permanent to that creature or player instead";
+ staticText = "If a creature you control would deal damage to a permanent or player, it deals double that damage to that creature or player instead";
}
GratuitousViolenceReplacementEffect(final GratuitousViolenceReplacementEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/h/Hex.java b/Mage.Sets/src/mage/cards/h/Hex.java
index 7d0e4445413..f5b14d6505b 100644
--- a/Mage.Sets/src/mage/cards/h/Hex.java
+++ b/Mage.Sets/src/mage/cards/h/Hex.java
@@ -6,6 +6,8 @@ import mage.abilities.effects.common.DestroyTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.filter.StaticFilters;
+import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
/**
@@ -20,7 +22,7 @@ public final class Hex extends CardImpl {
// Destroy six target creatures.
this.getSpellAbility().addEffect(new DestroyTargetEffect());
- this.getSpellAbility().addTarget(new TargetCreaturePermanent(6));
+ this.getSpellAbility().addTarget(new TargetPermanent(6, StaticFilters.FILTER_PERMANENT_CREATURES));
}
private Hex(final Hex card) {
diff --git a/Mage.Sets/src/mage/cards/i/ImmovableRod.java b/Mage.Sets/src/mage/cards/i/ImmovableRod.java
index d05cf2de318..7701847b3c5 100644
--- a/Mage.Sets/src/mage/cards/i/ImmovableRod.java
+++ b/Mage.Sets/src/mage/cards/i/ImmovableRod.java
@@ -38,7 +38,7 @@ public final class ImmovableRod extends CardImpl {
this.addAbility(new SkipUntapOptionalAbility());
// Whenever Immovable Rod becomes untapped, venture into the dungeon.
- this.addAbility(new InspiredAbility(new VentureIntoTheDungeonEffect()));
+ this.addAbility(new InspiredAbility(new VentureIntoTheDungeonEffect(), false, false));
// {3}{W}, {T}: For as long as Immovable Rod remains tapped, another target permanent loses all abilities and can't attack or block.
Ability ability = new SimpleActivatedAbility(new ImmovableRodAbilityEffect(), new ManaCostsImpl<>("{3}{W}"));
diff --git a/Mage.Sets/src/mage/cards/i/IndomitableMight.java b/Mage.Sets/src/mage/cards/i/IndomitableMight.java
index d06bf8d9130..ca1edf506bf 100644
--- a/Mage.Sets/src/mage/cards/i/IndomitableMight.java
+++ b/Mage.Sets/src/mage/cards/i/IndomitableMight.java
@@ -60,7 +60,7 @@ class IndomitableMightEffect extends AsThoughEffectImpl {
IndomitableMightEffect() {
super(AsThoughEffectType.DAMAGE_NOT_BLOCKED, Duration.WhileOnBattlefield, Outcome.Damage);
this.staticText = "enchanted creature's controller may have it " +
- "assign combat damage as though it weren't blocked";
+ "assign its combat damage as though it weren't blocked";
}
private IndomitableMightEffect(IndomitableMightEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/l/LoyalApprentice.java b/Mage.Sets/src/mage/cards/l/LoyalApprentice.java
index bb823f27806..eb21b5b9f44 100644
--- a/Mage.Sets/src/mage/cards/l/LoyalApprentice.java
+++ b/Mage.Sets/src/mage/cards/l/LoyalApprentice.java
@@ -1,29 +1,27 @@
package mage.cards.l;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfCombatTriggeredAbility;
import mage.abilities.condition.common.CommanderInPlayCondition;
import mage.abilities.decorator.ConditionalTriggeredAbility;
-import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
-import mage.constants.SubType;
import mage.abilities.keyword.HasteAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.TargetController;
+import mage.constants.*;
import mage.game.Game;
import mage.game.permanent.token.ThopterColorlessToken;
-import mage.target.targetpointer.FixedTarget;
+import mage.game.permanent.token.Token;
+import mage.target.targetpointer.FixedTargets;
+
+import java.util.Objects;
+import java.util.UUID;
+import java.util.stream.Collectors;
/**
- *
* @author TheElk801
*/
public final class LoyalApprentice extends CardImpl {
@@ -42,13 +40,11 @@ public final class LoyalApprentice extends CardImpl {
// Lieutenant — At the beginning of combat on your turn, if you control your commander, create a 1/1 colorless Thopter artifact creature token with flying. That token gains haste until end of turn.
this.addAbility(new ConditionalTriggeredAbility(
new BeginningOfCombatTriggeredAbility(
- new LoyalApprenticeEffect(),
- TargetController.YOU, false
- ), CommanderInPlayCondition.instance,
- "Lieutenant — At the beginning of combat "
- + "on your turn, create a 1/1 colorless Thopter "
- + "artifact creature token with flying. "
- + "That token gains haste until end of turn"
+ new LoyalApprenticeEffect(), TargetController.YOU, false
+ ), CommanderInPlayCondition.instance, "Lieutenant — " +
+ "At the beginning of combat on your turn, if you control your commander, " +
+ "create a 1/1 colorless Thopter artifact creature token with flying. " +
+ "That token gains haste until end of turn."
));
}
@@ -81,15 +77,17 @@ class LoyalApprenticeEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
CreateTokenEffect effect = new CreateTokenEffect(new ThopterColorlessToken());
effect.apply(game, source);
- effect.getLastAddedTokenIds().stream().map((tokenId) -> {
- ContinuousEffect continuousEffect = new GainAbilityTargetEffect(
- HasteAbility.getInstance(), Duration.EndOfTurn
- );
- continuousEffect.setTargetPointer(new FixedTarget(tokenId, game));
- return continuousEffect;
- }).forEachOrdered((continuousEffect) -> {
- game.addEffect(continuousEffect, source);
- });
+ Token token = new ThopterColorlessToken();
+ token.putOntoBattlefield(1, game, source, source.getControllerId());
+ game.addEffect(new GainAbilityTargetEffect(
+ HasteAbility.getInstance(), Duration.EndOfTurn
+ ).setTargetPointer(new FixedTargets(
+ token.getLastAddedTokenIds()
+ .stream()
+ .map(game::getPermanent)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList()), game
+ )), source);
return true;
}
}
diff --git a/Mage.Sets/src/mage/cards/n/Nihiloor.java b/Mage.Sets/src/mage/cards/n/Nihiloor.java
index d619a6f07eb..26a3def0d6a 100644
--- a/Mage.Sets/src/mage/cards/n/Nihiloor.java
+++ b/Mage.Sets/src/mage/cards/n/Nihiloor.java
@@ -47,7 +47,7 @@ public final class Nihiloor extends CardImpl {
// Whenever you attack with a creature an opponent owns, you gain 2 life and that player loses 2 life.
Ability ability = new AttacksAllTriggeredAbility(
- new GainLifeEffect(1), false, filter,
+ new GainLifeEffect(2), false, filter,
SetTargetPointer.PERMANENT, false
).setTriggerPhrase("Whenever you attack with a creature an opponent owns, ");
ability.addEffect(new NihiloorLoseLifeEffect());
@@ -145,7 +145,7 @@ class NihiloorLoseLifeEffect extends OneShotEffect {
NihiloorLoseLifeEffect() {
super(Outcome.Benefit);
- staticText = "you gain 2 life and that player loses 2 life";
+ staticText = "and that player loses 2 life";
}
private NihiloorLoseLifeEffect(final NihiloorLoseLifeEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/o/OutpostSiege.java b/Mage.Sets/src/mage/cards/o/OutpostSiege.java
index f6e071f75ca..66855187f38 100644
--- a/Mage.Sets/src/mage/cards/o/OutpostSiege.java
+++ b/Mage.Sets/src/mage/cards/o/OutpostSiege.java
@@ -35,8 +35,8 @@ import mage.target.targetpointer.FixedTarget;
*/
public final class OutpostSiege extends CardImpl {
- private static final String ruleTrigger1 = "&bull Khans — At the beginning of your upkeep, exile the top card of your library. Until end of turn, you may play that card.";
- private static final String ruleTrigger2 = "&bull Dragons — Whenever a creature you control leaves the battlefield, {this} deals 1 damage to any target.";
+ private static final String ruleTrigger1 = "&bull Khans — At the beginning of your upkeep, exile the top card of your library. Until end of turn, you may play that card.";
+ private static final String ruleTrigger2 = "&bull Dragons — Whenever a creature you control leaves the battlefield, {this} deals 1 damage to any target.";
public OutpostSiege(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{R}");
diff --git a/Mage.Sets/src/mage/cards/p/PalaceSiege.java b/Mage.Sets/src/mage/cards/p/PalaceSiege.java
index 3dbe950bb2a..e245779e2f0 100644
--- a/Mage.Sets/src/mage/cards/p/PalaceSiege.java
+++ b/Mage.Sets/src/mage/cards/p/PalaceSiege.java
@@ -24,8 +24,8 @@ import mage.target.common.TargetCardInYourGraveyard;
*/
public final class PalaceSiege extends CardImpl {
- private static final String ruleTrigger1 = "&bull Khans — At the beginning of your upkeep, return target creature card from your graveyard to your hand.";
- private static final String ruleTrigger2 = "&bull Dragons — At the beginning of your upkeep, each opponent loses 2 life and you gain 2 life.";
+ private static final String ruleTrigger1 = "&bull Khans — At the beginning of your upkeep, return target creature card from your graveyard to your hand.";
+ private static final String ruleTrigger2 = "&bull Dragons — At the beginning of your upkeep, each opponent loses 2 life and you gain 2 life.";
public PalaceSiege(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}{B}");
diff --git a/Mage.Sets/src/mage/cards/p/PhantasmalImage.java b/Mage.Sets/src/mage/cards/p/PhantasmalImage.java
index 7562e4e3435..32ecb5cc2ae 100644
--- a/Mage.Sets/src/mage/cards/p/PhantasmalImage.java
+++ b/Mage.Sets/src/mage/cards/p/PhantasmalImage.java
@@ -24,7 +24,7 @@ import java.util.UUID;
*/
public final class PhantasmalImage extends CardImpl {
- private static final String effectText = "a copy of any creature on the battlefield, except it's an Illusion in addition to its other types and it has \"When this creature becomes the target of a spell or ability, sacrifice it.\"";
+ private static final String effectText = "as a copy of any creature on the battlefield, except it's an Illusion in addition to its other types and it has \"When this creature becomes the target of a spell or ability, sacrifice it.\"";
private static final CopyApplier phantasmalImageApplier = new CopyApplier() {
@Override
diff --git a/Mage.Sets/src/mage/cards/p/PuresteelPaladin.java b/Mage.Sets/src/mage/cards/p/PuresteelPaladin.java
index f244d853b92..5a257c586fd 100644
--- a/Mage.Sets/src/mage/cards/p/PuresteelPaladin.java
+++ b/Mage.Sets/src/mage/cards/p/PuresteelPaladin.java
@@ -22,11 +22,9 @@ import java.util.UUID;
* @author Loki
*/
public final class PuresteelPaladin extends CardImpl {
- private static final FilterPermanent filter = new FilterControlledPermanent("Equipment");
- static {
- filter.add(SubType.EQUIPMENT.getPredicate());
- }
+ private static final FilterPermanent filter
+ = new FilterControlledPermanent(SubType.EQUIPMENT, "an Equipment");
public PuresteelPaladin(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}{W}");
@@ -37,16 +35,17 @@ public final class PuresteelPaladin extends CardImpl {
this.toughness = new MageInt(2);
// Whenever an Equipment enters the battlefield under your control, you may draw a card.
- this.addAbility(new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), filter, true));
+ this.addAbility(new EntersBattlefieldControlledTriggeredAbility(
+ Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), filter, true
+ ));
// Metalcraft — Equipment you control have equip {0} as long as you control three or more artifacts
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect(
- new GainAbilityControlledEffect(new EquipAbility(Outcome.AddAbility, new GenericManaCost(0)), Duration.WhileOnBattlefield, filter),
- MetalcraftCondition.instance,
- "Metalcraft — Equipment you control have equip {0} as long as you control three or more artifacts"))
- .setAbilityWord(AbilityWord.METALCRAFT)
- .addHint(MetalcraftHint.instance)
- );
+ this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
+ new GainAbilityControlledEffect(new EquipAbility(
+ Outcome.AddAbility, new GenericManaCost(0)
+ ), Duration.WhileOnBattlefield, filter), MetalcraftCondition.instance,
+ "equipment you control have equip {0} as long as you control three or more artifacts"
+ )).setAbilityWord(AbilityWord.METALCRAFT).addHint(MetalcraftHint.instance));
}
private PuresteelPaladin(final PuresteelPaladin card) {
diff --git a/Mage.Sets/src/mage/cards/r/ReassemblingSkeleton.java b/Mage.Sets/src/mage/cards/r/ReassemblingSkeleton.java
index f86b0cd28b7..d6f6fd7107e 100644
--- a/Mage.Sets/src/mage/cards/r/ReassemblingSkeleton.java
+++ b/Mage.Sets/src/mage/cards/r/ReassemblingSkeleton.java
@@ -27,7 +27,7 @@ public final class ReassemblingSkeleton extends CardImpl {
this.toughness = new MageInt(1);
// {1}{B}: Return Reassembling Skeleton from your graveyard to the battlefield tapped.
- this.addAbility(new SimpleActivatedAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToBattlefieldEffect(true), new ManaCostsImpl("{1}{B}")));
+ this.addAbility(new SimpleActivatedAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToBattlefieldEffect(true, false), new ManaCostsImpl("{1}{B}")));
}
private ReassemblingSkeleton(final ReassemblingSkeleton card) {
diff --git a/Mage.Sets/src/mage/cards/s/SkylineDespot.java b/Mage.Sets/src/mage/cards/s/SkylineDespot.java
index 0bc09a9387b..5e4bcaadcdf 100644
--- a/Mage.Sets/src/mage/cards/s/SkylineDespot.java
+++ b/Mage.Sets/src/mage/cards/s/SkylineDespot.java
@@ -1,7 +1,5 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@@ -15,11 +13,11 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.TargetController;
-import mage.constants.Zone;
import mage.game.permanent.token.DragonToken2;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class SkylineDespot extends CardImpl {
@@ -37,10 +35,12 @@ public final class SkylineDespot extends CardImpl {
this.addAbility(new EntersBattlefieldTriggeredAbility(new BecomesMonarchSourceEffect(), false));
// At the beginning of your upkeep, if you're the monarch, put a 5/5 red Dragon creature token with flying onto the battlefield.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD,
- new CreateTokenEffect(new DragonToken2()),
- TargetController.YOU, false), MonarchIsSourceControllerCondition.instance,
- "At the beginning of your upkeep, if you're the monarch, put a 5/5 red Dragon creature token with flying onto the battlefield."));
+ this.addAbility(new ConditionalInterveningIfTriggeredAbility(
+ new BeginningOfUpkeepTriggeredAbility(
+ new CreateTokenEffect(new DragonToken2()), TargetController.YOU, false
+ ), MonarchIsSourceControllerCondition.instance, "At the beginning of your upkeep, " +
+ "if you're the monarch, create a 5/5 red Dragon creature token with flying."
+ ));
}
diff --git a/Mage.Sets/src/mage/cards/s/StorvaldFrostGiantJarl.java b/Mage.Sets/src/mage/cards/s/StorvaldFrostGiantJarl.java
index 77bdc884129..f209bdf8d30 100644
--- a/Mage.Sets/src/mage/cards/s/StorvaldFrostGiantJarl.java
+++ b/Mage.Sets/src/mage/cards/s/StorvaldFrostGiantJarl.java
@@ -40,7 +40,7 @@ public final class StorvaldFrostGiantJarl extends CardImpl {
// Other creatures you control have ward {3}.
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
new WardAbility(new GenericManaCost(3)), Duration.WhileOnBattlefield,
- StaticFilters.FILTER_CONTROLLED_CREATURES, true
+ StaticFilters.FILTER_PERMANENT_CREATURES, true
)));
// Whenever Storvald, Frost Giant Jarl enters the battlefield or attacks, choose one or both —
@@ -54,6 +54,8 @@ public final class StorvaldFrostGiantJarl extends CardImpl {
Mode mode = new Mode(new SetPowerToughnessTargetEffect(1, 1, Duration.EndOfTurn));
mode.addTarget(new TargetCreaturePermanent());
ability.addMode(mode);
+ ability.getModes().setMinModes(1);
+ ability.getModes().setMaxModes(2);
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/t/ThunderbreakRegent.java b/Mage.Sets/src/mage/cards/t/ThunderbreakRegent.java
index a2fb448e59e..e8c31c28bca 100644
--- a/Mage.Sets/src/mage/cards/t/ThunderbreakRegent.java
+++ b/Mage.Sets/src/mage/cards/t/ThunderbreakRegent.java
@@ -90,6 +90,6 @@ class ThunderbreakRegentTriggeredAbility extends TriggeredAbilityImpl {
@Override
public String getRule() {
- return "Whenever a Dragon you control becomes the target of a spell or ability your opponent controls, {this} deals 3 damage to that player.";
+ return "Whenever a Dragon you control becomes the target of a spell or ability an opponent controls, {this} deals 3 damage to that player.";
}
}
diff --git a/Mage.Sets/src/mage/cards/u/UnderdarkRift.java b/Mage.Sets/src/mage/cards/u/UnderdarkRift.java
index ef8ac9232e8..f1c63d0fb18 100644
--- a/Mage.Sets/src/mage/cards/u/UnderdarkRift.java
+++ b/Mage.Sets/src/mage/cards/u/UnderdarkRift.java
@@ -63,7 +63,7 @@ class UnderdarkRiftEffect extends OneShotEffect {
UnderdarkRiftEffect() {
super(Outcome.Benefit);
- staticText = "roll a d10. Put a target artifact, creature, or planeswalker into its owner's library " +
+ staticText = "roll a d10. Put target artifact, creature, or planeswalker into its owner's library " +
"just beneath the top X cards of that library, where X is the result";
}
diff --git a/Mage.Sets/src/mage/cards/w/WandOfOrcus.java b/Mage.Sets/src/mage/cards/w/WandOfOrcus.java
index 060ec80ebb7..8af9e8f2b4b 100644
--- a/Mage.Sets/src/mage/cards/w/WandOfOrcus.java
+++ b/Mage.Sets/src/mage/cards/w/WandOfOrcus.java
@@ -1,7 +1,5 @@
package mage.cards.w;
-import java.util.UUID;
-
import mage.abilities.Ability;
import mage.abilities.common.AttacksOrBlocksEnchantedTriggeredAbility;
import mage.abilities.common.DealsDamageToAPlayerAttachedTriggeredAbility;
@@ -13,19 +11,14 @@ import mage.abilities.keyword.DeathtouchAbility;
import mage.abilities.keyword.EquipAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.AttachmentType;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.SubType;
-import mage.constants.SuperType;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game;
import mage.game.permanent.token.ZombieToken;
+import java.util.UUID;
+
/**
- *
* @author zeffirojoe
*/
public final class WandOfOrcus extends CardImpl {
@@ -37,24 +30,30 @@ public final class WandOfOrcus extends CardImpl {
}
public WandOfOrcus(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[] { CardType.ARTIFACT }, "{2}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{B}");
this.addSuperType(SuperType.LEGENDARY);
this.subtype.add(SubType.EQUIPMENT);
// Whenever equipped creature attacks or blocks, it and Zombies you control gain
// deathtouch until end of turn.
- Ability deathTouchAbility = new AttacksOrBlocksEnchantedTriggeredAbility(Zone.BATTLEFIELD,
- new GainAbilityAttachedEffect(DeathtouchAbility.getInstance(), AttachmentType.EQUIPMENT,
- Duration.EndOfTurn));
- deathTouchAbility.addEffect(
- new GainAbilityControlledEffect(DeathtouchAbility.getInstance(), Duration.EndOfTurn, filter));
+ Ability deathTouchAbility = new AttacksOrBlocksEnchantedTriggeredAbility(
+ Zone.BATTLEFIELD,
+ new GainAbilityAttachedEffect(
+ DeathtouchAbility.getInstance(), AttachmentType.EQUIPMENT, Duration.EndOfTurn
+ ).setText("it")
+ );
+ deathTouchAbility.addEffect(new GainAbilityControlledEffect(
+ DeathtouchAbility.getInstance(), Duration.EndOfTurn, filter
+ ).concatBy("and"));
this.addAbility(deathTouchAbility);
// Whenever equipped creature deals combat damage to a player, create that many
// 2/2 black Zombie creature tokens.
- this.addAbility(new DealsDamageToAPlayerAttachedTriggeredAbility(new WandOfOrcusZombieEffect(), "equipped",
- false, true));
+ this.addAbility(new DealsDamageToAPlayerAttachedTriggeredAbility(
+ new WandOfOrcusZombieEffect(), "equipped creature",
+ false, true
+ ));
// Equip {3}
this.addAbility(new EquipAbility(Outcome.AddAbility, new ManaCostsImpl<>("{3}")));
diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java
index b6570834104..10020aac2d2 100644
--- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java
+++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java
@@ -57,7 +57,7 @@ public class VerifyCardDataTest {
private static final Logger logger = Logger.getLogger(VerifyCardDataTest.class);
- private static final String FULL_ABILITIES_CHECK_SET_CODE = "AFR"; // check all abilities and output cards with wrong abilities texts;
+ private static final String FULL_ABILITIES_CHECK_SET_CODE = "AFC"; // check all abilities and output cards with wrong abilities texts;
private static final boolean AUTO_FIX_SAMPLE_DECKS = false; // debug only: auto-fix sample decks by test_checkSampleDecks test run
private static final boolean ONLY_TEXT = false; // use when checking text locally, suppresses unnecessary checks and output messages
diff --git a/Mage/src/main/java/mage/abilities/common/PutCardIntoGraveFromAnywhereAllTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/PutCardIntoGraveFromAnywhereAllTriggeredAbility.java
index ce40e77eaad..9fc36f87cf4 100644
--- a/Mage/src/main/java/mage/abilities/common/PutCardIntoGraveFromAnywhereAllTriggeredAbility.java
+++ b/Mage/src/main/java/mage/abilities/common/PutCardIntoGraveFromAnywhereAllTriggeredAbility.java
@@ -41,7 +41,7 @@ public class PutCardIntoGraveFromAnywhereAllTriggeredAbility extends TriggeredAb
this.filter.add(targetController.getOwnerPredicate());
StringBuilder sb = new StringBuilder("Whenever ");
sb.append(filter.getMessage());
- sb.append(filter.getMessage().startsWith("one or more") ? " are" : "is");
+ sb.append(filter.getMessage().startsWith("one or more") ? " are" : " is");
sb.append(" put into ");
switch (targetController) {
case OPPONENT:
diff --git a/Mage/src/main/java/mage/abilities/keyword/FabricateAbility.java b/Mage/src/main/java/mage/abilities/keyword/FabricateAbility.java
index a851dfd676e..2f22884f98a 100644
--- a/Mage/src/main/java/mage/abilities/keyword/FabricateAbility.java
+++ b/Mage/src/main/java/mage/abilities/keyword/FabricateAbility.java
@@ -18,18 +18,30 @@ import mage.util.CardUtil;
*/
public class FabricateAbility extends EntersBattlefieldTriggeredAbility {
+ private final int value;
+
public FabricateAbility(int value) {
super(new FabricateEffect(value), false, true);
+ this.value = value;
}
public FabricateAbility(final FabricateAbility ability) {
super(ability);
+ this.value = ability.value;
}
@Override
public FabricateAbility copy() {
return new FabricateAbility(this);
}
+
+ @Override
+ public String getRule() {
+ return "Fabricate " + value + " (When this creature enters the battlefield, put "
+ + CardUtil.numberToText(value, "a") + " +1/+1 counter" + (value > 1 ? "s" : "")
+ + " on it or create " + CardUtil.numberToText(value, "a")
+ + " 1/1 colorless Servo artifact creature token" + (value > 1 ? "s" : "") + ".)";
+ }
}
class FabricateEffect extends OneShotEffect {
@@ -39,9 +51,6 @@ class FabricateEffect extends OneShotEffect {
FabricateEffect(int value) {
super(Outcome.Benefit);
this.value = value;
- this.staticText = "Fabricate " + value
- + " (When this creature enters the battlefield, put " + CardUtil.numberToText(value, "a") + " +1/+1 counter" + (value > 1 ? "s" : "")
- + " on it or create " + CardUtil.numberToText(value, "a") + " 1/1 colorless Servo artifact creature token" + (value > 1 ? "s" : "") + ".)";
}
FabricateEffect(final FabricateEffect effect) {
@@ -68,8 +77,7 @@ class FabricateEffect extends OneShotEffect {
source,
game)) {
((Card) sourceObject).addCounters(CounterType.P1P1.createInstance(value), source.getControllerId(), source, game);
- }
- else {
+ } else {
new ServoToken().putOntoBattlefield(value, game, source, controller.getId());
}
return true;
diff --git a/Mage/src/main/java/mage/constants/PhaseStep.java b/Mage/src/main/java/mage/constants/PhaseStep.java
index 5501aeb3772..2c489e556fd 100644
--- a/Mage/src/main/java/mage/constants/PhaseStep.java
+++ b/Mage/src/main/java/mage/constants/PhaseStep.java
@@ -13,7 +13,7 @@ public enum PhaseStep {
DECLARE_BLOCKERS("Declare Blockers", 6, "declare blockers step", "DB"),
FIRST_COMBAT_DAMAGE("First Combat Damage", 7, "first combat damage", "FCD"),
COMBAT_DAMAGE("Combat Damage", 8, "combat damage step", "CD"),
- END_COMBAT("End Combat", 9, "end combat step", "EC"),
+ END_COMBAT("End Combat", 9, "end of combat step", "EC"),
POSTCOMBAT_MAIN("Postcombat Main", 10, "postcombat main step", "M2"),
END_TURN("End Turn", 11, "end turn step", "ET"),
CLEANUP("Cleanup", 12, "cleanup step", "CL");