From 639febac1e428823374d960062c2700958f1551f Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 18 Apr 2022 18:52:59 -0400 Subject: [PATCH] [NCC] Implemented Bennie Bracks, Zoologist --- .../mage/cards/b/BennieBracksZoologist.java | 47 ++++++++++++++ .../src/mage/cards/i/IdolOfOblivion.java | 61 ++----------------- .../src/mage/sets/NewCapennaCommander.java | 1 + .../common/CreatedTokenThisTurnCondition.java | 30 +++++++++ .../watchers/common/CreatedTokenWatcher.java | 38 ++++++++++++ 5 files changed, 121 insertions(+), 56 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/b/BennieBracksZoologist.java create mode 100644 Mage/src/main/java/mage/abilities/condition/common/CreatedTokenThisTurnCondition.java create mode 100644 Mage/src/main/java/mage/watchers/common/CreatedTokenWatcher.java diff --git a/Mage.Sets/src/mage/cards/b/BennieBracksZoologist.java b/Mage.Sets/src/mage/cards/b/BennieBracksZoologist.java new file mode 100644 index 00000000000..26729bc7206 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BennieBracksZoologist.java @@ -0,0 +1,47 @@ +package mage.cards.b; + +import mage.MageInt; +import mage.abilities.common.BeginningOfEndStepTriggeredAbility; +import mage.abilities.condition.common.CreatedTokenThisTurnCondition; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.keyword.ConvokeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.watchers.common.CreatedTokenWatcher; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class BennieBracksZoologist extends CardImpl { + + public BennieBracksZoologist(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}"); + + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.ELF); + this.subtype.add(SubType.DRUID); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Convoke + this.addAbility(new ConvokeAbility()); + + // At the beginning of each end step, if you created a token this turn, draw a card. + this.addAbility(new BeginningOfEndStepTriggeredAbility( + Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), + TargetController.ANY, CreatedTokenThisTurnCondition.instance, false + ).addHint(CreatedTokenThisTurnCondition.getHint()), new CreatedTokenWatcher()); + } + + private BennieBracksZoologist(final BennieBracksZoologist card) { + super(card); + } + + @Override + public BennieBracksZoologist copy() { + return new BennieBracksZoologist(this); + } +} diff --git a/Mage.Sets/src/mage/cards/i/IdolOfOblivion.java b/Mage.Sets/src/mage/cards/i/IdolOfOblivion.java index 3e7b2931594..2dba9b17035 100644 --- a/Mage.Sets/src/mage/cards/i/IdolOfOblivion.java +++ b/Mage.Sets/src/mage/cards/i/IdolOfOblivion.java @@ -3,7 +3,7 @@ package mage.cards.i; import mage.abilities.Ability; import mage.abilities.common.ActivateIfConditionActivatedAbility; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.condition.Condition; +import mage.abilities.condition.common.CreatedTokenThisTurnCondition; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; @@ -12,17 +12,10 @@ import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.WatcherScope; import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.game.permanent.PermanentToken; import mage.game.permanent.token.EldraziToken; -import mage.watchers.Watcher; +import mage.watchers.common.CreatedTokenWatcher; -import java.util.HashSet; -import java.util.Set; import java.util.UUID; /** @@ -36,8 +29,8 @@ public final class IdolOfOblivion extends CardImpl { // {T}: Draw a card. Activate this ability only if you created a token this turn. this.addAbility(new ActivateIfConditionActivatedAbility( Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), - new TapSourceCost(), IdolOfOblivionCondition.instance - )); + new TapSourceCost(), CreatedTokenThisTurnCondition.instance + ).addHint(CreatedTokenThisTurnCondition.getHint()), new CreatedTokenWatcher()); // {8}, {T}, Sacrifice Idol of Oblivion: Create 10/10 colorless Eldrazi creature token. Ability ability = new SimpleActivatedAbility( @@ -45,7 +38,7 @@ public final class IdolOfOblivion extends CardImpl { ); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); - this.addAbility(ability, new IdolOfOblivionWatcher()); + this.addAbility(ability); } private IdolOfOblivion(final IdolOfOblivion card) { @@ -57,47 +50,3 @@ public final class IdolOfOblivion extends CardImpl { return new IdolOfOblivion(this); } } - -enum IdolOfOblivionCondition implements Condition { - instance; - - @Override - public boolean apply(Game game, Ability source) { - IdolOfOblivionWatcher watcher = game.getState().getWatcher(IdolOfOblivionWatcher.class); - return watcher != null && watcher.tokenEntered(source.getControllerId()); - } - - @Override - public String toString() { - return "if you created a token this turn"; - } -} - -class IdolOfOblivionWatcher extends Watcher { - - private final Set playerIds = new HashSet<>(); - - IdolOfOblivionWatcher() { - super(WatcherScope.GAME); - } - - @Override - public void watch(GameEvent event, Game game) { - if (event.getType() != GameEvent.EventType.ENTERS_THE_BATTLEFIELD) { - return; - } - Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent instanceof PermanentToken) { - playerIds.add(permanent.getControllerId()); - } - } - - @Override - public void reset() { - playerIds.clear(); - } - - boolean tokenEntered(UUID playerId) { - return playerIds.contains(playerId); - } -} diff --git a/Mage.Sets/src/mage/sets/NewCapennaCommander.java b/Mage.Sets/src/mage/sets/NewCapennaCommander.java index e9c142dad53..f71327900e2 100644 --- a/Mage.Sets/src/mage/sets/NewCapennaCommander.java +++ b/Mage.Sets/src/mage/sets/NewCapennaCommander.java @@ -24,6 +24,7 @@ public final class NewCapennaCommander extends ExpansionSet { super("New Capenna Commander", "NCC", ExpansionSet.buildDate(2022, 4, 29), SetType.SUPPLEMENTAL); this.hasBasicLands = false; + cards.add(new SetCardInfo("Bennie Bracks, Zoologist", 86, Rarity.MYTHIC, mage.cards.b.BennieBracksZoologist.class)); cards.add(new SetCardInfo("Kitt Kanto, Mayhem Diva", 4, Rarity.MYTHIC, mage.cards.k.KittKantoMayhemDiva.class)); cards.removeIf(setCardInfo -> unfinished.contains(setCardInfo.getName())); // remove when shield counters are implemented diff --git a/Mage/src/main/java/mage/abilities/condition/common/CreatedTokenThisTurnCondition.java b/Mage/src/main/java/mage/abilities/condition/common/CreatedTokenThisTurnCondition.java new file mode 100644 index 00000000000..e8b4ab934d1 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/condition/common/CreatedTokenThisTurnCondition.java @@ -0,0 +1,30 @@ +package mage.abilities.condition.common; + +import mage.abilities.Ability; +import mage.abilities.condition.Condition; +import mage.abilities.hint.ConditionHint; +import mage.abilities.hint.Hint; +import mage.game.Game; +import mage.watchers.common.CreatedTokenWatcher; + +/** + * @author TheElk801 + */ +public enum CreatedTokenThisTurnCondition implements Condition { + instance; + private static final Hint hint = new ConditionHint(instance, "You created a token this turn"); + + public static Hint getHint() { + return hint; + } + + @Override + public boolean apply(Game game, Ability source) { + return CreatedTokenWatcher.checkPlayer(source.getControllerId(), game); + } + + @Override + public String toString() { + return "if you created a token this turn"; + } +} diff --git a/Mage/src/main/java/mage/watchers/common/CreatedTokenWatcher.java b/Mage/src/main/java/mage/watchers/common/CreatedTokenWatcher.java new file mode 100644 index 00000000000..9f90d038614 --- /dev/null +++ b/Mage/src/main/java/mage/watchers/common/CreatedTokenWatcher.java @@ -0,0 +1,38 @@ +package mage.watchers.common; + +import mage.constants.WatcherScope; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.watchers.Watcher; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +/** + * @author TheElk801 + */ +public class CreatedTokenWatcher extends Watcher { + + private final Set playerIds = new HashSet<>(); + + public CreatedTokenWatcher() { + super(WatcherScope.GAME); + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.CREATED_TOKEN) { + playerIds.add(event.getPlayerId()); + } + } + + @Override + public void reset() { + playerIds.clear(); + } + + public static boolean checkPlayer(UUID playerId, Game game) { + return game.getState().getWatcher(CreatedTokenWatcher.class).playerIds.contains(playerId); + } +}