mirror of
https://github.com/magefree/mage.git
synced 2025-12-19 18:20:13 -08:00
[SLD] Implement Nathan Drake, Treasure Hunter
This commit is contained in:
parent
89f2efd7a9
commit
a3e155918b
3 changed files with 144 additions and 0 deletions
140
Mage.Sets/src/mage/cards/n/NathanDrakeTreasureHunter.java
Normal file
140
Mage.Sets/src/mage/cards/n/NathanDrakeTreasureHunter.java
Normal file
|
|
@ -0,0 +1,140 @@
|
||||||
|
package mage.cards.n;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.AttacksTriggeredAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.effects.AsThoughEffectImpl;
|
||||||
|
import mage.abilities.effects.AsThoughManaEffect;
|
||||||
|
import mage.abilities.effects.OneShotEffect;
|
||||||
|
import mage.abilities.keyword.FirstStrikeAbility;
|
||||||
|
import mage.cards.*;
|
||||||
|
import mage.constants.*;
|
||||||
|
import mage.filter.StaticFilters;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.players.ManaPoolItem;
|
||||||
|
import mage.players.Player;
|
||||||
|
import mage.target.TargetCard;
|
||||||
|
import mage.target.common.TargetCardInExile;
|
||||||
|
import mage.util.CardUtil;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class NathanDrakeTreasureHunter extends CardImpl {
|
||||||
|
|
||||||
|
public NathanDrakeTreasureHunter(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}{B}{R}");
|
||||||
|
|
||||||
|
this.supertype.add(SuperType.LEGENDARY);
|
||||||
|
this.subtype.add(SubType.HUMAN);
|
||||||
|
this.subtype.add(SubType.ROGUE);
|
||||||
|
this.power = new MageInt(3);
|
||||||
|
this.toughness = new MageInt(2);
|
||||||
|
|
||||||
|
// First strike
|
||||||
|
this.addAbility(FirstStrikeAbility.getInstance());
|
||||||
|
|
||||||
|
// You may spend mana as though it were mana of any color to cast spells you don't own or to activate abilities of permanents you control but don't own.
|
||||||
|
this.addAbility(new SimpleStaticAbility(new NathanDrakeTreasureHunterManaEffect()));
|
||||||
|
|
||||||
|
// Whenever Nathan Drake attacks, exile the top card of each player's library. You may cast a spell from among those cards.
|
||||||
|
this.addAbility(new AttacksTriggeredAbility(new NathanDrakeTreasureHunterCastEffect()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private NathanDrakeTreasureHunter(final NathanDrakeTreasureHunter card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NathanDrakeTreasureHunter copy() {
|
||||||
|
return new NathanDrakeTreasureHunter(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class NathanDrakeTreasureHunterManaEffect extends AsThoughEffectImpl implements AsThoughManaEffect {
|
||||||
|
|
||||||
|
NathanDrakeTreasureHunterManaEffect() {
|
||||||
|
super(AsThoughEffectType.SPEND_OTHER_MANA, Duration.Custom, Outcome.Benefit);
|
||||||
|
staticText = "you may spend mana as though it were mana of any color to cast spells you don't own " +
|
||||||
|
"or to activate abilities of permanents you control but don't own";
|
||||||
|
}
|
||||||
|
|
||||||
|
private NathanDrakeTreasureHunterManaEffect(final NathanDrakeTreasureHunterManaEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NathanDrakeTreasureHunterManaEffect copy() {
|
||||||
|
return new NathanDrakeTreasureHunterManaEffect(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
|
||||||
|
Card card = game.getCard(CardUtil.getMainCardId(game, objectId));
|
||||||
|
return card != null && !card.isOwnedBy(affectedControllerId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ManaType getAsThoughManaType(ManaType manaType, ManaPoolItem mana, UUID affectedControllerId, Ability source, Game game) {
|
||||||
|
return mana.getFirstAvailable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class NathanDrakeTreasureHunterCastEffect extends OneShotEffect {
|
||||||
|
|
||||||
|
NathanDrakeTreasureHunterCastEffect() {
|
||||||
|
super(Outcome.Benefit);
|
||||||
|
staticText = "exile the top card of each player's library. You may cast a spell from among those cards";
|
||||||
|
}
|
||||||
|
|
||||||
|
private NathanDrakeTreasureHunterCastEffect(final NathanDrakeTreasureHunterCastEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NathanDrakeTreasureHunterCastEffect copy() {
|
||||||
|
return new NathanDrakeTreasureHunterCastEffect(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
Player player = game.getPlayer(source.getControllerId());
|
||||||
|
if (player == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Cards cards = new CardsImpl(game
|
||||||
|
.getState()
|
||||||
|
.getPlayersInRange(source.getControllerId(), game)
|
||||||
|
.stream()
|
||||||
|
.map(game::getPlayer)
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.map(Player::getLibrary)
|
||||||
|
.map(library -> library.getFromTop(game))
|
||||||
|
.collect(Collectors.toSet()));
|
||||||
|
if (cards.isEmpty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
player.moveCards(cards, Zone.EXILED, source, game);
|
||||||
|
cards.removeIf(uuid -> CardUtil.getCastableComponents(
|
||||||
|
game.getCard(uuid), StaticFilters.FILTER_CARD,
|
||||||
|
source, player, game, null, false
|
||||||
|
).isEmpty());
|
||||||
|
TargetCard target = new TargetCardInExile(0, 1, StaticFilters.FILTER_CARD);
|
||||||
|
target.withChooseHint("to cast");
|
||||||
|
target.withNotTarget(true);
|
||||||
|
player.choose(Outcome.DrawCard, cards, target, source, game);
|
||||||
|
Card card = game.getCard(target.getFirstTarget());
|
||||||
|
CardUtil.castSingle(player, source, game, card);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2169,6 +2169,7 @@ public class SecretLairDrop extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Teferi's Ageless Insight", 2214, Rarity.RARE, mage.cards.t.TeferisAgelessInsight.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Teferi's Ageless Insight", 2214, Rarity.RARE, mage.cards.t.TeferisAgelessInsight.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Teferi's Ageless Insight", "2214b", Rarity.RARE, mage.cards.t.TeferisAgelessInsight.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Teferi's Ageless Insight", "2214b", Rarity.RARE, mage.cards.t.TeferisAgelessInsight.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Iroas, God of Victory", 2215, Rarity.MYTHIC, mage.cards.i.IroasGodOfVictory.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Iroas, God of Victory", 2215, Rarity.MYTHIC, mage.cards.i.IroasGodOfVictory.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Nathan Drake, Treasure Hunter", 2216, Rarity.MYTHIC, mage.cards.n.NathanDrakeTreasureHunter.class));
|
||||||
cards.add(new SetCardInfo("Midnight Clock", 2217, Rarity.RARE, mage.cards.m.MidnightClock.class));
|
cards.add(new SetCardInfo("Midnight Clock", 2217, Rarity.RARE, mage.cards.m.MidnightClock.class));
|
||||||
cards.add(new SetCardInfo("Whip of Erebos", 2218, Rarity.RARE, mage.cards.w.WhipOfErebos.class));
|
cards.add(new SetCardInfo("Whip of Erebos", 2218, Rarity.RARE, mage.cards.w.WhipOfErebos.class));
|
||||||
cards.add(new SetCardInfo("Chain Reaction", 2219, Rarity.RARE, mage.cards.c.ChainReaction.class));
|
cards.add(new SetCardInfo("Chain Reaction", 2219, Rarity.RARE, mage.cards.c.ChainReaction.class));
|
||||||
|
|
|
||||||
|
|
@ -1453,6 +1453,9 @@ public final class CardUtil {
|
||||||
public static List<Card> getCastableComponents(Card cardToCast, FilterCard filter, Ability source, Player player, Game game, SpellCastTracker spellCastTracker, boolean playLand) {
|
public static List<Card> getCastableComponents(Card cardToCast, FilterCard filter, Ability source, Player player, Game game, SpellCastTracker spellCastTracker, boolean playLand) {
|
||||||
UUID playerId = player.getId();
|
UUID playerId = player.getId();
|
||||||
List<Card> cards = new ArrayList<>();
|
List<Card> cards = new ArrayList<>();
|
||||||
|
if (cardToCast == null) {
|
||||||
|
return cards;
|
||||||
|
}
|
||||||
if (cardToCast instanceof CardWithHalves) {
|
if (cardToCast instanceof CardWithHalves) {
|
||||||
cards.add(((CardWithHalves) cardToCast).getLeftHalfCard());
|
cards.add(((CardWithHalves) cardToCast).getLeftHalfCard());
|
||||||
cards.add(((CardWithHalves) cardToCast).getRightHalfCard());
|
cards.add(((CardWithHalves) cardToCast).getRightHalfCard());
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue