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");