From 3659a2dc0b1d543c17624d27d2cdcf892f742206 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Fri, 8 Jun 2018 13:22:23 -0400 Subject: [PATCH] Implemented Journey for the Elixir --- .../src/mage/cards/j/JourneyForTheElixir.java | 123 ++++++++++++++++++ .../src/mage/sets/JiangYangguMuYanling.java | 1 + .../java/org/mage/test/player/TestPlayer.java | 11 +- .../java/org/mage/test/stub/PlayerStub.java | 11 +- Mage/src/main/java/mage/players/Player.java | 8 +- .../main/java/mage/players/PlayerImpl.java | 16 ++- 6 files changed, 164 insertions(+), 6 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/j/JourneyForTheElixir.java diff --git a/Mage.Sets/src/mage/cards/j/JourneyForTheElixir.java b/Mage.Sets/src/mage/cards/j/JourneyForTheElixir.java new file mode 100644 index 00000000000..9b3d6d4fa19 --- /dev/null +++ b/Mage.Sets/src/mage/cards/j/JourneyForTheElixir.java @@ -0,0 +1,123 @@ +package mage.cards.j; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.StaticFilters; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.players.Player; +import mage.target.common.TargetCardInGraveyard; +import mage.target.common.TargetCardInLibrary; + +/** + * + * @author TheElk801 + */ +public final class JourneyForTheElixir extends CardImpl { + + public JourneyForTheElixir(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{G}"); + + // Search your library and graveyard for a basic land card and a card named Jiang Yanggu, reveal them, put them into your hand, then shuffle your library. + this.getSpellAbility().addEffect(new JourneyForTheElixirEffect()); + } + + public JourneyForTheElixir(final JourneyForTheElixir card) { + super(card); + } + + @Override + public JourneyForTheElixir copy() { + return new JourneyForTheElixir(this); + } +} + +class JourneyForTheElixirEffect extends OneShotEffect { + + private static final FilterCard filter = new FilterCard("card named Jiang Yanggu"); + + static { + filter.add(new NamePredicate("Jiang Yanggu")); + } + + public JourneyForTheElixirEffect() { + super(Outcome.DrawCard); + this.staticText = "search your library and graveyard for a basic land card " + + "and a card named Jiang Yanggu, reveal them, " + + "put them into your hand, then shuffle your library"; + } + + public JourneyForTheElixirEffect(final JourneyForTheElixirEffect effect) { + super(effect); + } + + @Override + public JourneyForTheElixirEffect copy() { + return new JourneyForTheElixirEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + boolean walkerFound = false; + boolean landFound = false; + Cards cardsToHand = new CardsImpl(); + if (player.chooseUse(outcome, "Search your graveyard?", source, game)) { + TargetCardInGraveyard targetWalker = new TargetCardInGraveyard(0, 1, filter); + targetWalker.setNotTarget(true); + if (player.choose(outcome, targetWalker, source.getSourceId(), game)) { + Card card = game.getCard(targetWalker.getFirstTarget()); + if (card != null) { + cardsToHand.add(card); + walkerFound = true; + } + } + TargetCardInGraveyard targetLand = new TargetCardInGraveyard(0, 1, StaticFilters.FILTER_CARD_BASIC_LAND_A); + targetLand.setNotTarget(true); + if (player.choose(outcome, targetLand, source.getSourceId(), game)) { + Card card = game.getCard(targetLand.getFirstTarget()); + if (card != null) { + cardsToHand.add(card); + landFound = true; + } + } + } + if (!walkerFound || !landFound) { + TargetCardInLibrary targetWalker = new TargetCardInLibrary(0, 1, filter); + targetWalker.setNotTarget(true); + if (!walkerFound && player.searchLibrary(targetWalker, game, false)) { + Card card = game.getCard(targetWalker.getFirstTarget()); + if (card != null) { + cardsToHand.add(card); + } + } + TargetCardInLibrary targetLand = new TargetCardInLibrary(0, 1, StaticFilters.FILTER_CARD_BASIC_LAND_A); + targetLand.setNotTarget(true); + if (!landFound && player.searchLibrary(targetLand, game, false)) { + Card card = game.getCard(targetLand.getFirstTarget()); + if (card != null) { + cardsToHand.add(card); + } + } + } + game.fireEvent(GameEvent.getEvent(GameEvent.EventType.LIBRARY_SEARCHED, player.getId(), player.getId())); + player.revealCards(source, cardsToHand, game); + player.moveCards(cardsToHand, Zone.HAND, source, game); + player.shuffleLibrary(source, game); + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/JiangYangguMuYanling.java b/Mage.Sets/src/mage/sets/JiangYangguMuYanling.java index 5b73cffd3dc..1121e75f8c1 100644 --- a/Mage.Sets/src/mage/sets/JiangYangguMuYanling.java +++ b/Mage.Sets/src/mage/sets/JiangYangguMuYanling.java @@ -42,6 +42,7 @@ public final class JiangYangguMuYanling extends ExpansionSet { cards.add(new SetCardInfo("Heavenly Qilin", 6, Rarity.COMMON, mage.cards.h.HeavenlyQilin.class)); cards.add(new SetCardInfo("Island", 21, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Jiang Yanggu", 22, Rarity.MYTHIC, mage.cards.j.JiangYanggu.class)); + cards.add(new SetCardInfo("Journey for the Elixir", 36, Rarity.RARE, mage.cards.j.JourneyForTheElixir.class)); cards.add(new SetCardInfo("Leopard-Spotted Jiao", 23, Rarity.COMMON, mage.cards.l.LeopardSpottedJiao.class)); cards.add(new SetCardInfo("Meandering River", 19, Rarity.COMMON, mage.cards.m.MeanderingRiver.class)); cards.add(new SetCardInfo("Moon-Eating Dog", 10, Rarity.UNCOMMON, mage.cards.m.MoonEatingDog.class)); diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index b24a6c6355c..dfa9e587d0a 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -1,4 +1,3 @@ - package org.mage.test.player; import java.io.Serializable; @@ -1991,11 +1990,21 @@ public class TestPlayer implements Player { return computerPlayer.searchLibrary(target, game); } + @Override + public boolean searchLibrary(TargetCardInLibrary target, Game game, boolean triggerEvents) { + return computerPlayer.searchLibrary(target, game, triggerEvents); + } + @Override public boolean searchLibrary(TargetCardInLibrary target, Game game, UUID targetPlayerId) { return computerPlayer.searchLibrary(target, game, targetPlayerId); } + @Override + public boolean searchLibrary(TargetCardInLibrary target, Game game, UUID targetPlayerId, boolean triggerEvents) { + return computerPlayer.searchLibrary(target, game, targetPlayerId, triggerEvents); + } + @Override public boolean flipCoin(Game game) { return computerPlayer.flipCoin(game); diff --git a/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java b/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java index 29d51f0ab89..43a16020dcf 100644 --- a/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java +++ b/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java @@ -1,4 +1,3 @@ - package org.mage.test.stub; import java.io.Serializable; @@ -583,11 +582,21 @@ public class PlayerStub implements Player { return false; } + @Override + public boolean searchLibrary(TargetCardInLibrary target, Game game, boolean triggerEvents) { + return false; + } + @Override public boolean searchLibrary(TargetCardInLibrary target, Game game, UUID targetPlayerId) { return false; } + @Override + public boolean searchLibrary(TargetCardInLibrary target, Game game, UUID targetPlayerId, boolean triggerEvents) { + return false; + } + @Override public boolean canPlayLand() { return false; diff --git a/Mage/src/main/java/mage/players/Player.java b/Mage/src/main/java/mage/players/Player.java index 6a51f097456..7745a768e07 100644 --- a/Mage/src/main/java/mage/players/Player.java +++ b/Mage/src/main/java/mage/players/Player.java @@ -1,4 +1,3 @@ - package mage.players; import java.io.Serializable; @@ -352,14 +351,19 @@ public interface Player extends MageItem, Copyable { boolean searchLibrary(TargetCardInLibrary target, Game game); + boolean searchLibrary(TargetCardInLibrary target, Game game, boolean triggerEvents); + + boolean searchLibrary(TargetCardInLibrary target, Game game, UUID targetPlayerId); + /** * * @param target * @param game * @param targetPlayerId player whose library will be searched + * @param triggerEvents whether searching will trigger any game events * @return true if search was successful */ - boolean searchLibrary(TargetCardInLibrary target, Game game, UUID targetPlayerId); + boolean searchLibrary(TargetCardInLibrary target, Game game, UUID targetPlayerId, boolean triggerEvents); boolean canPlayLand(); diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index 72ec976a510..39d60b01ffd 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -2354,11 +2354,21 @@ public abstract class PlayerImpl implements Player, Serializable { @Override public boolean searchLibrary(TargetCardInLibrary target, Game game) { - return searchLibrary(target, game, playerId); + return searchLibrary(target, game, playerId, true); + } + + @Override + public boolean searchLibrary(TargetCardInLibrary target, Game game, boolean triggerEvents) { + return searchLibrary(target, game, playerId, triggerEvents); } @Override public boolean searchLibrary(TargetCardInLibrary target, Game game, UUID targetPlayerId) { + return searchLibrary(target, game, targetPlayerId, true); + } + + @Override + public boolean searchLibrary(TargetCardInLibrary target, Game game, UUID targetPlayerId, boolean triggerEvents) { //20091005 - 701.14c Library searchedLibrary = null; String searchInfo = null; @@ -2414,7 +2424,9 @@ public abstract class PlayerImpl implements Player, Serializable { for (UUID targetId : newTarget.getTargets()) { target.add(targetId, game); } - game.fireEvent(GameEvent.getEvent(GameEvent.EventType.LIBRARY_SEARCHED, targetPlayerId, playerId)); + if (triggerEvents) { + game.fireEvent(GameEvent.getEvent(GameEvent.EventType.LIBRARY_SEARCHED, targetPlayerId, playerId)); + } } else if (targetPlayerId.equals(playerId) && handleLibraryCastableCards(library, game, targetPlayerId)) { // for handling Panglacial Wurm newTarget.clearChosen(); continue;