From beacccf558de33c19c851728a0baaad8865241f8 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 2 Nov 2022 09:56:17 -0400 Subject: [PATCH] [BRO] Implement Evangel of Synthesis --- .../src/mage/cards/e/EvangelOfSynthesis.java | 73 +++++++++++++++++++ Mage.Sets/src/mage/cards/e/EvenTheScore.java | 2 +- Mage.Sets/src/mage/cards/e/Eyekite.java | 3 +- Mage.Sets/src/mage/cards/f/FistsOfFlame.java | 2 +- .../mage/cards/k/KydeleChosenOfKruphix.java | 9 +-- Mage.Sets/src/mage/cards/n/NikoAris.java | 3 +- .../src/mage/cards/s/ScionOfHalaster.java | 4 +- .../src/mage/cards/t/ThunderingDjinn.java | 11 +-- Mage.Sets/src/mage/sets/TheBrothersWar.java | 1 + .../CardsDrawnThisTurnDynamicValue.java | 7 ++ 10 files changed, 98 insertions(+), 17 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/e/EvangelOfSynthesis.java diff --git a/Mage.Sets/src/mage/cards/e/EvangelOfSynthesis.java b/Mage.Sets/src/mage/cards/e/EvangelOfSynthesis.java new file mode 100644 index 00000000000..176cb9559b9 --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/EvangelOfSynthesis.java @@ -0,0 +1,73 @@ +package mage.cards.e; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.dynamicvalue.common.CardsDrawnThisTurnDynamicValue; +import mage.abilities.effects.common.DrawDiscardControllerEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.MenaceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.game.Game; +import mage.watchers.common.CardsDrawnThisTurnWatcher; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class EvangelOfSynthesis extends CardImpl { + + public EvangelOfSynthesis(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}{B}"); + + this.subtype.add(SubType.PHYREXIAN); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.CLERIC); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // When Evangel of Synthesis enters the battlefield, draw a card, then discard a card. + this.addAbility(new EntersBattlefieldTriggeredAbility( + new DrawDiscardControllerEffect(1, 1) + )); + + // As long as you've drawn two or more cards this turn, Evangel of Synthesis gets +1/+0 and has menace. + Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect( + new BoostSourceEffect(1, 0, Duration.WhileOnBattlefield), + EvangelOfSynthesisCondition.instance, "as long as you've drawn " + + "two or more cards this turn, {this} gets +1/+0" + )); + ability.addEffect(new ConditionalContinuousEffect(new GainAbilitySourceEffect( + new MenaceAbility(false), Duration.WhileOnBattlefield + ), EvangelOfSynthesisCondition.instance, "and has menace")); + this.addAbility(ability.addHint(CardsDrawnThisTurnDynamicValue.getHint())); + } + + private EvangelOfSynthesis(final EvangelOfSynthesis card) { + super(card); + } + + @Override + public EvangelOfSynthesis copy() { + return new EvangelOfSynthesis(this); + } +} + +enum EvangelOfSynthesisCondition implements Condition { + instance; + + @Override + public boolean apply(Game game, Ability source) { + CardsDrawnThisTurnWatcher watcher = game.getState().getWatcher(CardsDrawnThisTurnWatcher.class); + return watcher != null && watcher.getCardsDrawnThisTurn(source.getControllerId()) > 1; + } +} diff --git a/Mage.Sets/src/mage/cards/e/EvenTheScore.java b/Mage.Sets/src/mage/cards/e/EvenTheScore.java index b07af6fe132..290e2f01b1c 100644 --- a/Mage.Sets/src/mage/cards/e/EvenTheScore.java +++ b/Mage.Sets/src/mage/cards/e/EvenTheScore.java @@ -31,7 +31,7 @@ public final class EvenTheScore extends CardImpl { new ManaCostsImpl<>("{U}{U}{U}"), EvenTheScoreCondition.instance ) - ).setRuleAtTheTop(true), new CardsDrawnThisTurnWatcher()); + ).setRuleAtTheTop(true)); // Draw X cards. this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(ManacostVariableValue.REGULAR)); diff --git a/Mage.Sets/src/mage/cards/e/Eyekite.java b/Mage.Sets/src/mage/cards/e/Eyekite.java index 7e45ea536fa..5c6c5d419f2 100644 --- a/Mage.Sets/src/mage/cards/e/Eyekite.java +++ b/Mage.Sets/src/mage/cards/e/Eyekite.java @@ -5,6 +5,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.Condition; import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.dynamicvalue.common.CardsDrawnThisTurnDynamicValue; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -36,7 +37,7 @@ public final class Eyekite extends CardImpl { this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( new BoostSourceEffect(2, 0, Duration.WhileOnBattlefield), EyekiteCondition.instance, "{this} gets +2/+0 as long as you've drawn two or more cards this turn." - ))); + )).addHint(CardsDrawnThisTurnDynamicValue.getHint())); } private Eyekite(final Eyekite card) { diff --git a/Mage.Sets/src/mage/cards/f/FistsOfFlame.java b/Mage.Sets/src/mage/cards/f/FistsOfFlame.java index cb9f3ed87c2..73135a4626b 100644 --- a/Mage.Sets/src/mage/cards/f/FistsOfFlame.java +++ b/Mage.Sets/src/mage/cards/f/FistsOfFlame.java @@ -11,7 +11,6 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.target.common.TargetCreaturePermanent; -import mage.watchers.common.CardsDrawnThisTurnWatcher; import java.util.UUID; @@ -33,6 +32,7 @@ public final class FistsOfFlame extends CardImpl { StaticValue.get(0), Duration.EndOfTurn ).setText("and gets +1/+0 for each card you've drawn this turn.")); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addHint(CardsDrawnThisTurnDynamicValue.getHint()); } private FistsOfFlame(final FistsOfFlame card) { diff --git a/Mage.Sets/src/mage/cards/k/KydeleChosenOfKruphix.java b/Mage.Sets/src/mage/cards/k/KydeleChosenOfKruphix.java index d3b9c5d55da..5233378013d 100644 --- a/Mage.Sets/src/mage/cards/k/KydeleChosenOfKruphix.java +++ b/Mage.Sets/src/mage/cards/k/KydeleChosenOfKruphix.java @@ -11,7 +11,6 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.SuperType; -import mage.watchers.common.CardsDrawnThisTurnWatcher; import java.util.UUID; @@ -30,10 +29,10 @@ public final class KydeleChosenOfKruphix extends CardImpl { this.toughness = new MageInt(3); // {T}: Add {C} for each card you've drawn this turn. - DynamicManaAbility ability = new DynamicManaAbility( - Mana.ColorlessMana(1), CardsDrawnThisTurnDynamicValue.instance, - new TapSourceCost(), null, false, CardsDrawnThisTurnDynamicValue.instance); - this.addAbility(ability); + this.addAbility(new DynamicManaAbility( + Mana.ColorlessMana(1), CardsDrawnThisTurnDynamicValue.instance, + new TapSourceCost(), null, false, CardsDrawnThisTurnDynamicValue.instance + ).addHint(CardsDrawnThisTurnDynamicValue.getHint())); // Partner this.addAbility(PartnerAbility.getInstance()); diff --git a/Mage.Sets/src/mage/cards/n/NikoAris.java b/Mage.Sets/src/mage/cards/n/NikoAris.java index 84c23b95cb2..e9ac4eded12 100644 --- a/Mage.Sets/src/mage/cards/n/NikoAris.java +++ b/Mage.Sets/src/mage/cards/n/NikoAris.java @@ -28,7 +28,6 @@ import mage.game.events.GameEvent; import mage.game.permanent.token.ShardToken; import mage.target.TargetPermanent; import mage.target.common.TargetControlledCreaturePermanent; -import mage.watchers.common.CardsDrawnThisTurnWatcher; import java.util.Objects; import java.util.UUID; @@ -69,7 +68,7 @@ public final class NikoAris extends CardImpl { "{this} deals 2 damage to target tapped creature for each card you've drawn this turn" ), -1); ability.addTarget(new TargetPermanent(filter)); - this.addAbility(ability, new CardsDrawnThisTurnWatcher()); + this.addAbility(ability.addHint(CardsDrawnThisTurnDynamicValue.getHint())); // −1: Create a Shard token. this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new ShardToken()), -1)); diff --git a/Mage.Sets/src/mage/cards/s/ScionOfHalaster.java b/Mage.Sets/src/mage/cards/s/ScionOfHalaster.java index 1f3b011b1ed..31065626654 100644 --- a/Mage.Sets/src/mage/cards/s/ScionOfHalaster.java +++ b/Mage.Sets/src/mage/cards/s/ScionOfHalaster.java @@ -29,9 +29,9 @@ public final class ScionOfHalaster extends CardImpl { // Commander creatures you own have "The first time you would draw a card each turn, instead look at the top two cards of your library. Put one of them into your graveyard and the other back on top of your library. Then draw a card." this.addAbility(new SimpleStaticAbility(new GainAbilityAllEffect( - new SimpleStaticAbility(new ScionOfHalasterReplacementEffect()), + new SimpleStaticAbility(new ScionOfHalasterReplacementEffect()), Duration.WhileOnBattlefield, StaticFilters.FILTER_CREATURES_OWNED_COMMANDER - )), new CardsDrawnThisTurnWatcher()); + ))); } private ScionOfHalaster(final ScionOfHalaster card) { diff --git a/Mage.Sets/src/mage/cards/t/ThunderingDjinn.java b/Mage.Sets/src/mage/cards/t/ThunderingDjinn.java index a8479e0ecbe..e8a3b418b42 100644 --- a/Mage.Sets/src/mage/cards/t/ThunderingDjinn.java +++ b/Mage.Sets/src/mage/cards/t/ThunderingDjinn.java @@ -11,7 +11,6 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.target.common.TargetAnyTarget; -import mage.watchers.common.CardsDrawnThisTurnWatcher; import java.util.UUID; @@ -31,11 +30,13 @@ public final class ThunderingDjinn extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever Thundering Djinn attacks, it deals damage to any target equal to the number of cards you've drawn this turn. - Ability ability = new AttacksTriggeredAbility(new DamageTargetEffect( - CardsDrawnThisTurnDynamicValue.instance - ).setText("it deals damage to any target equal to the number of cards you've drawn this turn."), false); + Ability ability = new AttacksTriggeredAbility( + new DamageTargetEffect(CardsDrawnThisTurnDynamicValue.instance) + .setText("it deals damage to any target equal to the number of cards you've drawn this turn."), + false + ); ability.addTarget(new TargetAnyTarget()); - this.addAbility(ability); + this.addAbility(ability.addHint(CardsDrawnThisTurnDynamicValue.getHint())); } private ThunderingDjinn(final ThunderingDjinn card) { diff --git a/Mage.Sets/src/mage/sets/TheBrothersWar.java b/Mage.Sets/src/mage/sets/TheBrothersWar.java index cbf9c53843e..5b7a377aaf0 100644 --- a/Mage.Sets/src/mage/sets/TheBrothersWar.java +++ b/Mage.Sets/src/mage/sets/TheBrothersWar.java @@ -50,6 +50,7 @@ public final class TheBrothersWar extends ExpansionSet { cards.add(new SetCardInfo("Disfigure", 91, Rarity.COMMON, mage.cards.d.Disfigure.class)); cards.add(new SetCardInfo("Drafna, Founder of Lat-Nam", 47, Rarity.RARE, mage.cards.d.DrafnaFounderOfLatNam.class)); cards.add(new SetCardInfo("Epic Confrontation", 176, Rarity.COMMON, mage.cards.e.EpicConfrontation.class)); + cards.add(new SetCardInfo("Evangel of Synthesis", 209, Rarity.UNCOMMON, mage.cards.e.EvangelOfSynthesis.class)); cards.add(new SetCardInfo("Fade from History", 177, Rarity.RARE, mage.cards.f.FadeFromHistory.class)); cards.add(new SetCardInfo("Fallaji Chaindancer", 134, Rarity.COMMON, mage.cards.f.FallajiChaindancer.class)); cards.add(new SetCardInfo("Fallaji Dragon Engine", 159, Rarity.UNCOMMON, mage.cards.f.FallajiDragonEngine.class)); diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/CardsDrawnThisTurnDynamicValue.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/CardsDrawnThisTurnDynamicValue.java index 513f0b8f18f..a698b507011 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/CardsDrawnThisTurnDynamicValue.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/CardsDrawnThisTurnDynamicValue.java @@ -3,6 +3,7 @@ package mage.abilities.dynamicvalue.common; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; +import mage.abilities.hint.ValueHint; import mage.game.Game; import mage.watchers.common.CardsDrawnThisTurnWatcher; @@ -13,6 +14,7 @@ import mage.watchers.common.CardsDrawnThisTurnWatcher; */ public enum CardsDrawnThisTurnDynamicValue implements DynamicValue { instance; + private static final ValueHint hint = new ValueHint("Cards you've drawn this turn", instance); @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { @@ -35,7 +37,12 @@ public enum CardsDrawnThisTurnDynamicValue implements DynamicValue { @Override public String getMessage() { + return "card you've drawn this turn"; } + + public static ValueHint getHint() { + return hint; + } }