From 9ec6b617b805203cbb2258d4d3ff28da4ca9ab41 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Sun, 6 Feb 2022 11:10:40 -0500 Subject: [PATCH] [NEO] Implemented Shigeki, Jukai Visionary --- .../mage/cards/s/ShigekiJukaiVisionary.java | 113 ++++++++++++++++++ .../src/mage/sets/KamigawaNeonDynasty.java | 1 + .../src/main/java/mage/abilities/Ability.java | 2 +- .../main/java/mage/abilities/AbilityImpl.java | 3 +- .../java/mage/game/stack/StackAbility.java | 3 +- 5 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/s/ShigekiJukaiVisionary.java diff --git a/Mage.Sets/src/mage/cards/s/ShigekiJukaiVisionary.java b/Mage.Sets/src/mage/cards/s/ShigekiJukaiVisionary.java new file mode 100644 index 00000000000..78a3a3d5870 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/ShigekiJukaiVisionary.java @@ -0,0 +1,113 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.ReturnToHandFromBattlefieldSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; +import mage.abilities.keyword.ChannelAbility; +import mage.cards.*; +import mage.constants.*; +import mage.filter.FilterCard; +import mage.filter.StaticFilters; +import mage.filter.predicate.Predicates; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetCard; +import mage.target.common.TargetCardInLibrary; +import mage.target.common.TargetCardInYourGraveyard; +import mage.target.targetadjustment.TargetAdjuster; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ShigekiJukaiVisionary extends CardImpl { + + public ShigekiJukaiVisionary(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "{1}{G}"); + + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.SNAKE); + this.subtype.add(SubType.DRUID); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // {1}{G}, {T}, Return Shigeki, Jukai Visionary to its owner's hand: Reveal the top four cards of your library. You may put a land card from among them onto the battlefield tapped. Put the rest into your graveyard. + Ability ability = new SimpleActivatedAbility(new ShigekiJukaiVisionaryEffect(), new ManaCostsImpl<>("{1}{G}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new ReturnToHandFromBattlefieldSourceCost()); + this.addAbility(ability); + + // Channel — {X}{X}{G}{G}, Discard Shigeki: Return X target nonlegendary cards from your graveyard to your hand. + this.addAbility(new ChannelAbility( + "{X}{X}{G}{G}", new ReturnFromGraveyardToHandTargetEffect() + .setText("return X target nonlegendary cards from your graveyard to your hand") + ).setTargetAdjuster(ShigekiJukaiVisionaryAdjuster.instance)); + } + + private ShigekiJukaiVisionary(final ShigekiJukaiVisionary card) { + super(card); + } + + @Override + public ShigekiJukaiVisionary copy() { + return new ShigekiJukaiVisionary(this); + } +} + +enum ShigekiJukaiVisionaryAdjuster implements TargetAdjuster { + instance; + private static final FilterCard filter = new FilterCard("nonlegendary cards from your graveyard"); + + static { + filter.add(Predicates.not(SuperType.LEGENDARY.getPredicate())); + } + + @Override + public void adjustTargets(Ability ability, Game game) { + ability.getTargets().clear(); + ability.addTarget(new TargetCardInYourGraveyard(ability.getManaCostsToPay().getX(), filter)); + } +} + +class ShigekiJukaiVisionaryEffect extends OneShotEffect { + + ShigekiJukaiVisionaryEffect() { + super(Outcome.Benefit); + staticText = "reveal the top four cards of your library. You may put a land card " + + "from among them onto the battlefield tapped. Put the rest into your graveyard"; + } + + private ShigekiJukaiVisionaryEffect(final ShigekiJukaiVisionaryEffect effect) { + super(effect); + } + + @Override + public ShigekiJukaiVisionaryEffect copy() { + return new ShigekiJukaiVisionaryEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, 4)); + player.revealCards(source, cards, game); + TargetCard target = new TargetCardInLibrary(0, 1, StaticFilters.FILTER_CARD_LAND); + player.choose(outcome, cards, target, game); + Card card = game.getCard(target.getFirstTarget()); + if (card != null) { + player.moveCards(card, Zone.BATTLEFIELD, source, game, true, false, true, null); + cards.remove(card); + } + player.moveCards(cards, Zone.GRAVEYARD, source, game); + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/KamigawaNeonDynasty.java b/Mage.Sets/src/mage/sets/KamigawaNeonDynasty.java index ad239bc3166..e8e6b7c7852 100644 --- a/Mage.Sets/src/mage/sets/KamigawaNeonDynasty.java +++ b/Mage.Sets/src/mage/sets/KamigawaNeonDynasty.java @@ -229,6 +229,7 @@ public final class KamigawaNeonDynasty extends ExpansionSet { cards.add(new SetCardInfo("Selfless Samurai", 35, Rarity.UNCOMMON, mage.cards.s.SelflessSamurai.class)); cards.add(new SetCardInfo("Seshiro's Living Legacy", 210, Rarity.COMMON, mage.cards.s.SeshirosLivingLegacy.class)); cards.add(new SetCardInfo("Seven-Tail Mentor", 36, Rarity.COMMON, mage.cards.s.SevenTailMentor.class)); + cards.add(new SetCardInfo("Shigeki, Jukai Visionary", 206, Rarity.RARE, mage.cards.s.ShigekiJukaiVisionary.class)); cards.add(new SetCardInfo("Short Circuit", 78, Rarity.COMMON, mage.cards.s.ShortCircuit.class)); cards.add(new SetCardInfo("Shrine Steward", 259, Rarity.COMMON, mage.cards.s.ShrineSteward.class)); cards.add(new SetCardInfo("Silver-Fur Master", 236, Rarity.UNCOMMON, mage.cards.s.SilverFurMaster.class)); diff --git a/Mage/src/main/java/mage/abilities/Ability.java b/Mage/src/main/java/mage/abilities/Ability.java index 725c671925a..42b6ab715bc 100644 --- a/Mage/src/main/java/mage/abilities/Ability.java +++ b/Mage/src/main/java/mage/abilities/Ability.java @@ -541,7 +541,7 @@ public interface Ability extends Controllable, Serializable { boolean canFizzle(); - void setTargetAdjuster(TargetAdjuster targetAdjuster); + Ability setTargetAdjuster(TargetAdjuster targetAdjuster); TargetAdjuster getTargetAdjuster(); diff --git a/Mage/src/main/java/mage/abilities/AbilityImpl.java b/Mage/src/main/java/mage/abilities/AbilityImpl.java index 2fe0359df17..1ab3dec13c9 100644 --- a/Mage/src/main/java/mage/abilities/AbilityImpl.java +++ b/Mage/src/main/java/mage/abilities/AbilityImpl.java @@ -1325,8 +1325,9 @@ public abstract class AbilityImpl implements Ability { } @Override - public void setTargetAdjuster(TargetAdjuster targetAdjuster) { + public AbilityImpl setTargetAdjuster(TargetAdjuster targetAdjuster) { this.targetAdjuster = targetAdjuster; + return this; } @Override diff --git a/Mage/src/main/java/mage/game/stack/StackAbility.java b/Mage/src/main/java/mage/game/stack/StackAbility.java index bfddba81ce0..323ccb7b533 100644 --- a/Mage/src/main/java/mage/game/stack/StackAbility.java +++ b/Mage/src/main/java/mage/game/stack/StackAbility.java @@ -657,8 +657,9 @@ public class StackAbility extends StackObjectImpl implements Ability { } @Override - public void setTargetAdjuster(TargetAdjuster targetAdjuster) { + public StackAbility setTargetAdjuster(TargetAdjuster targetAdjuster) { this.targetAdjuster = targetAdjuster; + return this; } @Override