diff --git a/Mage.Sets/src/mage/cards/a/AlignedHeart.java b/Mage.Sets/src/mage/cards/a/AlignedHeart.java index f031fd1ead0..73104b645a2 100644 --- a/Mage.Sets/src/mage/cards/a/AlignedHeart.java +++ b/Mage.Sets/src/mage/cards/a/AlignedHeart.java @@ -27,7 +27,7 @@ public final class AlignedHeart extends CardImpl { // Flurry -- Whenever you cast your second spell each turn, put a rally counter on this enchantment. Then create a 1/1 white Monk creature token with prowess for each rally counter on it. Ability ability = new FlurryAbility(new AddCountersSourceEffect(CounterType.RALLY.createInstance())); ability.addEffect(new CreateTokenEffect(new MonasteryMentorToken(), xValue) - .setText("then create a 1/1 white Monk creature token with prowess for each rally counter on it")); + .setText("Then create a 1/1 white Monk creature token with prowess for each rally counter on it")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/a/AxebaneGuardian.java b/Mage.Sets/src/mage/cards/a/AxebaneGuardian.java index c074b1858d4..052fcaf3a62 100644 --- a/Mage.Sets/src/mage/cards/a/AxebaneGuardian.java +++ b/Mage.Sets/src/mage/cards/a/AxebaneGuardian.java @@ -1,10 +1,11 @@ - package mage.cards.a; -import java.util.UUID; import mage.MageInt; import mage.Mana; +import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.hint.Hint; +import mage.abilities.hint.ValueHint; import mage.abilities.keyword.DefenderAbility; import mage.abilities.mana.DynamicManaAbility; import mage.cards.CardImpl; @@ -15,20 +16,24 @@ import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.mageobject.AbilityPredicate; +import java.util.UUID; + /** - * * @author Plopman */ public final class AxebaneGuardian extends CardImpl { - private static final FilterPermanent filter = new FilterControlledCreaturePermanent("creatures with defender you control"); + private static final FilterPermanent filter = new FilterControlledCreaturePermanent(); - static{ + static { filter.add(new AbilityPredicate(DefenderAbility.class)); } + private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(filter); + private static final Hint hint = new ValueHint("Creatures you control with defender", xValue); + public AxebaneGuardian(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.DRUID); @@ -39,8 +44,10 @@ public final class AxebaneGuardian extends CardImpl { this.addAbility(DefenderAbility.getInstance()); // {tap}: Add X mana in any combination of colors, where X is the number of creatures with defender you control. - this.addAbility(new DynamicManaAbility(new Mana(0, 0, 0, 0,0, 0,1, 0), new PermanentsOnBattlefieldCount(filter), - "Add X mana in any combination of colors, where X is the number of creatures with defender you control.")); + this.addAbility(new DynamicManaAbility( + Mana.AnyMana(1), xValue, "Add X mana in any combination of colors, " + + "where X is the number of creatures you control with defender." + ).addHint(hint)); } private AxebaneGuardian(final AxebaneGuardian card) { diff --git a/Mage.Sets/src/mage/cards/b/BecomeTheAvalanche.java b/Mage.Sets/src/mage/cards/b/BecomeTheAvalanche.java index b8c2d218264..6131c6c2096 100644 --- a/Mage.Sets/src/mage/cards/b/BecomeTheAvalanche.java +++ b/Mage.Sets/src/mage/cards/b/BecomeTheAvalanche.java @@ -40,7 +40,7 @@ public final class BecomeTheAvalanche extends CardImpl { this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(xValue)); this.getSpellAbility().addEffect(new BoostControlledEffect( CardsInControllerHandCount.ANY, CardsInControllerHandCount.ANY, Duration.EndOfTurn - )); + ).setText("Then creatures you control get +X/+X until end of turn, where X is the number of cards in your hand")); this.getSpellAbility().addHint(hint); } diff --git a/Mage.Sets/src/mage/cards/b/BlightPile.java b/Mage.Sets/src/mage/cards/b/BlightPile.java index dc42b303d03..a9b7347d4ce 100644 --- a/Mage.Sets/src/mage/cards/b/BlightPile.java +++ b/Mage.Sets/src/mage/cards/b/BlightPile.java @@ -33,7 +33,7 @@ public final class BlightPile extends CardImpl { filter.add(new AbilityPredicate(DefenderAbility.class)); } - private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(filter); + private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(filter, null); private static final Hint hint = new ValueHint("Creatures with defender you control", xValue); public BlightPile(UUID ownerId, CardSetInfo setInfo) { @@ -47,7 +47,11 @@ public final class BlightPile extends CardImpl { this.addAbility(DefenderAbility.getInstance()); // {2}{B}, {T}: Each opponent loses X life, where X is the number of creatures with defender you control. - Ability ability = new SimpleActivatedAbility(new LoseLifeOpponentsEffect(xValue), new ManaCostsImpl<>("{2}{B}")); + Ability ability = new SimpleActivatedAbility( + new LoseLifeOpponentsEffect(xValue) + .setText("each opponent loses X life, where X is the number of creatures with defender you control"), + new ManaCostsImpl<>("{2}{B}") + ); ability.addCost(new TapSourceCost()); this.addAbility(ability.addHint(hint)); } diff --git a/Mage.Sets/src/mage/cards/b/BoneDevourer.java b/Mage.Sets/src/mage/cards/b/BoneDevourer.java index 79921a60ede..5b1908766b1 100644 --- a/Mage.Sets/src/mage/cards/b/BoneDevourer.java +++ b/Mage.Sets/src/mage/cards/b/BoneDevourer.java @@ -48,7 +48,7 @@ public final class BoneDevourer extends CardImpl { // When this creature dies, you draw X cards and you lose X life, where X is the number of +1/+1 counters on it. Ability ability = new DiesSourceTriggeredAbility(new DrawCardSourceControllerEffect(xValue).setText("you draw X cards")); - ability.addEffect(new LoseLifeSourceControllerEffect(xValue)); + ability.addEffect(new LoseLifeSourceControllerEffect(xValue).setText("and you lose X life, where X is the number of +1/+1 counters on it")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/c/ColossalGraveReaver.java b/Mage.Sets/src/mage/cards/c/ColossalGraveReaver.java index 3b130b45c27..25eb35f6cf4 100644 --- a/Mage.Sets/src/mage/cards/c/ColossalGraveReaver.java +++ b/Mage.Sets/src/mage/cards/c/ColossalGraveReaver.java @@ -1,11 +1,5 @@ package mage.cards.c; -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; -import java.util.UUID; -import java.util.stream.Collectors; - import mage.MageInt; import mage.abilities.Ability; import mage.abilities.BatchTriggeredAbility; @@ -13,11 +7,11 @@ import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.MillCardsControllerEffect; +import mage.abilities.keyword.FlyingAbility; import mage.cards.*; +import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; -import mage.abilities.keyword.FlyingAbility; -import mage.constants.CardType; import mage.constants.Zone; import mage.filter.FilterCard; import mage.game.Game; @@ -28,15 +22,20 @@ import mage.players.Player; import mage.target.TargetCard; import mage.target.targetpointer.FixedTargets; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; + /** - * * @author Grath */ public final class ColossalGraveReaver extends CardImpl { public ColossalGraveReaver(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{6}{B}{G}"); - + this.subtype.add(SubType.DRAGON); this.power = new MageInt(7); this.toughness = new MageInt(6); @@ -159,6 +158,6 @@ class ColossalGraveReaverTriggeredAbility extends TriggeredAbilityImpl implement @Override public String getRule() { return "Whenever one or more creature cards are put into your graveyard " + - "from your library, put one of them onto the battlefield tapped."; + "from your library, put one of them onto the battlefield."; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/e/EliminateTheCompetition.java b/Mage.Sets/src/mage/cards/e/EliminateTheCompetition.java index 7659d17b37d..2e474215c33 100644 --- a/Mage.Sets/src/mage/cards/e/EliminateTheCompetition.java +++ b/Mage.Sets/src/mage/cards/e/EliminateTheCompetition.java @@ -22,7 +22,7 @@ public final class EliminateTheCompetition extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{B}"); // As an additional cost to cast Eliminate the Competition, sacrifice X creatures. - this.getSpellAbility().addCost(new SacrificeXTargetCost(new FilterControlledCreaturePermanent("creatures"), true)); + this.getSpellAbility().addCost(new SacrificeXTargetCost(new FilterControlledCreaturePermanent("creatures"), false)); // Destroy X target creatures. Effect effect = new DestroyTargetEffect(); diff --git a/Mage.Sets/src/mage/cards/f/FloralEvoker.java b/Mage.Sets/src/mage/cards/f/FloralEvoker.java index 29a9d87389b..5e104f4f6ee 100644 --- a/Mage.Sets/src/mage/cards/f/FloralEvoker.java +++ b/Mage.Sets/src/mage/cards/f/FloralEvoker.java @@ -40,7 +40,7 @@ public final class FloralEvoker extends CardImpl { new ReturnFromGraveyardToBattlefieldTargetEffect(true), new ManaCostsImpl<>("{G}") ); ability.addCost(new DiscardTargetCost(new TargetCardInHand(StaticFilters.FILTER_CARD_CREATURE_A))); - ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_LAND)); + ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_LAND_FROM_YOUR_GRAVEYARD)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/f/FrontierSiege.java b/Mage.Sets/src/mage/cards/f/FrontierSiege.java index c18360d64e2..a05e0807877 100644 --- a/Mage.Sets/src/mage/cards/f/FrontierSiege.java +++ b/Mage.Sets/src/mage/cards/f/FrontierSiege.java @@ -16,7 +16,7 @@ import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.FilterPermanent; import mage.filter.StaticFilters; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.mageobject.AbilityPredicate; import mage.game.Game; import mage.game.events.GameEvent; @@ -30,10 +30,9 @@ import java.util.UUID; */ public final class FrontierSiege extends CardImpl { - private static final FilterPermanent filter = new FilterCreaturePermanent("a creature with flying you control"); + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("a creature you control with flying"); static { - filter.add(TargetController.YOU.getControllerPredicate()); filter.add(new AbilityPredicate(FlyingAbility.class)); } @@ -96,6 +95,7 @@ class FrontierSiegeFightEffect extends OneShotEffect { FrontierSiegeFightEffect() { super(Outcome.Damage); + staticText = "have it fight target creature you don't control"; } private FrontierSiegeFightEffect(final FrontierSiegeFightEffect effect) { diff --git a/Mage.Sets/src/mage/cards/g/Gravecrawler.java b/Mage.Sets/src/mage/cards/g/Gravecrawler.java index 0fde6276bfe..cc429b564d4 100644 --- a/Mage.Sets/src/mage/cards/g/Gravecrawler.java +++ b/Mage.Sets/src/mage/cards/g/Gravecrawler.java @@ -55,7 +55,7 @@ class GravecrawlerPlayEffect extends AsThoughEffectImpl { public GravecrawlerPlayEffect() { super(AsThoughEffectType.CAST_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfGame, Outcome.Benefit); - staticText = "You may cast {this} from your graveyard as long as you control a Zombie"; + staticText = "You may cast this card from your graveyard as long as you control a Zombie"; } private GravecrawlerPlayEffect(final GravecrawlerPlayEffect effect) { @@ -85,4 +85,4 @@ class GravecrawlerPlayEffect extends AsThoughEffectImpl { return false; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/g/GrenzoHavocRaiser.java b/Mage.Sets/src/mage/cards/g/GrenzoHavocRaiser.java index 6ef763df4e2..755c7b2dc10 100644 --- a/Mage.Sets/src/mage/cards/g/GrenzoHavocRaiser.java +++ b/Mage.Sets/src/mage/cards/g/GrenzoHavocRaiser.java @@ -124,7 +124,7 @@ class GrenzoHavocRaiserEffect extends OneShotEffect { GrenzoHavocRaiserEffect() { super(Outcome.PutCreatureInPlay); - this.staticText = "exile the top card of that player's library. Until end of turn, you may cast that card and you may spend mana as though it were mana of any color to cast it"; + this.staticText = "exile the top card of that player's library. Until end of turn, you may cast that card and you may spend mana as though it were mana of any color to cast that spell"; } private GrenzoHavocRaiserEffect(final GrenzoHavocRaiserEffect effect) { diff --git a/Mage.Sets/src/mage/cards/j/JaradGolgariLichLord.java b/Mage.Sets/src/mage/cards/j/JaradGolgariLichLord.java index 9da62d017c8..ef654efc9a5 100644 --- a/Mage.Sets/src/mage/cards/j/JaradGolgariLichLord.java +++ b/Mage.Sets/src/mage/cards/j/JaradGolgariLichLord.java @@ -1,8 +1,8 @@ package mage.cards.j; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; +import mage.abilities.assignment.common.SubTypeAssignment; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.SacrificeTargetCost; @@ -13,27 +13,30 @@ import mage.abilities.dynamicvalue.common.SacrificeCostCreaturesPower; import mage.abilities.effects.common.LoseLifeOpponentsEffect; import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.hint.Hint; +import mage.abilities.hint.ValueHint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; +import mage.filter.FilterPermanent; import mage.filter.StaticFilters; -import mage.filter.common.FilterControlledPermanent; -import mage.target.common.TargetControlledCreaturePermanent; -import mage.target.common.TargetControlledPermanent; +import mage.filter.predicate.Predicates; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.common.TargetSacrifice; + +import java.util.Objects; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; /** - * * @author LevelX2 */ public final class JaradGolgariLichLord extends CardImpl { - private static final FilterControlledPermanent filterSwamp = new FilterControlledPermanent("a Swamp"); - private static final FilterControlledPermanent filterForest = new FilterControlledPermanent("a Forest"); - - static { - filterSwamp.add(SubType.SWAMP.getPredicate()); - filterForest.add(SubType.FOREST.getPredicate()); - } + private static final DynamicValue xValue = new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_CREATURE); + private static final Hint hint = new ValueHint("Creatures in your graveyard", xValue); public JaradGolgariLichLord(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}{B}{G}{G}"); @@ -45,20 +48,20 @@ public final class JaradGolgariLichLord extends CardImpl { this.toughness = new MageInt(2); // Jarad, Golgari Lich Lord gets +1/+1 for each creature card in your graveyard. - DynamicValue amount = new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_CREATURE); - Ability ability = new SimpleStaticAbility(new BoostSourceEffect(amount, amount, Duration.WhileOnBattlefield)); - this.addAbility(ability); + this.addAbility(new SimpleStaticAbility(new BoostSourceEffect(xValue, xValue, Duration.WhileOnBattlefield)).addHint(hint)); // {1}{B}{G}, Sacrifice another creature: Each opponent loses life equal to the sacrificed creature's power. - ability = new SimpleActivatedAbility(new LoseLifeOpponentsEffect(SacrificeCostCreaturesPower.instance), new ManaCostsImpl<>("{1}{B}{G}")); + Ability ability = new SimpleActivatedAbility(new LoseLifeOpponentsEffect(SacrificeCostCreaturesPower.instance) + .setText("each opponent loses life equal to the sacrificed creature's power"), new ManaCostsImpl<>("{1}{B}{G}")); ability.addCost(new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE)); this.addAbility(ability); // Sacrifice a Swamp and a Forest: Return Jarad from your graveyard to your hand. - ability = new SimpleActivatedAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), - new SacrificeTargetCost(filterSwamp)); - ability.addCost(new SacrificeTargetCost(filterForest)); - this.addAbility(ability); + this.addAbility(new SimpleActivatedAbility( + Zone.GRAVEYARD, + new ReturnSourceFromGraveyardToHandEffect(), + new SacrificeTargetCost(new JaradGolgariLichLordTarget()) + )); } @@ -71,3 +74,43 @@ public final class JaradGolgariLichLord extends CardImpl { return new JaradGolgariLichLord(this); } } + +class JaradGolgariLichLordTarget extends TargetSacrifice { + + private static final FilterPermanent filter = new FilterPermanent("a Swamp and a Forest"); + + static { + filter.add(Predicates.or( + SubType.SWAMP.getPredicate(), + SubType.FOREST.getPredicate() + )); + } + + private static final SubTypeAssignment subtypeAssigner = new SubTypeAssignment(SubType.SWAMP, SubType.FOREST); + + JaradGolgariLichLordTarget() { + super(2, 2, filter); + } + + private JaradGolgariLichLordTarget(final JaradGolgariLichLordTarget target) { + super(target); + } + + @Override + public boolean canTarget(UUID playerId, UUID id, Ability source, Game game) { + if (!super.canTarget(playerId, id, source, game)) { + return false; + } + if (this.getTargets().isEmpty()) { + return true; + } + Set permanents = this + .getTargets() + .stream() + .map(game::getPermanent) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + permanents.add(game.getPermanent(id)); + return subtypeAssigner.getRoleCount(permanents, game) >= permanents.size(); + } +} diff --git a/Mage.Sets/src/mage/cards/l/LethalScheme.java b/Mage.Sets/src/mage/cards/l/LethalScheme.java index 2d54ccb2b51..03c07511b81 100644 --- a/Mage.Sets/src/mage/cards/l/LethalScheme.java +++ b/Mage.Sets/src/mage/cards/l/LethalScheme.java @@ -54,7 +54,7 @@ class LethalSchemeEffect extends OneShotEffect { LethalSchemeEffect() { super(Outcome.Benefit); - this.staticText = "Each creature that convoked {this} connives."; + this.staticText = "Each creature that convoked this spell connives."; } private LethalSchemeEffect(final LethalSchemeEffect effect) { diff --git a/Mage.Sets/src/mage/cards/l/LoyalApprentice.java b/Mage.Sets/src/mage/cards/l/LoyalApprentice.java index e918b817627..8ef7bab506a 100644 --- a/Mage.Sets/src/mage/cards/l/LoyalApprentice.java +++ b/Mage.Sets/src/mage/cards/l/LoyalApprentice.java @@ -53,6 +53,7 @@ class LoyalApprenticeEffect extends OneShotEffect { LoyalApprenticeEffect() { super(Outcome.Benefit); + staticText = "create a 1/1 colorless Thopter artifact creature token with flying. That token gains haste until end of turn"; } private LoyalApprenticeEffect(final LoyalApprenticeEffect effect) { diff --git a/Mage.Sets/src/mage/cards/r/RampartArchitect.java b/Mage.Sets/src/mage/cards/r/RampartArchitect.java index fd1a0bfde46..eb022ce2ccb 100644 --- a/Mage.Sets/src/mage/cards/r/RampartArchitect.java +++ b/Mage.Sets/src/mage/cards/r/RampartArchitect.java @@ -44,7 +44,7 @@ public final class RampartArchitect extends CardImpl { // Whenever a creature you control with defender dies, you may search your library for a basic land card, put that card onto the battlefield tapped, then shuffle. this.addAbility(new DiesCreatureTriggeredAbility(new SearchLibraryPutInPlayEffect( - new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND), true + new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND), true, true ), true, filter)); } diff --git a/Mage.Sets/src/mage/cards/r/ReunionOfTheHouse.java b/Mage.Sets/src/mage/cards/r/ReunionOfTheHouse.java index 34f954a2b09..50f9f129c53 100644 --- a/Mage.Sets/src/mage/cards/r/ReunionOfTheHouse.java +++ b/Mage.Sets/src/mage/cards/r/ReunionOfTheHouse.java @@ -3,6 +3,7 @@ package mage.cards.r; import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; +import mage.abilities.effects.common.ExileSpellEffect; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -28,6 +29,7 @@ public final class ReunionOfTheHouse extends CardImpl { // Return any number of target creature cards with total power 10 or less from your graveyard to the battlefield. Exile Reunion of the House. this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect()); this.getSpellAbility().addTarget(new ReunionOfTheHouseTarget()); + this.getSpellAbility().addEffect(new ExileSpellEffect()); } private ReunionOfTheHouse(final ReunionOfTheHouse card) { diff --git a/Mage.Sets/src/mage/cards/r/RiverKelpie.java b/Mage.Sets/src/mage/cards/r/RiverKelpie.java index d7139f73010..7c194aee656 100644 --- a/Mage.Sets/src/mage/cards/r/RiverKelpie.java +++ b/Mage.Sets/src/mage/cards/r/RiverKelpie.java @@ -76,7 +76,7 @@ class RiverKelpieTriggeredAbility extends TriggeredAbilityImpl { @Override public String getRule() { - return "Whenever {this} or another permanent enters the battlefield from a graveyard, draw a card."; + return "Whenever {this} or another permanent enters from a graveyard, draw a card."; } } diff --git a/Mage.Sets/src/mage/cards/t/TocasiasWelcome.java b/Mage.Sets/src/mage/cards/t/TocasiasWelcome.java index 3afaf39fb34..a83bf4f499c 100644 --- a/Mage.Sets/src/mage/cards/t/TocasiasWelcome.java +++ b/Mage.Sets/src/mage/cards/t/TocasiasWelcome.java @@ -27,10 +27,9 @@ public final class TocasiasWelcome extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}"); // Whenever one or more creatures with mana value 3 or less enter the battlefield under your control, draw a card. This ability triggers only once each turn. - this.addAbility(new EntersBattlefieldControlledTriggeredAbility( - new DrawCardSourceControllerEffect(1), filter - ).setTriggersLimitEachTurn(1).setTriggerPhrase("Whenever one or more creatures with mana value 3 " + - "or less enter the battlefield under your control, ")); + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new DrawCardSourceControllerEffect(1), filter) + .setTriggersLimitEachTurn(1) + .setTriggerPhrase("Whenever one or more creatures you control with mana value 3 or less enter, ")); } private TocasiasWelcome(final TocasiasWelcome card) { diff --git a/Mage.Sets/src/mage/cards/w/WallOfLimbs.java b/Mage.Sets/src/mage/cards/w/WallOfLimbs.java index b88bcd3540c..cb9a7472512 100644 --- a/Mage.Sets/src/mage/cards/w/WallOfLimbs.java +++ b/Mage.Sets/src/mage/cards/w/WallOfLimbs.java @@ -2,12 +2,11 @@ package mage.cards.w; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.GainLifeControllerTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.common.SourcePermanentPowerValue; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.LoseLifeTargetEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.DefenderAbility; @@ -15,22 +14,18 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.Zone; import mage.counters.CounterType; -import mage.game.Game; -import mage.game.events.GameEvent; import mage.target.TargetPlayer; import java.util.UUID; /** - * * @author emerald000 */ public final class WallOfLimbs extends CardImpl { public WallOfLimbs(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); this.subtype.add(SubType.ZOMBIE); this.subtype.add(SubType.WALL); @@ -39,14 +34,14 @@ public final class WallOfLimbs extends CardImpl { // Defender this.addAbility(DefenderAbility.getInstance()); - + // Whenever you gain life, put a +1/+1 counter on Wall of Limbs. - this.addAbility(new WallOfLimbsTriggeredAbility()); - + this.addAbility(new GainLifeControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()))); + // {5}{B}{B}, Sacrifice Wall of Limbs: Target player loses X life, where X is Wall of Limbs's power. - Effect effect = new LoseLifeTargetEffect(SourcePermanentPowerValue.NOT_NEGATIVE); - effect.setText("Target player loses X life, where X is {this}'s power."); - Ability ability = new SimpleActivatedAbility(effect, new ManaCostsImpl<>("{5}{B}{B}")); + Ability ability = new SimpleActivatedAbility( + new LoseLifeTargetEffect(SourcePermanentPowerValue.NOT_NEGATIVE), new ManaCostsImpl<>("{5}{B}{B}") + ); ability.addCost(new SacrificeSourceCost()); ability.addTarget(new TargetPlayer()); this.addAbility(ability); @@ -61,34 +56,3 @@ public final class WallOfLimbs extends CardImpl { return new WallOfLimbs(this); } } - -class WallOfLimbsTriggeredAbility extends TriggeredAbilityImpl { - - WallOfLimbsTriggeredAbility() { - super(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false); - } - - private WallOfLimbsTriggeredAbility(final WallOfLimbsTriggeredAbility ability) { - super(ability); - } - - @Override - public WallOfLimbsTriggeredAbility copy() { - return new WallOfLimbsTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.GAINED_LIFE; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return event.getPlayerId().equals(controllerId); - } - - @Override - public String getRule() { - return "Whenever you gain life, put a +1/+1 counter on Wall of Limbs."; - } -} diff --git a/Mage.Sets/src/mage/cards/w/WeatheredSentinels.java b/Mage.Sets/src/mage/cards/w/WeatheredSentinels.java index f1c85b15d23..6b7b6ea3ec9 100644 --- a/Mage.Sets/src/mage/cards/w/WeatheredSentinels.java +++ b/Mage.Sets/src/mage/cards/w/WeatheredSentinels.java @@ -47,7 +47,7 @@ public class WeatheredSentinels extends CardImpl { new ConditionalAsThoughEffect( new CanAttackAsThoughItDidntHaveDefenderSourceEffect(Duration.WhileOnBattlefield), WeatheredSentinelsCanAttackSomeoneCondition.instance) - .setText("Weathered Sentinels can attack players who attacked you during their last turn as though it didn't have defender.")), + .setText("{this} can attack players who attacked you during their last turn as though it didn't have defender.")), new WeatheredSentinelsLastTurnAttackersWatcher() ); diff --git a/Mage.Sets/src/mage/cards/w/WelcomingVampire.java b/Mage.Sets/src/mage/cards/w/WelcomingVampire.java index 6d9e0038ae8..1b3ffd7a0c2 100644 --- a/Mage.Sets/src/mage/cards/w/WelcomingVampire.java +++ b/Mage.Sets/src/mage/cards/w/WelcomingVampire.java @@ -1,26 +1,27 @@ package mage.cards.w; -import java.util.UUID; import mage.MageInt; -import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; +import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.constants.ComparisonType; -import mage.constants.SubType; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterCreaturePermanent; +import mage.constants.ComparisonType; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.mageobject.AnotherPredicate; import mage.filter.predicate.mageobject.PowerPredicate; +import java.util.UUID; + /** - * * @author weirddan455 */ public final class WelcomingVampire extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("one or more other creatures with power 2 or less"); + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("one or more other creatures with power 2 or less"); static { filter.add(AnotherPredicate.instance); @@ -38,7 +39,7 @@ public final class WelcomingVampire extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever one or more other creatures with power 2 or less enter the battlefield under your control, draw a card. This ability triggers only once each turn. - this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new DrawCardSourceControllerEffect(1), filter).setTriggersLimitEachTurn(1)); + this.addAbility(new EntersBattlefieldAllTriggeredAbility(new DrawCardSourceControllerEffect(1), filter).setTriggersLimitEachTurn(1)); } private WelcomingVampire(final WelcomingVampire card) { diff --git a/Mage.Sets/src/mage/cards/w/WillOfTheSultai.java b/Mage.Sets/src/mage/cards/w/WillOfTheSultai.java index fa49ce6513b..f86fd8d497f 100644 --- a/Mage.Sets/src/mage/cards/w/WillOfTheSultai.java +++ b/Mage.Sets/src/mage/cards/w/WillOfTheSultai.java @@ -36,7 +36,7 @@ public final class WillOfTheSultai extends CardImpl { // * Target player mills three cards. Return all land cards from your graveyard to the battlefield tapped. this.getSpellAbility().addEffect(new MillCardsTargetEffect(3)); this.getSpellAbility().addTarget(new TargetPlayer()); - this.getSpellAbility().addEffect(new ReturnFromYourGraveyardToBattlefieldAllEffect(StaticFilters.FILTER_CARD_LANDS)); + this.getSpellAbility().addEffect(new ReturnFromYourGraveyardToBattlefieldAllEffect(StaticFilters.FILTER_CARD_LANDS, true)); // * Put X +1/+1 counters on target creature, where X is the number of lands you control. It gains trample until end of turn. this.getSpellAbility().addMode(new Mode(new AddCountersTargetEffect( diff --git a/Mage.Sets/src/mage/cards/w/WithinRange.java b/Mage.Sets/src/mage/cards/w/WithinRange.java index e75296feaa7..83fc0a9c88b 100644 --- a/Mage.Sets/src/mage/cards/w/WithinRange.java +++ b/Mage.Sets/src/mage/cards/w/WithinRange.java @@ -26,7 +26,7 @@ public final class WithinRange extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}"); // When this enchantment enters, create two 1/1 red Warrior creature tokens. - this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new RedWarriorToken()))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new RedWarriorToken(), 2))); // Whenever you attack, each opponent loses life equal to the number of creatures attacking them. this.addAbility(new AttacksWithCreaturesTriggeredAbility(new WithinRangeEffect(), 1)); diff --git a/Mage.Sets/src/mage/cards/w/Wonder.java b/Mage.Sets/src/mage/cards/w/Wonder.java index 3b47e8b642c..2b0e19eb5ca 100644 --- a/Mage.Sets/src/mage/cards/w/Wonder.java +++ b/Mage.Sets/src/mage/cards/w/Wonder.java @@ -1,12 +1,10 @@ - package mage.cards.w; -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.FlyingAbility; import mage.cards.CardImpl; @@ -15,26 +13,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 magenoxx_at_gmail.com */ public final class Wonder extends CardImpl { - private static final String ruleText = "As long as Wonder is in your graveyard and you control an Island, creatures you control have flying"; - - private static final FilterControlledPermanent filter = new FilterControlledPermanent("Island"); - - static { - filter.add(CardType.LAND.getPredicate()); - filter.add(SubType.ISLAND.getPredicate()); - } + private static final Condition condition = new PermanentsOnTheBattlefieldCondition(new FilterControlledPermanent(SubType.ISLAND)); public Wonder(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}"); this.subtype.add(SubType.INCARNATION); this.power = new MageInt(2); @@ -44,11 +36,12 @@ public final class Wonder extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // As long as Wonder is in your graveyard and you control an Island, creatures you control have flying. - ContinuousEffect effect = new GainAbilityControlledEffect(FlyingAbility.getInstance(), - Duration.WhileOnBattlefield, new FilterCreaturePermanent()); - ConditionalContinuousEffect wonderEffect = new ConditionalContinuousEffect(effect, - new PermanentsOnTheBattlefieldCondition(filter), ruleText); - this.addAbility(new SimpleStaticAbility(Zone.GRAVEYARD, wonderEffect)); + this.addAbility(new SimpleStaticAbility( + Zone.GRAVEYARD, + new ConditionalContinuousEffect(new GainAbilityControlledEffect( + FlyingAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURE + ), condition, "as long as this card is in your graveyard and you control an Island, creatures you control have flying") + )); } private Wonder(final Wonder card) { diff --git a/Mage/src/main/java/mage/abilities/costs/common/DiscardSourceCost.java b/Mage/src/main/java/mage/abilities/costs/common/DiscardSourceCost.java index 96188f942d6..2fa756b6f57 100644 --- a/Mage/src/main/java/mage/abilities/costs/common/DiscardSourceCost.java +++ b/Mage/src/main/java/mage/abilities/costs/common/DiscardSourceCost.java @@ -12,22 +12,17 @@ import mage.players.Player; import java.util.UUID; /** - * * @author BetaSteward_at_googlemail.com */ public class DiscardSourceCost extends CostImpl { - private boolean nameCard = true; - - public DiscardSourceCost() {} - - public DiscardSourceCost(boolean nameCard){ - this.nameCard = nameCard; + public DiscardSourceCost() { + super(); + setText("discard this card"); } public DiscardSourceCost(DiscardSourceCost cost) { super(cost); - nameCard = cost.nameCard; } @Override @@ -41,21 +36,10 @@ public class DiscardSourceCost extends CostImpl { if (player != null) { Card card = player.getHand().get(source.getSourceId(), game); paid = player.discard(card, true, source, game); - } return paid; } - @Override - public String getText() { - if(nameCard) { - return "Discard {this}"; - } - else{ - return "Discard this card"; - } - } - @Override public DiscardSourceCost copy() { return new DiscardSourceCost(this); diff --git a/Mage/src/main/java/mage/filter/StaticFilters.java b/Mage/src/main/java/mage/filter/StaticFilters.java index fe0c49c2fdf..9518ec37263 100644 --- a/Mage/src/main/java/mage/filter/StaticFilters.java +++ b/Mage/src/main/java/mage/filter/StaticFilters.java @@ -145,6 +145,12 @@ public final class StaticFilters { FILTER_CARD_ARTIFACT_FROM_YOUR_GRAVEYARD.setLockedFilter(true); } + public static final FilterCard FILTER_CARD_LAND_FROM_YOUR_GRAVEYARD = new FilterLandCard("land card from your graveyard"); + + static { + FILTER_CARD_LAND_FROM_YOUR_GRAVEYARD.setLockedFilter(true); + } + public static final FilterCreatureCard FILTER_CARD_CREATURE_A_GRAVEYARD = new FilterCreatureCard("creature card from a graveyard"); static { diff --git a/Mage/src/main/java/mage/game/permanent/token/DragonEggDragonToken.java b/Mage/src/main/java/mage/game/permanent/token/DragonEggDragonToken.java index b82605fc24b..3c8faf936c5 100644 --- a/Mage/src/main/java/mage/game/permanent/token/DragonEggDragonToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/DragonEggDragonToken.java @@ -8,7 +8,6 @@ import mage.abilities.keyword.FlyingAbility; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; -import mage.constants.Zone; /** * @author spjspj @@ -16,7 +15,7 @@ import mage.constants.Zone; public final class DragonEggDragonToken extends TokenImpl { public DragonEggDragonToken() { - super("Dragon Token", "2/2 red Dragon creature token with flying and \"{R}: This creature gets +1/+0 until end of turn.\""); + super("Dragon Token", "2/2 red Dragon creature token with flying and \"{R}: This token gets +1/+0 until end of turn.\""); cardType.add(CardType.CREATURE); color.setRed(true); subtype.add(SubType.DRAGON); @@ -24,8 +23,7 @@ public final class DragonEggDragonToken extends TokenImpl { toughness = new MageInt(2); this.addAbility(FlyingAbility.getInstance()); - this.addAbility(new SimpleActivatedAbility(new BoostSourceEffect(1, 0, Duration.EndOfTurn) - .setText("This creature gets +1/+0 until end of turn"), new ManaCostsImpl<>("{R}"))); + this.addAbility(new SimpleActivatedAbility(new BoostSourceEffect(1, 0, Duration.EndOfTurn), new ManaCostsImpl<>("{R}"))); } private DragonEggDragonToken(final DragonEggDragonToken token) { diff --git a/Mage/src/main/java/mage/game/permanent/token/NestingDragonToken.java b/Mage/src/main/java/mage/game/permanent/token/NestingDragonToken.java index a8702a844da..a9f93c20146 100644 --- a/Mage/src/main/java/mage/game/permanent/token/NestingDragonToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/NestingDragonToken.java @@ -17,9 +17,9 @@ public final class NestingDragonToken extends TokenImpl { "Dragon Egg Token", "0/2 red Dragon Egg creature token with defender and " + "\"" - + "When this creature dies, " + + "When this token dies, " + "create a 2/2 red Dragon creature token with flying and " - + "'{R}: This creature gets +1/+0 until end of turn.'" + + "'{R}: This token gets +1/+0 until end of turn.'" + "\"" ); cardType.add(CardType.CREATURE);