From 2f599f5d729d6a829ca6075f92f4d15f71648d95 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Sat, 1 Jun 2019 09:42:43 -0400 Subject: [PATCH] Implemented Saddled Rimestag --- .../src/mage/cards/s/SaddledRimestag.java | 104 ++++++++++++++++++ Mage.Sets/src/mage/sets/ModernHorizons.java | 1 + 2 files changed, 105 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SaddledRimestag.java diff --git a/Mage.Sets/src/mage/cards/s/SaddledRimestag.java b/Mage.Sets/src/mage/cards/s/SaddledRimestag.java new file mode 100644 index 00000000000..0aa3cd7b7ff --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SaddledRimestag.java @@ -0,0 +1,104 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.ZoneChangeEvent; +import mage.watchers.Watcher; + +import java.util.*; + +/** + * @author TheElk801 + */ +public final class SaddledRimestag extends CardImpl { + + public SaddledRimestag(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); + + this.addSuperType(SuperType.SNOW); + this.subtype.add(SubType.ELK); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Saddled Rimestag gets +2/+2 as long as you had another creature enter the battlefield under your control this turn. + this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( + new BoostSourceEffect(2, 2, Duration.WhileOnBattlefield), + SaddledRimestagCondition.instance, "{this} gets +2/+2 as long as " + + "you had another creature enter the battlefield under your control this turn." + )), new SaddledRimestagWatcher()); + } + + private SaddledRimestag(final SaddledRimestag card) { + super(card); + } + + @Override + public SaddledRimestag copy() { + return new SaddledRimestag(this); + } +} + +enum SaddledRimestagCondition implements Condition { + instance; + + @Override + public boolean apply(Game game, Ability source) { + SaddledRimestagWatcher watcher = game.getState().getWatcher(SaddledRimestagWatcher.class); + return watcher != null && watcher.enteredCreatureForPlayer(source.getControllerId(), source.getSourceId()); + } + + @Override + public String toString() { + return "you had a creature enter the battlefield under your control this turn"; + } +} + +class SaddledRimestagWatcher extends Watcher { + + private final Map> playerMap = new HashMap<>(); + + SaddledRimestagWatcher() { + super(WatcherScope.GAME); + } + + private SaddledRimestagWatcher(final SaddledRimestagWatcher watcher) { + super(watcher); + this.playerMap.putAll(watcher.playerMap); + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.ZONE_CHANGE) { + ZoneChangeEvent zEvent = (ZoneChangeEvent) event; + if (zEvent.getToZone() == Zone.BATTLEFIELD + && zEvent.getTarget().isCreature()) { + playerMap.putIfAbsent(zEvent.getTarget().getControllerId(), new HashSet<>()); + playerMap.get(zEvent.getTarget().getControllerId()).add(zEvent.getTargetId()); + } + } + } + + @Override + public void reset() { + playerMap.clear(); + } + + boolean enteredCreatureForPlayer(UUID playerId, UUID creatureId) { + Set s = playerMap.getOrDefault(playerId, null); + return s != null && s.stream().anyMatch((UUID id) -> (id != creatureId)); + } + + @Override + public SaddledRimestagWatcher copy() { + return new SaddledRimestagWatcher(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ModernHorizons.java b/Mage.Sets/src/mage/sets/ModernHorizons.java index 58aad71bcf9..29a200bf352 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons.java @@ -176,6 +176,7 @@ public final class ModernHorizons extends ExpansionSet { cards.add(new SetCardInfo("Rime Tender", 176, Rarity.COMMON, mage.cards.r.RimeTender.class)); cards.add(new SetCardInfo("Rotwidow Pack", 212, Rarity.UNCOMMON, mage.cards.r.RotwidowPack.class)); cards.add(new SetCardInfo("Ruination Rioter", 213, Rarity.UNCOMMON, mage.cards.r.RuinationRioter.class)); + cards.add(new SetCardInfo("Saddled Rimestag", 177, Rarity.UNCOMMON, mage.cards.s.SaddledRimestag.class)); cards.add(new SetCardInfo("Sadistic Obsession", 105, Rarity.UNCOMMON, mage.cards.s.SadisticObsession.class)); cards.add(new SetCardInfo("Savage Swipe", 178, Rarity.COMMON, mage.cards.s.SavageSwipe.class)); cards.add(new SetCardInfo("Scale Up", 179, Rarity.UNCOMMON, mage.cards.s.ScaleUp.class));