@Override public DiscardTargetCost copy() { return new DiscardTargetCost(this); }
@Override public void adjustCosts(Ability ability, Game game) { if (ability instanceof SimpleActivatedAbility) { int xValue = ability.getManaCostsToPay().getX(); for (Cost cost : ability.getCosts()) { if (cost instanceof DiscardTargetCost) { DiscardTargetCost discardCost = (DiscardTargetCost) cost; discardCost.getTargets().clear(); FilterCard adjustedFilter = filter.copy(); // don't use it directly, it's static!!!! adjustedFilter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue)); discardCost.addTarget(new TargetCardInHand(adjustedFilter)); return; } } } }
@Override public int calculate(Game game, Ability sourceAbility, Effect effect) { for (Cost cost : sourceAbility.getCosts()) { if (cost instanceof DiscardTargetCost) { DiscardTargetCost discardCost = (DiscardTargetCost) cost; return discardCost.getCards().stream().mapToInt(Card::getConvertedManaCost).sum(); } } return 0; }
@Override public boolean apply(Game game, Ability source) { MageObject sourceObject = source.getSourceObject(game); if (sourceObject != null) { DiscardTargetCost cost = new DiscardTargetCost(new TargetCardInHand(3, 3, new FilterCard())); for (UUID playerId : game.getState().getPlayerList(source.getControllerId())) { Player player = game.getPlayer(playerId); cost.clearPaid(); if (player != null && cost.canPay(source, source.getSourceId(), player.getId(), game) && player.chooseUse(outcome, "Discard three cards to counter " + sourceObject.getIdName() + '?', source, game)) { if (cost.pay(source, game, source.getSourceId(), playerId, false, null)) { game.informPlayers(player.getLogName() + " discards 3 cards to counter " + sourceObject.getIdName() + '.'); Spell spell = game.getStack().getSpell(source.getSourceId()); if (spell != null) { game.getStack().counter(spell.getId(), source.getSourceId(), game); } } } } return true; } return false; }
public DiscardTargetCost(TargetCardInHand target, boolean randomDiscard) { this.addTarget(target); this.randomDiscard = randomDiscard; this.text = "discard " + target.getTargetName(); }
@Override public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana, Cost costToPay) { this.cards.clear(); this.targets.clearChosen(); Player player = game.getPlayer(controllerId); if (player == null) { return false; } int amount = this.getTargets().get(0).getNumberOfTargets(); if (randomDiscard) { this.cards.addAll(player.discard(amount, true, ability, game).getCards(game)); } else if (targets.choose(Outcome.Discard, controllerId, sourceId, game)) { for (UUID targetId : targets.get(0).getTargets()) { Card card = player.getHand().get(targetId, game); if (card == null) { return false; } player.discard(card, ability, game); this.cards.add(card); } } paid = cards.size() >= amount; return paid; }
@Override public Cost getFixedCostsFromAnnouncedValue(int xValue) { TargetCardInHand target = new TargetCardInHand(xValue, filter); return new DiscardTargetCost(target); } }
@Override public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null) { switch (layer) { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { permanent.addCardType(CardType.CREATURE); permanent.getSubtype(game).add(SubType.CAT); } break; case PTChangingEffects_7: if (sublayer == SubLayer.SetPT_7b) { int convManaCosts = 0; for (Cost cost: source.getCosts()) { if (cost instanceof DiscardTargetCost && !((DiscardTargetCost) cost).getCards().isEmpty()) { convManaCosts = ((DiscardTargetCost)cost).getCards().get(0).getConvertedManaCost(); break; } } permanent.getPower().setValue(convManaCosts); permanent.getToughness().setValue(convManaCosts); } } return true; } return false; }
public LimDulsPaladinEffect() { super(new DiscardTargetCost(new TargetCardInHand())); staticText = "you may discard a card. If you don't, sacrifice {this} and draw a card."; }
@Override public boolean apply(Game game, Ability source) { for (Cost cost : source.getCosts()) { if (cost instanceof DiscardTargetCost) { DiscardTargetCost discardCost = (DiscardTargetCost) cost; Card discardedCard = discardCost.getCards().get(0); if (discardedCard != null) { FilterCard filter = new FilterCard(); filter.add(new UrzasHotTubPredicate(discardedCard.getName())); return new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true, true).apply(game, source); } } } return false; } }
public MoltenTailMasticoreAbility() { super(Zone.BATTLEFIELD, new SacrificeSourceUnlessPaysEffect(new DiscardTargetCost(new TargetCardInHand()))); }
@Override public Cost getFixedCostsFromAnnouncedValue(int xValue) { TargetCardInHand target = new TargetCardInHand(xValue, new FilterCard()); return new DiscardTargetCost(target); } }
@Override public Cost getFixedCostsFromAnnouncedValue(int xValue) { TargetCardInHand target = new TargetCardInHand(xValue, new FilterCard("cards to discard")); return new DiscardTargetCost(target); } }
@Override public Cost getFixedCostsFromAnnouncedValue(int xValue) { TargetCardInHand target = new TargetCardInHand(xValue, new FilterCard()); return new DiscardTargetCost(target); } }
@Override public Cost getFixedCostsFromAnnouncedValue(int xValue) { TargetCardInHand target = new TargetCardInHand(xValue, new FilterCard()); return new DiscardTargetCost(target, true); } }
public Drekavac(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{B}"); this.subtype.add(SubType.BEAST); this.power = new MageInt(3); this.toughness = new MageInt(3); // When Drekavac enters the battlefield, sacrifice it unless you discard a noncreature card. this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new DiscardTargetCost(new TargetCardInHand(filter))))); }
public Snag(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{G}"); // You may discard a Forest card rather than pay Snag's mana cost. Ability ability = new AlternativeCostSourceAbility(new DiscardTargetCost(new TargetCardInHand(filter))); this.addAbility(ability); // Prevent all combat damage that would be dealt by unblocked creatures this turn. this.getSpellAbility().addEffect(new PreventAllDamageByAllPermanentsEffect(filter2, Duration.EndOfTurn, true)); }
public Outbreak(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{B}"); // You may discard a Swamp card rather than pay Outbreak's mana cost. this.addAbility(new AlternativeCostSourceAbility(new DiscardTargetCost(new TargetCardInHand(filterLand)))); // Choose a creature type. All creatures of that type get -1/-1 until end of turn. this.getSpellAbility().addEffect(new OutbreakEffect()); }
public SeismicAssault(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{R}{R}{R}"); // Discard a land card: Seismic Assault deals 2 damage to any target. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(2), new DiscardTargetCost(new TargetCardInHand(filter))); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); }
@Override public void adjustCosts(Ability ability, Game game) { int xValue = ability.getManaCostsToPay().getX(); if (xValue > 0) { ability.addCost(new DiscardTargetCost(new TargetCardInHand(xValue, xValue, StaticFilters.FILTER_CARD_CARDS))); } } }