diff --git a/Mage.Sets/src/mage/cards/n/NautiloidShip.java b/Mage.Sets/src/mage/cards/n/NautiloidShip.java new file mode 100644 index 00000000000..0963d4f7838 --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NautiloidShip.java @@ -0,0 +1,96 @@ +package mage.cards.n; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ExileGraveyardAllTargetPlayerEffect; +import mage.abilities.keyword.CrewAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetCard; +import mage.target.TargetPlayer; +import mage.target.common.TargetCardInExile; +import mage.util.CardUtil; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class NautiloidShip extends CardImpl { + + public NautiloidShip(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}"); + + this.subtype.add(SubType.VEHICLE); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // When Nautiloid Ship enters the battlefield, exile target player's graveyard. + Ability ability = new EntersBattlefieldTriggeredAbility(new ExileGraveyardAllTargetPlayerEffect(true)); + ability.addTarget(new TargetPlayer()); + this.addAbility(ability); + + // Whenever Nautiloid Ship deals combat damage to a player, you may put a creature card exiled with Nautiloid Ship onto the battlefield under your control. + this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new NautiloidShipEffect(), false)); + + // Crew 3 + this.addAbility(new CrewAbility(3)); + } + + private NautiloidShip(final NautiloidShip card) { + super(card); + } + + @Override + public NautiloidShip copy() { + return new NautiloidShip(this); + } +} + +class NautiloidShipEffect extends OneShotEffect { + + NautiloidShipEffect() { + super(Outcome.Benefit); + staticText = "you may put a creature card exiled with {this} onto the battlefield under your control"; + } + + private NautiloidShipEffect(final NautiloidShipEffect effect) { + super(effect); + } + + @Override + public NautiloidShipEffect copy() { + return new NautiloidShipEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + TargetCard target = new TargetCardInExile( + 0, 1, + StaticFilters.FILTER_CARD_CREATURE, + CardUtil.getExileZoneId(game, source) + ); + player.choose(outcome, target, source, game); + Card card = game.getCard(target.getFirstTarget()); + return card != null && player.moveCards(card, Zone.BATTLEFIELD, source, game); + } +} diff --git a/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java b/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java index 801999f9f6d..52d25cb328f 100644 --- a/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java +++ b/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java @@ -81,6 +81,7 @@ public final class CommanderLegendsBattleForBaldursGate extends ExpansionSet { cards.add(new SetCardInfo("Moss Diamond", 327, Rarity.COMMON, mage.cards.m.MossDiamond.class)); cards.add(new SetCardInfo("Mountain", 463, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Nalia de'Arnise", 649, Rarity.MYTHIC, mage.cards.n.NaliaDeArnise.class)); + cards.add(new SetCardInfo("Nautiloid Ship", 328, Rarity.MYTHIC, mage.cards.n.NautiloidShip.class)); cards.add(new SetCardInfo("Nemesis Phoenix", 189, Rarity.UNCOMMON, mage.cards.n.NemesisPhoenix.class)); cards.add(new SetCardInfo("Noble's Purse", 331, Rarity.UNCOMMON, mage.cards.n.NoblesPurse.class)); cards.add(new SetCardInfo("Oji, the Exquisite Blade", 290, Rarity.UNCOMMON, mage.cards.o.OjiTheExquisiteBlade.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/ExileGraveyardAllTargetPlayerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ExileGraveyardAllTargetPlayerEffect.java index eefa9afc9cf..b96ba40fabc 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ExileGraveyardAllTargetPlayerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ExileGraveyardAllTargetPlayerEffect.java @@ -6,21 +6,28 @@ import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; import mage.players.Player; +import mage.util.CardUtil; /** - * * @author LevelX2 */ - public class ExileGraveyardAllTargetPlayerEffect extends OneShotEffect { + private final boolean toUniqueExile; + public ExileGraveyardAllTargetPlayerEffect() { + this(false); + } + + public ExileGraveyardAllTargetPlayerEffect(boolean toUniqueExile) { super(Outcome.Exile); + this.toUniqueExile = toUniqueExile; staticText = "exile target player's graveyard"; } private ExileGraveyardAllTargetPlayerEffect(final ExileGraveyardAllTargetPlayerEffect effect) { super(effect); + this.toUniqueExile = effect.toUniqueExile; } @Override @@ -32,9 +39,13 @@ public class ExileGraveyardAllTargetPlayerEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); Player targetPlayer = game.getPlayer(this.getTargetPointer().getFirst(game, source)); - if (targetPlayer != null && controller != null) { - return targetPlayer.moveCards(targetPlayer.getGraveyard(), Zone.EXILED, source, game); + if (targetPlayer == null || controller == null) { + return false; } - return false; + return toUniqueExile ? + controller.moveCardsToExile( + targetPlayer.getGraveyard().getCards(game), source, game, true, + CardUtil.getExileZoneId(game, source), CardUtil.getSourceName(game, source) + ) : controller.moveCards(targetPlayer.getGraveyard(), Zone.EXILED, source, game); } }