diff --git a/Mage.Sets/src/mage/cards/a/AlteredEgo.java b/Mage.Sets/src/mage/cards/a/AlteredEgo.java index 8c8d41448b4..170040a0cb5 100644 --- a/Mage.Sets/src/mage/cards/a/AlteredEgo.java +++ b/Mage.Sets/src/mage/cards/a/AlteredEgo.java @@ -54,7 +54,7 @@ class AlteredEgoCopyApplier extends CopyApplier { @Override public String getText() { - return ", except it enters with an additional X +1/+1 counters on it"; + return ", except it enters with X additional +1/+1 counters on it"; } @Override @@ -85,4 +85,4 @@ class AlteredEgoCopyApplier extends CopyApplier { return true; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/a/Anger.java b/Mage.Sets/src/mage/cards/a/Anger.java index 8b589c68fc7..8994291cd55 100644 --- a/Mage.Sets/src/mage/cards/a/Anger.java +++ b/Mage.Sets/src/mage/cards/a/Anger.java @@ -1,12 +1,11 @@ package mage.cards.a; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.decorator.ConditionalContinuousEffect; -import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.keyword.HasteAbility; import mage.cards.CardImpl; @@ -15,26 +14,20 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.filter.common.FilterControlledPermanent; -import mage.filter.common.FilterCreaturePermanent; + +import java.util.UUID; /** - * * @author Backfir3 */ public final class Anger extends CardImpl { - private static final String ruleText = "As long as Anger is in your graveyard and you control a Mountain, creatures you control have haste"; - - private static final FilterControlledPermanent filter = new FilterControlledPermanent("Mountain"); - - static { - filter.add(CardType.LAND.getPredicate()); - filter.add(SubType.MOUNTAIN.getPredicate()); - } + private static final Condition condition = new PermanentsOnTheBattlefieldCondition(new FilterControlledPermanent(SubType.MOUNTAIN)); public Anger(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); this.subtype.add(SubType.INCARNATION); this.power = new MageInt(2); @@ -44,11 +37,16 @@ public final class Anger extends CardImpl { this.addAbility(HasteAbility.getInstance()); // As long as Anger is in your graveyard and you control a Mountain, creatures you control have haste - ContinuousEffect effect = new GainAbilityControlledEffect(HasteAbility.getInstance(), - Duration.WhileOnBattlefield, new FilterCreaturePermanent()); - ConditionalContinuousEffect angerEffect = new ConditionalContinuousEffect(effect, - new PermanentsOnTheBattlefieldCondition(filter), ruleText); - this.addAbility(new SimpleStaticAbility(Zone.GRAVEYARD, angerEffect)); + this.addAbility(new SimpleStaticAbility( + Zone.GRAVEYARD, + new ConditionalContinuousEffect( + new GainAbilityControlledEffect( + HasteAbility.getInstance(), Duration.WhileOnBattlefield, + StaticFilters.FILTER_PERMANENT_CREATURE + ), condition, "as long as this card is in your graveyard " + + "and you control a Mountain, creatures you control have haste" + ) + )); } private Anger(final Anger card) { diff --git a/Mage.Sets/src/mage/cards/a/ArchaeomancersMap.java b/Mage.Sets/src/mage/cards/a/ArchaeomancersMap.java index 27880770ad5..27cfcac06b0 100644 --- a/Mage.Sets/src/mage/cards/a/ArchaeomancersMap.java +++ b/Mage.Sets/src/mage/cards/a/ArchaeomancersMap.java @@ -4,7 +4,6 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.Condition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; import mage.cards.CardImpl; @@ -28,7 +27,7 @@ import java.util.UUID; public final class ArchaeomancersMap extends CardImpl { private static final FilterCard filter = new FilterCard("basic Plains cards"); - private static final FilterPermanent filter2 = new FilterLandPermanent(); + private static final FilterPermanent filter2 = new FilterLandPermanent("a land an opponent controls"); static { filter.add(SubType.PLAINS.getPredicate()); @@ -45,13 +44,9 @@ public final class ArchaeomancersMap extends CardImpl { )); // Whenever a land enters the battlefield under an opponent's control, if that player controls more lands than you, you may put a land card from your hand onto the battlefield. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldAllTriggeredAbility( - new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_CARD_LAND_A), filter2 - ), ArchaeomancersMapCondition.instance, "Whenever a land enters the battlefield " + - "under an opponent's control, if that player controls more lands than you, " + - "you may put a land card from your hand onto the battlefield." - )); + this.addAbility(new EntersBattlefieldAllTriggeredAbility( + new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_CARD_LAND_A), filter2 + ).withInterveningIf(ArchaeomancersMapCondition.instance)); } private ArchaeomancersMap(final ArchaeomancersMap card) { @@ -78,4 +73,9 @@ enum ArchaeomancersMapCondition implements Condition { source.getControllerId(), source, game ); } + + @Override + public String toString() { + return "that player controls more lands than you"; + } } diff --git a/Mage.Sets/src/mage/cards/b/BlueMagesCane.java b/Mage.Sets/src/mage/cards/b/BlueMagesCane.java index ebebb243889..dfe6702e266 100644 --- a/Mage.Sets/src/mage/cards/b/BlueMagesCane.java +++ b/Mage.Sets/src/mage/cards/b/BlueMagesCane.java @@ -1,10 +1,6 @@ package mage.cards.b; -import java.util.UUID; - -import mage.ApprovingObject; import mage.abilities.Ability; -import mage.abilities.SpellAbility; import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCostsImpl; @@ -13,11 +9,11 @@ import mage.abilities.effects.common.continuous.AddCardSubtypeAttachedEffect; import mage.abilities.effects.common.continuous.BoostEquippedEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.keyword.EquipAbility; -import mage.cards.Card; -import mage.constants.*; import mage.abilities.keyword.JobSelectAbility; +import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.*; import mage.filter.common.FilterInstantOrSorceryCard; import mage.filter.predicate.card.DefendingPlayerOwnsCardPredicate; import mage.game.Game; @@ -25,6 +21,8 @@ import mage.players.Player; import mage.target.common.TargetCardInGraveyard; import mage.util.CardUtil; +import java.util.UUID; + /** * @author balazskristof */ @@ -40,7 +38,7 @@ public final class BlueMagesCane extends CardImpl { public BlueMagesCane(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{U}"); - + this.subtype.add(SubType.EQUIPMENT); // Job select @@ -54,7 +52,7 @@ public final class BlueMagesCane extends CardImpl { Ability attackAbility = new AttacksTriggeredAbility(new BlueMagesCaneEffect()); attackAbility.addTarget(new TargetCardInGraveyard(0, 1, filter)); ability.addEffect(new GainAbilityAttachedEffect(attackAbility, AttachmentType.EQUIPMENT) - .setText("and has \"Whenever this creature attacks, exile up to one target instant or sorcery card from defending player's graveyard. " + .setText(", and has \"Whenever this creature attacks, exile up to one target instant or sorcery card from defending player's graveyard. " + "If you do, copy it. You may cast the copy by paying {3} rather than paying its mana cost.\"") ); this.addAbility(ability); @@ -105,4 +103,4 @@ class BlueMagesCaneEffect extends OneShotEffect { CardUtil.castSingle(controller, source, game, copiedCard, new ManaCostsImpl<>("{3}")); return true; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/c/CloudExSOLDIER.java b/Mage.Sets/src/mage/cards/c/CloudExSOLDIER.java index e2f15389d07..54a598cb1d6 100644 --- a/Mage.Sets/src/mage/cards/c/CloudExSOLDIER.java +++ b/Mage.Sets/src/mage/cards/c/CloudExSOLDIER.java @@ -87,7 +87,7 @@ class CloudExSOLDIEREntersEffect extends OneShotEffect { CloudExSOLDIEREntersEffect() { super(Outcome.Benefit); - staticText = "attach up to one target Equipment you control to {this}"; + staticText = "attach up to one target Equipment you control to it"; } private CloudExSOLDIEREntersEffect(final CloudExSOLDIEREntersEffect effect) { diff --git a/Mage.Sets/src/mage/cards/c/CoinOfFate.java b/Mage.Sets/src/mage/cards/c/CoinOfFate.java index 1abae9c1d69..7e0c284f5ea 100644 --- a/Mage.Sets/src/mage/cards/c/CoinOfFate.java +++ b/Mage.Sets/src/mage/cards/c/CoinOfFate.java @@ -1,13 +1,11 @@ package mage.cards.c; -import java.util.Set; -import java.util.UUID; - import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.ExileFromGraveCost; import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.BecomesMonarchSourceEffect; @@ -24,6 +22,9 @@ import mage.target.TargetCard; import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetOpponent; +import java.util.Set; +import java.util.UUID; + /** * @author balazskristof */ @@ -31,15 +32,16 @@ public final class CoinOfFate extends CardImpl { public CoinOfFate(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{W}"); - + // When this artifact enters, surveil 1. this.addAbility(new EntersBattlefieldTriggeredAbility(new SurveilEffect(1))); // {3}{W},{T}, Exile two creature cards from your graveyard, Sacrifice this artifact: An opponent chooses one of the exiled cards. You put that card on the bottom of your library and return the other to the battlefield tapped. You become the monarch. Ability ability = new SimpleActivatedAbility(new CoinOfFateEffect(), new ManaCostsImpl<>("{3}{W}")).addHint(MonarchHint.instance); - ability.addEffect(new BecomesMonarchSourceEffect()); + ability.addCost(new TapSourceCost()); ability.addCost(new ExileFromGraveCost(new TargetCardInYourGraveyard(2, StaticFilters.FILTER_CARD_CREATURES), true)); ability.addCost(new SacrificeSourceCost()); + ability.addEffect(new BecomesMonarchSourceEffect()); this.addAbility(ability); } @@ -58,7 +60,7 @@ class CoinOfFateEffect extends OneShotEffect { public CoinOfFateEffect() { super(Outcome.Benefit); staticText = "An opponent chooses one of the exiled cards. " - + "You put that card on the bottom of your library and return the other to the battlefield tapped"; + + "You put that card on the bottom of your library and return the other to the battlefield tapped"; } private CoinOfFateEffect(final CoinOfFateEffect effect) { @@ -105,4 +107,4 @@ class CoinOfFateEffect extends OneShotEffect { } return true; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/e/EdgarMasterMachinist.java b/Mage.Sets/src/mage/cards/e/EdgarMasterMachinist.java index 5ff0dcc9046..6f501530948 100644 --- a/Mage.Sets/src/mage/cards/e/EdgarMasterMachinist.java +++ b/Mage.Sets/src/mage/cards/e/EdgarMasterMachinist.java @@ -2,10 +2,12 @@ package mage.cards.e; import mage.MageIdentifier; import mage.MageInt; +import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.common.CastFromGraveyardOnceDuringEachOfYourTurnAbility; import mage.abilities.dynamicvalue.common.GreatestAmongPermanentsValue; import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.InfoEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -36,7 +38,9 @@ public final class EdgarMasterMachinist extends CardImpl { this.toughness = new MageInt(4); // Once during each of your turns, you may cast an artifact spell from your graveyard. If you cast a spell this way, that artifact enters tapped. - this.addAbility(new CastFromGraveyardOnceDuringEachOfYourTurnAbility(filter, MageIdentifier.OnceOnYourTurnCastFromGraveyardEntersTapped)); + Ability ability = new CastFromGraveyardOnceDuringEachOfYourTurnAbility(filter, MageIdentifier.OnceOnYourTurnCastFromGraveyardEntersTapped); + ability.addEffect(new InfoEffect("If you cast a spell this way, that artifact enters tapped")); + this.addAbility(ability); // Tools -- Whenever Edgar attacks, it gets +X/+0 until end of turn, where X is the greatest mana value among artifacts you control. this.addAbility(new AttacksTriggeredAbility( @@ -52,4 +56,4 @@ public final class EdgarMasterMachinist extends CardImpl { public EdgarMasterMachinist copy() { return new EdgarMasterMachinist(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/g/GeneralLeoCristophe.java b/Mage.Sets/src/mage/cards/g/GeneralLeoCristophe.java index d81a9a1e6f9..a42d9e34429 100644 --- a/Mage.Sets/src/mage/cards/g/GeneralLeoCristophe.java +++ b/Mage.Sets/src/mage/cards/g/GeneralLeoCristophe.java @@ -44,7 +44,9 @@ public final class GeneralLeoCristophe extends CardImpl { // When General Leo Cristophe enters, return up to one target creature card with mana value 3 or less from your graveyard to the battlefield. Then put a +1/+1 counter on General Leo Cristophe for each creature you control. Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect()); ability.addTarget(new TargetCardInYourGraveyard(0, 1, filter)); - ability.addEffect(new AddCountersSourceEffect(CounterType.P1P1.createInstance(), CreaturesYouControlCount.instance)); + ability.addEffect(new AddCountersSourceEffect( + CounterType.P1P1.createInstance(), CreaturesYouControlCount.instance + ).setText("Then put a +1/+1 counter on {this} for each creature you control")); this.addAbility(ability.addHint(CreaturesYouControlHint.instance)); } diff --git a/Mage.Sets/src/mage/cards/g/GrahaTiaScionReborn.java b/Mage.Sets/src/mage/cards/g/GrahaTiaScionReborn.java index 4cd50d9f558..7fafb181bf0 100644 --- a/Mage.Sets/src/mage/cards/g/GrahaTiaScionReborn.java +++ b/Mage.Sets/src/mage/cards/g/GrahaTiaScionReborn.java @@ -48,7 +48,7 @@ public final class GrahaTiaScionReborn extends CardImpl { new GrahaTiaScionRebornEffect(), new PayLifeCost( GrahaTiaScionRebornValue.instance, - "pay X life, where X is that spell's mana value" + "X life, where X is that spell's mana value" ) ), StaticFilters.FILTER_SPELL_A_NON_CREATURE, false).setDoOnlyOnceEachTurn(true).withFlavorWord("Throw Wide the Gates")); } diff --git a/Mage.Sets/src/mage/cards/h/HraesvelgrOfTheFirstBrood.java b/Mage.Sets/src/mage/cards/h/HraesvelgrOfTheFirstBrood.java index d9b052fecb4..6f82992ade6 100644 --- a/Mage.Sets/src/mage/cards/h/HraesvelgrOfTheFirstBrood.java +++ b/Mage.Sets/src/mage/cards/h/HraesvelgrOfTheFirstBrood.java @@ -1,26 +1,27 @@ package mage.cards.h; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.combat.CantBeBlockedTargetEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; -import mage.abilities.meta.OrTriggeredAbility; -import mage.constants.SubType; -import mage.constants.SuperType; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.VigilanceAbility; -import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.keyword.WardAbility; +import mage.abilities.meta.OrTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; import mage.constants.Zone; import mage.filter.StaticFilters; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** * @author balazskristof */ @@ -28,7 +29,7 @@ public final class HraesvelgrOfTheFirstBrood extends CardImpl { public HraesvelgrOfTheFirstBrood(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}"); - + this.supertype.add(SuperType.LEGENDARY); this.subtype.add(SubType.ELDER); this.subtype.add(SubType.DRAGON); @@ -52,7 +53,7 @@ public final class HraesvelgrOfTheFirstBrood extends CardImpl { ); ability.addEffect(new CantBeBlockedTargetEffect().setText("can't be blocked this turn").concatBy("and")); ability.addTarget(new TargetCreaturePermanent()); - this.addAbility(ability); + this.addAbility(ability.withFlavorWord("Shiva's Aid")); } private HraesvelgrOfTheFirstBrood(final HraesvelgrOfTheFirstBrood card) { diff --git a/Mage.Sets/src/mage/cards/i/InterceptorShadowsHound.java b/Mage.Sets/src/mage/cards/i/InterceptorShadowsHound.java index d585ea6645d..cf9042d15d1 100644 --- a/Mage.Sets/src/mage/cards/i/InterceptorShadowsHound.java +++ b/Mage.Sets/src/mage/cards/i/InterceptorShadowsHound.java @@ -36,7 +36,7 @@ public final class InterceptorShadowsHound extends CardImpl { // Assassins you control have menace. this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( - new MenaceAbility(false), Duration.WhileControlled, filter + new MenaceAbility(false), Duration.WhileOnBattlefield, filter ))); // Whenever you attack with one or more legendary creatures, you may pay {2}{B}. If you do, return this card from your graveyard to the battlefield tapped and attacking. diff --git a/Mage.Sets/src/mage/cards/l/LordJyscalGuado.java b/Mage.Sets/src/mage/cards/l/LordJyscalGuado.java index 4303d1247ca..f3705c78c4b 100644 --- a/Mage.Sets/src/mage/cards/l/LordJyscalGuado.java +++ b/Mage.Sets/src/mage/cards/l/LordJyscalGuado.java @@ -10,10 +10,7 @@ import mage.abilities.keyword.FlyingAbility; import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.SuperType; -import mage.constants.WatcherScope; +import mage.constants.*; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; @@ -41,7 +38,7 @@ public final class LordJyscalGuado extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // At the beginning of each end step, if you put a counter on a creature this turn, investigate. - this.addAbility(new BeginningOfEndStepTriggeredAbility(new InvestigateEffect()) + this.addAbility(new BeginningOfEndStepTriggeredAbility(TargetController.ANY, new InvestigateEffect(), false) .withInterveningIf(LordJyscalGuadoCondition.instance) .addHint(LordJyscalGuadoCondition.getHint()), new LordJyscalGuadoWatcher() diff --git a/Mage.Sets/src/mage/cards/s/SOLDIERMilitaryProgram.java b/Mage.Sets/src/mage/cards/s/SOLDIERMilitaryProgram.java index 3ce4752aedc..eb6677c5a37 100644 --- a/Mage.Sets/src/mage/cards/s/SOLDIERMilitaryProgram.java +++ b/Mage.Sets/src/mage/cards/s/SOLDIERMilitaryProgram.java @@ -31,6 +31,7 @@ public final class SOLDIERMilitaryProgram extends CardImpl { // At the beginning of combat on your turn, choose one. If you control a commander, you may choose both instead. // * Create a 1/1 white Soldier creature token. Ability ability = new BeginningOfCombatTriggeredAbility(new CreateTokenEffect(new SoldierToken())); + ability.getModes().setChooseText("choose one. If you control a commander, you may choose both instead."); ability.getModes().setMoreCondition(2, ControlACommanderCondition.instance); // * Put a +1/+1 counter on each of up to two Soldiers you control. diff --git a/Mage.Sets/src/mage/cards/s/SephirothFallenHero.java b/Mage.Sets/src/mage/cards/s/SephirothFallenHero.java index 62be3e2c439..c69a8801ef1 100644 --- a/Mage.Sets/src/mage/cards/s/SephirothFallenHero.java +++ b/Mage.Sets/src/mage/cards/s/SephirothFallenHero.java @@ -28,12 +28,10 @@ import java.util.UUID; */ public final class SephirothFallenHero extends CardImpl { - private static final FilterPermanent filter = new FilterControlledCreaturePermanent(); - private static final FilterPermanent filter2 = new FilterPermanent("a modified creature"); + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("a modified creature"); static { filter.add(ModifiedPredicate.instance); - filter2.add(ModifiedPredicate.instance); } public SephirothFallenHero(UUID ownerId, CardSetInfo setInfo) { @@ -48,7 +46,9 @@ public final class SephirothFallenHero extends CardImpl { // Jenova Cells -- Whenever Sephiroth attacks, you may put a cell counter on target creature. Until end of turn, each modified creature you control has base power and toughness 7/5. Ability ability = new AttacksTriggeredAbility(new SephirothFallenHeroEffect()); - ability.addEffect(new SetBasePowerToughnessAllEffect(7, 5, Duration.EndOfTurn, filter)); + ability.addEffect(new SetBasePowerToughnessAllEffect( + 7, 5, Duration.EndOfTurn, filter + ).setText("until end of turn, each modified creature you control has base power and toughness 7/5")); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability.withFlavorWord("Jenova Cells")); @@ -56,7 +56,7 @@ public final class SephirothFallenHero extends CardImpl { ability = new SimpleActivatedAbility( Zone.GRAVEYARD, new ReturnSourceFromGraveyardToBattlefieldEffect(true), new GenericManaCost(3) ); - ability.addCost(new SacrificeTargetCost(filter2)); + ability.addCost(new SacrificeTargetCost(filter)); this.addAbility(ability.withFlavorWord("The Reunion")); } diff --git a/Mage.Sets/src/mage/cards/t/TataruTaru.java b/Mage.Sets/src/mage/cards/t/TataruTaru.java index e9b72ed0ea7..5d7301f0277 100644 --- a/Mage.Sets/src/mage/cards/t/TataruTaru.java +++ b/Mage.Sets/src/mage/cards/t/TataruTaru.java @@ -37,7 +37,7 @@ public final class TataruTaru extends CardImpl { this.toughness = new MageInt(3); // When Tataru Taru enters, you draw a card and target opponent may draw a card. - Ability ability = new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1)); + Ability ability = new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1, true)); ability.addEffect(new TataruTaruEffect()); ability.addTarget(new TargetOpponent()); this.addAbility(ability); @@ -68,6 +68,11 @@ enum TataruTaruCondition implements Condition { .map(game::isActivePlayer) .orElse(true); } + + @Override + public String toString() { + return "it isn't that player's turn"; + } } class TataruTaruEffect extends OneShotEffect { diff --git a/Mage.Sets/src/mage/cards/t/TromellSeymoursButler.java b/Mage.Sets/src/mage/cards/t/TromellSeymoursButler.java index 53baa22c379..3194755eb18 100644 --- a/Mage.Sets/src/mage/cards/t/TromellSeymoursButler.java +++ b/Mage.Sets/src/mage/cards/t/TromellSeymoursButler.java @@ -21,7 +21,6 @@ import mage.constants.SubType; import mage.constants.SuperType; import mage.counters.CounterType; import mage.filter.FilterPermanent; -import mage.filter.StaticFilters; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.permanent.EnteredThisTurnPredicate; import mage.filter.predicate.permanent.TokenPredicate; @@ -34,6 +33,12 @@ import java.util.UUID; */ public final class TromellSeymoursButler extends CardImpl { + private static final FilterPermanent filter = new FilterPermanent("nontoken creature"); + + static { + filter.add(TokenPredicate.FALSE); + } + public TromellSeymoursButler(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); @@ -45,8 +50,7 @@ public final class TromellSeymoursButler extends CardImpl { // Each other nontoken creature you control enters with an additional +1/+1 counter on it. this.addAbility(new SimpleStaticAbility(new EntersWithCountersControlledEffect( - StaticFilters.FILTER_CONTROLLED_CREATURE_NON_TOKEN, - CounterType.P1P1.createInstance(), true + filter, CounterType.P1P1.createInstance(), true ))); // {1}, {T}: Proliferate X times, where X is the number of nontoken creatures you control that entered this turn. diff --git a/Mage.Sets/src/mage/cards/u/UmaroRagingYeti.java b/Mage.Sets/src/mage/cards/u/UmaroRagingYeti.java index 65802796d48..1fe45cf8bfd 100644 --- a/Mage.Sets/src/mage/cards/u/UmaroRagingYeti.java +++ b/Mage.Sets/src/mage/cards/u/UmaroRagingYeti.java @@ -42,7 +42,7 @@ public final class UmaroRagingYeti extends CardImpl { // * Other creatures you control get +3/+0 and gain trample until end of turn. Ability ability = new BeginningOfCombatTriggeredAbility(new BoostControlledEffect( 3, 0, Duration.EndOfTurn, true - )); + ).setText("other creatures you control get +3/+0")); ability.addEffect(new GainAbilityControlledEffect( TrampleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURE, true diff --git a/Mage.Sets/src/mage/cards/v/VincentVengefulAtoner.java b/Mage.Sets/src/mage/cards/v/VincentVengefulAtoner.java index 9667d82c503..40dbccab205 100644 --- a/Mage.Sets/src/mage/cards/v/VincentVengefulAtoner.java +++ b/Mage.Sets/src/mage/cards/v/VincentVengefulAtoner.java @@ -44,7 +44,7 @@ public final class VincentVengefulAtoner extends CardImpl { // Chaos -- Whenever Vincent deals combat damage to an opponent, it deals that much damage to each other opponent if Vincent's power is 7 or greater. this.addAbility(new DealsDamageToOpponentTriggeredAbility( new VincentVengefulAtonerEffect(), false, true, true - )); + ).withFlavorWord("Chaos")); } private VincentVengefulAtoner(final VincentVengefulAtoner card) { diff --git a/Mage.Sets/src/mage/cards/w/WakkaDevotedGuardian.java b/Mage.Sets/src/mage/cards/w/WakkaDevotedGuardian.java index 35c0389ef5f..c76978d4db2 100644 --- a/Mage.Sets/src/mage/cards/w/WakkaDevotedGuardian.java +++ b/Mage.Sets/src/mage/cards/w/WakkaDevotedGuardian.java @@ -69,7 +69,7 @@ public final class WakkaDevotedGuardian extends CardImpl { // Blitzball Captain -- At the beginning of your end step, if a counter was put on Wakka this turn, put a +1/+1 counter on each other creature you control. this.addAbility(new BeginningOfEndStepTriggeredAbility(new AddCountersAllEffect( CounterType.P1P1.createInstance(), StaticFilters.FILTER_OTHER_CONTROLLED_CREATURE - )).withInterveningIf(WakkaDevotedGuardianCondition.instance), new WakkaDevotedGuardianWatcher()); + )).withInterveningIf(WakkaDevotedGuardianCondition.instance).withFlavorWord("Blitzball Captain"), new WakkaDevotedGuardianWatcher()); } private WakkaDevotedGuardian(final WakkaDevotedGuardian card) { diff --git a/Mage.Sets/src/mage/cards/w/WreckingBallArm.java b/Mage.Sets/src/mage/cards/w/WreckingBallArm.java index 070a0f47d48..54b40be49e1 100644 --- a/Mage.Sets/src/mage/cards/w/WreckingBallArm.java +++ b/Mage.Sets/src/mage/cards/w/WreckingBallArm.java @@ -32,7 +32,7 @@ public final class WreckingBallArm extends CardImpl { )); ability.addEffect(new CantBeBlockedByCreaturesAttachedEffect( Duration.WhileControlled, DauntAbility.getFilter(), AttachmentType.EQUIPMENT - )); + ).setText("and can't be blocked by creatures with power 2 or less")); this.addAbility(ability); // Equip legendary creature {3} diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index 864939b06d5..1dd2eb42a95 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -71,7 +71,7 @@ public class VerifyCardDataTest { private static final Logger logger = Logger.getLogger(VerifyCardDataTest.class); - private static final String FULL_ABILITIES_CHECK_SET_CODES = "FIN"; // check ability text due mtgjson, can use multiple sets like MAT;CMD or * for all + private static final String FULL_ABILITIES_CHECK_SET_CODES = "FIC"; // check ability text due mtgjson, can use multiple sets like MAT;CMD or * for all private static final boolean CHECK_ONLY_ABILITIES_TEXT = false; // use when checking text locally, suppresses unnecessary checks and output messages private static final boolean CHECK_COPYABLE_FIELDS = true; // disable for better verify test performance diff --git a/Mage/src/main/java/mage/abilities/common/WonCoinFlipControllerTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/WonCoinFlipControllerTriggeredAbility.java index 2510d4f8c4e..be38f9ee93b 100644 --- a/Mage/src/main/java/mage/abilities/common/WonCoinFlipControllerTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/WonCoinFlipControllerTriggeredAbility.java @@ -22,6 +22,7 @@ public class WonCoinFlipControllerTriggeredAbility extends TriggeredAbilityImpl public WonCoinFlipControllerTriggeredAbility(Zone zone, Effect effect, boolean optional) { super(zone, effect, optional); + this.setTriggerPhrase("Whenever you win a coin flip, "); } private WonCoinFlipControllerTriggeredAbility(final WonCoinFlipControllerTriggeredAbility ability) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/counter/MoveCounterTargetsEffect.java b/Mage/src/main/java/mage/abilities/effects/common/counter/MoveCounterTargetsEffect.java index bda45285c45..0c64ca5e722 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/counter/MoveCounterTargetsEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/counter/MoveCounterTargetsEffect.java @@ -103,7 +103,7 @@ public class MoveCounterTargetsEffect extends OneShotEffect { .ofNullable(counterType) .map(c -> counterType.getArticle() + ' ' + counterType.getName()) .orElse("a")); - sb.append(" counter from target "); + sb.append(" counter from "); sb.append(mode.getTargets().get(0).getDescription()); sb.append(" onto "); sb.append(mode.getTargets().get(1).getDescription()); diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/ScryEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/ScryEffect.java index f1c7ffae874..ac4c1b6397f 100644 --- a/Mage/src/main/java/mage/abilities/effects/keyword/ScryEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/keyword/ScryEffect.java @@ -59,7 +59,7 @@ public class ScryEffect extends OneShotEffect { private String generateText() { StringBuilder sb = new StringBuilder("scry "); String value = amount.toString(); - sb.append(CardUtil.numberToText(value)); + sb.append(value); String message = amount.getMessage(); if (!message.isEmpty()) { sb.append(value.equals("X") ? ", where X is " : " for each ");