From 958228e0095900b3b7248e948d7f7b1346512b76 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Mon, 3 Jun 2019 16:35:56 +0400 Subject: [PATCH] [MH1] added Silumgar Scavenger --- .../src/mage/cards/s/SilumgarScavenger.java | 144 ++++++++++++++++++ Mage.Sets/src/mage/sets/ModernHorizons.java | 1 + .../triggers/dies/SilumgarScavengerTest.java | 37 +++++ 3 files changed, 182 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SilumgarScavenger.java create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/SilumgarScavengerTest.java diff --git a/Mage.Sets/src/mage/cards/s/SilumgarScavenger.java b/Mage.Sets/src/mage/cards/s/SilumgarScavenger.java new file mode 100644 index 00000000000..d155991c42b --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SilumgarScavenger.java @@ -0,0 +1,144 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DiesCreatureTriggeredAbility; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.ExploitAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.counters.CounterType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.watchers.Watcher; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +/** + * @author JayDi85 + */ +public final class SilumgarScavenger extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature you control"); + + static { + filter.add(AnotherPredicate.instance); + filter.add(new ControllerPredicate(TargetController.YOU)); + } + + public SilumgarScavenger(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}"); + + this.subtype.add(SubType.ZOMBIE); + this.subtype.add(SubType.BIRD); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Exploit (When this creature enters the battlefield, you may sacrifice a creature.) + this.addAbility(new ExploitAbility()); + + // Whenever another creature you control dies, put a +1/+1 counter on Silumgar Scavenger. It gains haste until end of turn if it exploited that creature. + Ability ability = new DiesCreatureTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false, filter, true); + ability.addEffect(new SilumgarScavengerBoostEffect()); + //ability.addTarget(new TargetPlayerOrPlaneswalker()); + this.addAbility(ability, new SilumgarScavengerExploitedWatcher()); + + } + + public SilumgarScavenger(final SilumgarScavenger card) { + super(card); + } + + @Override + public SilumgarScavenger copy() { + return new SilumgarScavenger(this); + } +} + +class SilumgarScavengerExploitedWatcher extends Watcher { + + private final Map exploitedPermanents = new HashMap<>(); // id + zone + + SilumgarScavengerExploitedWatcher() { + super(WatcherScope.GAME); + } + + private SilumgarScavengerExploitedWatcher(final SilumgarScavengerExploitedWatcher watcher) { + super(watcher); + this.exploitedPermanents.putAll(watcher.exploitedPermanents); + } + + @Override + public SilumgarScavengerExploitedWatcher copy() { + return new SilumgarScavengerExploitedWatcher(this); + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.EXPLOITED_CREATURE) { + Permanent permanent = game.getPermanentOrLKIBattlefield(event.getTargetId()); + if (permanent != null) { + this.exploitedPermanents.put(permanent.getId(), permanent.getZoneChangeCounter(game)); + } + } + } + + @Override + public void reset() { + super.reset(); + this.exploitedPermanents.clear(); + } + + boolean isPermanentExploited(Game game, UUID permanentId) { + Permanent currentPerm = game.getPermanentOrLKIBattlefield(permanentId); + if (currentPerm != null && this.exploitedPermanents.containsKey(currentPerm.getId())) { + int currentZone = currentPerm.getZoneChangeCounter(game); + return currentZone == this.exploitedPermanents.get(currentPerm.getId()); + } + return false; + } +} + +class SilumgarScavengerBoostEffect extends OneShotEffect { + + public SilumgarScavengerBoostEffect() { + super(Outcome.AddAbility); + staticText = "It gains haste until end of turn if it exploited that creature"; + } + + public SilumgarScavengerBoostEffect(SilumgarScavengerBoostEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + UUID diesPermanent = this.getTargetPointer().getFirst(game, source); + SilumgarScavengerExploitedWatcher watcher = game.getState().getWatcher(SilumgarScavengerExploitedWatcher.class); + if (watcher != null && watcher.isPermanentExploited(game, diesPermanent)) { + ContinuousEffect effect = new GainAbilitySourceEffect(HasteAbility.getInstance(), Duration.EndOfTurn); + game.addEffect(effect, source); + return true; + } + return false; + } + + @Override + public SilumgarScavengerBoostEffect copy() { + return new SilumgarScavengerBoostEffect(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/ModernHorizons.java b/Mage.Sets/src/mage/sets/ModernHorizons.java index f77a3d983e2..8529b1ae99a 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons.java @@ -207,6 +207,7 @@ public final class ModernHorizons extends ExpansionSet { cards.add(new SetCardInfo("Shelter", 28, Rarity.COMMON, mage.cards.s.Shelter.class)); cards.add(new SetCardInfo("Shenanigans", 146, Rarity.COMMON, mage.cards.s.Shenanigans.class)); cards.add(new SetCardInfo("Silent Clearing", 246, Rarity.RARE, mage.cards.s.SilentClearing.class)); + cards.add(new SetCardInfo("Silumgar Scavenger", 107, Rarity.COMMON, mage.cards.s.SilumgarScavenger.class)); cards.add(new SetCardInfo("Sisay, Weatherlight Captain", 29, Rarity.RARE, mage.cards.s.SisayWeatherlightCaptain.class)); cards.add(new SetCardInfo("Sling-Gang Lieutenant", 108, Rarity.UNCOMMON, mage.cards.s.SlingGangLieutenant.class)); cards.add(new SetCardInfo("Smiting Helix", 109, Rarity.UNCOMMON, mage.cards.s.SmitingHelix.class)); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/SilumgarScavengerTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/SilumgarScavengerTest.java new file mode 100644 index 00000000000..0a105f5a14a --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/SilumgarScavengerTest.java @@ -0,0 +1,37 @@ +package org.mage.test.cards.triggers.dies; + +import mage.abilities.keyword.HasteAbility; +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.counters.CounterType; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * @author JayDi85 + */ +public class SilumgarScavengerTest extends CardTestPlayerBase { + + @Test + public void test_BoostOnDies() { + // Exploit (When this creature enters the battlefield, you may sacrifice a creature.) + // Whenever another creature you control dies, put a +1/+1 counter on Silumgar Scavenger. It gains haste until end of turn if it exploited that creature. + addCard(Zone.HAND, playerA, "Silumgar Scavenger", 1); // {4}{B} + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 5); + // + addCard(Zone.BATTLEFIELD, playerA, "Balduvian Bears", 1); + + // cast and exploit + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Silumgar Scavenger"); + setChoice(playerA, "Yes"); // yes, exploit + addTarget(playerA, "Balduvian Bears"); + + checkPermanentCounters("boost", 1, PhaseStep.BEGIN_COMBAT, playerA, "Silumgar Scavenger", CounterType.P1P1, 1); + checkAbility("boost", 1, PhaseStep.BEGIN_COMBAT, playerA, "Silumgar Scavenger", HasteAbility.class, true); + + setStopAt(1, PhaseStep.END_TURN); + setStrictChooseMode(true); + execute(); + assertAllCommandsUsed(); + } +}