mirror of
https://github.com/magefree/mage.git
synced 2025-12-22 03:22:00 -08:00
[SNC] Implemented Dusk Mangler
This commit is contained in:
parent
dcb893dbf7
commit
342eabbfa7
36 changed files with 177 additions and 108 deletions
|
|
@ -37,9 +37,8 @@ public final class ArcticNishoba extends CardImpl {
|
|||
|
||||
// Cumulative upkeep {G} or {W}
|
||||
this.addAbility(new CumulativeUpkeepAbility(new OrCost(
|
||||
new ManaCostsImpl("{G}"),
|
||||
new ManaCostsImpl("{W}"),
|
||||
"{G} or {W}"
|
||||
"{G} or {W}", new ManaCostsImpl("{G}"),
|
||||
new ManaCostsImpl("{W}")
|
||||
)));
|
||||
|
||||
// When Arctic Nishoba dies, you gain 2 life for each age counter on it.
|
||||
|
|
|
|||
|
|
@ -28,9 +28,9 @@ public final class BayouGroff extends CardImpl {
|
|||
|
||||
// As an additional cost to cast this spell, sacrifice a creature or pay {3}.
|
||||
this.getSpellAbility().addCost(new OrCost(
|
||||
new SacrificeTargetCost(new TargetControlledPermanent(
|
||||
"sacrifice a creature or pay {3}", new SacrificeTargetCost(new TargetControlledPermanent(
|
||||
StaticFilters.FILTER_CONTROLLED_CREATURE_SHORT_TEXT
|
||||
)), new GenericManaCost(3), "sacrifice a creature or pay {3}"
|
||||
)), new GenericManaCost(3)
|
||||
));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -22,8 +22,8 @@ public final class BoneShards extends CardImpl {
|
|||
|
||||
// As an additional cost to cast this spell, sacrifice a creature or discard a card.
|
||||
this.getSpellAbility().addCost(new OrCost(
|
||||
new SacrificeTargetCost(new TargetControlledCreaturePermanent()),
|
||||
new DiscardCardCost(), "sacrifice a creature or discard a card"
|
||||
"sacrifice a creature or discard a card", new SacrificeTargetCost(new TargetControlledCreaturePermanent()),
|
||||
new DiscardCardCost()
|
||||
));
|
||||
|
||||
// Destroy target creature or planeswalker.
|
||||
|
|
|
|||
|
|
@ -33,10 +33,9 @@ public final class CryptLurker extends CardImpl {
|
|||
this.addAbility(new EntersBattlefieldTriggeredAbility(new DoIfCostPaid(
|
||||
new DrawCardSourceControllerEffect(1),
|
||||
new OrCost(
|
||||
new SacrificeTargetCost(new TargetControlledPermanent(
|
||||
"sacrifice a creature or discard a creature card", new SacrificeTargetCost(new TargetControlledPermanent(
|
||||
StaticFilters.FILTER_CONTROLLED_CREATURE_SHORT_TEXT
|
||||
)), new DiscardTargetCost(new TargetCardInHand(StaticFilters.FILTER_CARD_CREATURE_A)),
|
||||
"sacrifice a creature or discard a creature card"
|
||||
)), new DiscardTargetCost(new TargetCardInHand(StaticFilters.FILTER_CARD_CREATURE_A))
|
||||
)
|
||||
)));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,9 +34,8 @@ public final class CrystalShard extends CardImpl {
|
|||
Ability ability = new SimpleActivatedAbility(
|
||||
new CrystalShardEffect(),
|
||||
new OrCost(
|
||||
new CompositeCost(new GenericManaCost(3), new TapSourceCost(), "{3}, {T}"),
|
||||
new CompositeCost(new ManaCostsImpl<>("{U}"), new TapSourceCost(), "{U}, {T}"),
|
||||
"{3}, {T} or {U}, {T}"
|
||||
"{3}, {T} or {U}, {T}", new CompositeCost(new GenericManaCost(3), new TapSourceCost(), "{3}, {T}"),
|
||||
new CompositeCost(new ManaCostsImpl<>("{U}"), new TapSourceCost(), "{U}, {T}")
|
||||
)
|
||||
);
|
||||
ability.addTarget(new TargetCreaturePermanent());
|
||||
|
|
|
|||
|
|
@ -34,9 +34,9 @@ public final class DaringBuccaneer extends CardImpl {
|
|||
|
||||
// As an additional cost to cast Daring Buccaneer, reveal a Pirate card from your hand or pay {2}.
|
||||
this.getSpellAbility().addCost(new OrCost(
|
||||
new RevealTargetFromHandCost(new TargetCardInHand(filter)),
|
||||
new GenericManaCost(2),
|
||||
"reveal a Pirate card from your hand or pay {2}"));
|
||||
"reveal a Pirate card from your hand or pay {2}", new RevealTargetFromHandCost(new TargetCardInHand(filter)),
|
||||
new GenericManaCost(2)
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -32,8 +32,8 @@ public final class DisruptionProtocol extends CardImpl {
|
|||
|
||||
// As an additional cost to cast this spell, tap an untapped artifact you control or pay {1}.
|
||||
this.getSpellAbility().addCost(new OrCost(
|
||||
new TapTargetCost(new TargetControlledPermanent(filter)),
|
||||
new GenericManaCost(1), "tap an untapped artifact you control or pay {1}"
|
||||
"tap an untapped artifact you control or pay {1}", new TapTargetCost(new TargetControlledPermanent(filter)),
|
||||
new GenericManaCost(1)
|
||||
));
|
||||
|
||||
// Counter target spell.
|
||||
|
|
|
|||
58
Mage.Sets/src/mage/cards/d/DuskMangler.java
Normal file
58
Mage.Sets/src/mage/cards/d/DuskMangler.java
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
package mage.cards.d;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.costs.OrCost;
|
||||
import mage.abilities.costs.common.DiscardCardCost;
|
||||
import mage.abilities.costs.common.PayLifeCost;
|
||||
import mage.abilities.costs.common.SacrificeTargetCost;
|
||||
import mage.abilities.effects.common.LoseLifeOpponentsEffect;
|
||||
import mage.abilities.effects.common.SacrificeOpponentsEffect;
|
||||
import mage.abilities.effects.common.discard.DiscardEachPlayerEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.TargetController;
|
||||
import mage.filter.StaticFilters;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class DuskMangler extends CardImpl {
|
||||
|
||||
public DuskMangler(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{B}{B}");
|
||||
|
||||
this.subtype.add(SubType.HORROR);
|
||||
this.power = new MageInt(5);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
// As an additional cost to cast this spell, sacrifice a creature, discard a card, or pay 4 life.
|
||||
this.getSpellAbility().addCost(new OrCost(
|
||||
"sacrifice a creature, discard a card, or pay 4 life",
|
||||
new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_CREATURE_SHORT_TEXT),
|
||||
new DiscardCardCost(), new PayLifeCost(4)
|
||||
));
|
||||
|
||||
// When Dusk Mangler enters the battlefield, each opponent sacrifices a creature, discards a card, and loses 4 life.
|
||||
Ability ability = new EntersBattlefieldTriggeredAbility(
|
||||
new SacrificeOpponentsEffect(StaticFilters.FILTER_PERMANENT_A_CREATURE)
|
||||
);
|
||||
ability.addEffect(new DiscardEachPlayerEffect(TargetController.OPPONENT).setText(", discards a card"));
|
||||
ability.addEffect(new LoseLifeOpponentsEffect(4).setText(", and loses 4 life"));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private DuskMangler(final DuskMangler card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DuskMangler copy() {
|
||||
return new DuskMangler(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -37,9 +37,8 @@ public final class EarthenGoo extends CardImpl {
|
|||
|
||||
// Cumulative upkeep {R} or {G}
|
||||
this.addAbility(new CumulativeUpkeepAbility(new OrCost(
|
||||
new ManaCostsImpl("{R}"),
|
||||
new ManaCostsImpl("{G}"),
|
||||
"{R} or {G}"
|
||||
"{R} or {G}", new ManaCostsImpl("{R}"),
|
||||
new ManaCostsImpl("{G}")
|
||||
)));
|
||||
|
||||
// Earthen Goo gets +1/+1 for each age counter on it.
|
||||
|
|
|
|||
|
|
@ -22,8 +22,8 @@ public final class EatenAlive extends CardImpl {
|
|||
|
||||
// As an additional cost to cast this spell, sacrifice a creature or pay {3}{B}.
|
||||
this.getSpellAbility().addCost(new OrCost(
|
||||
new SacrificeTargetCost(new TargetControlledCreaturePermanent()),
|
||||
new ManaCostsImpl<>("{3}{B}"), "sacrifice a creature or pay {3}{B}"
|
||||
"sacrifice a creature or pay {3}{B}", new SacrificeTargetCost(new TargetControlledCreaturePermanent()),
|
||||
new ManaCostsImpl<>("{3}{B}")
|
||||
));
|
||||
|
||||
// Exile target creature or planeswalker.
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ class EmberwildeDjinnEffect extends OneShotEffect {
|
|||
if (player == null || sourceObject == null) {
|
||||
return false;
|
||||
}
|
||||
Cost cost = new OrCost(new ManaCostsImpl("{R}{R}"), new PayLifeCost(2), "{R}{R} or 2 life");
|
||||
Cost cost = new OrCost("{R}{R} or 2 life", new ManaCostsImpl("{R}{R}"), new PayLifeCost(2));
|
||||
if (player.chooseUse(Outcome.GainControl, "Gain control of " + sourceObject.getLogName() + "?", source, game)) {
|
||||
if (cost.pay(source, game, source, player.getId(), false)) {
|
||||
ContinuousEffect effect = new GainControlTargetEffect(Duration.Custom, false, player.getId());
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ public final class Erosion extends CardImpl {
|
|||
this.addAbility(new EnchantAbility(auraTarget.getTargetName()));
|
||||
|
||||
// At the beginning of the upkeep of enchanted land's controller, destroy that land unless that player pays {1} or 1 life.
|
||||
Effect effect = new DoUnlessTargetPlayerOrTargetsControllerPaysEffect(new DestroyAttachedToEffect("enchanted land"), new OrCost(new ManaCostsImpl("{1}"), new PayLifeCost(1), "{1} or 1 life"));
|
||||
Effect effect = new DoUnlessTargetPlayerOrTargetsControllerPaysEffect(new DestroyAttachedToEffect("enchanted land"), new OrCost("{1} or 1 life", new ManaCostsImpl("{1}"), new PayLifeCost(1)));
|
||||
effect.setText("destroy that land unless that player pays {1} or 1 life");
|
||||
this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, effect, TargetController.CONTROLLER_ATTACHED_TO, false, true, "At the beginning of the upkeep of enchanted land's controller, "));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,8 +33,8 @@ public final class FinalPayment extends CardImpl {
|
|||
final Cost lifeCost = new PayLifeCost(5);
|
||||
final Cost sacrificeCost = new SacrificeTargetCost(new TargetControlledPermanent(filter));
|
||||
|
||||
this.getSpellAbility().addCost(new OrCost(lifeCost, sacrificeCost,
|
||||
"pay 5 life or sacrifice a creature or enchantment"));
|
||||
this.getSpellAbility().addCost(new OrCost("pay 5 life or sacrifice a creature or enchantment", lifeCost, sacrificeCost
|
||||
));
|
||||
|
||||
// Destroy target creature
|
||||
this.getSpellAbility().addEffect(new DestroyTargetEffect());
|
||||
|
|
|
|||
|
|
@ -34,9 +34,9 @@ public final class FlamekinBladewhirl extends CardImpl {
|
|||
|
||||
// As an additional cost to cast Flamekin Bladewhirl, reveal an Elemental card from your hand or pay {3}.
|
||||
this.getSpellAbility().addCost(new OrCost(
|
||||
new RevealTargetFromHandCost(new TargetCardInHand(filter)),
|
||||
new GenericManaCost(3),
|
||||
"reveal an Elemental card from your hand or pay {3}"));
|
||||
"reveal an Elemental card from your hand or pay {3}", new RevealTargetFromHandCost(new TargetCardInHand(filter)),
|
||||
new GenericManaCost(3)
|
||||
));
|
||||
}
|
||||
|
||||
private FlamekinBladewhirl(final FlamekinBladewhirl card) {
|
||||
|
|
|
|||
|
|
@ -34,9 +34,9 @@ public final class GoldmeadowStalwart extends CardImpl {
|
|||
|
||||
// As an additional cost to cast Goldmeadow Stalwart, reveal a Kithkin card from your hand or pay {3}.
|
||||
this.getSpellAbility().addCost(new OrCost(
|
||||
new RevealTargetFromHandCost(new TargetCardInHand(filter)),
|
||||
new GenericManaCost(3),
|
||||
"reveal a Kithkin card from your hand or pay {3}"));
|
||||
"reveal a Kithkin card from your hand or pay {3}", new RevealTargetFromHandCost(new TargetCardInHand(filter)),
|
||||
new GenericManaCost(3)
|
||||
));
|
||||
}
|
||||
|
||||
private GoldmeadowStalwart(final GoldmeadowStalwart card) {
|
||||
|
|
|
|||
|
|
@ -27,9 +27,8 @@ public final class GraniteShard extends CardImpl {
|
|||
Ability ability = new SimpleActivatedAbility(
|
||||
new DamageTargetEffect(1),
|
||||
new OrCost(
|
||||
new CompositeCost(new GenericManaCost(3), new TapSourceCost(), "{3}, {T}"),
|
||||
new CompositeCost(new ManaCostsImpl<>("{R}"), new TapSourceCost(), "{R}, {T}"),
|
||||
"{3}, {T} or {R}, {T}"
|
||||
"{3}, {T} or {R}, {T}", new CompositeCost(new GenericManaCost(3), new TapSourceCost(), "{3}, {T}"),
|
||||
new CompositeCost(new ManaCostsImpl<>("{R}"), new TapSourceCost(), "{R}, {T}")
|
||||
)
|
||||
);
|
||||
ability.addTarget(new TargetAnyTarget());
|
||||
|
|
|
|||
|
|
@ -29,9 +29,8 @@ public final class HeartwoodShard extends CardImpl {
|
|||
Ability ability = new SimpleActivatedAbility(
|
||||
new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn),
|
||||
new OrCost(
|
||||
new CompositeCost(new GenericManaCost(3), new TapSourceCost(), "{3}, {T}"),
|
||||
new CompositeCost(new ManaCostsImpl<>("{G}"), new TapSourceCost(), "{G}, {T}"),
|
||||
"{3}, {T} or {G}, {T}"
|
||||
"{3}, {T} or {G}, {T}", new CompositeCost(new GenericManaCost(3), new TapSourceCost(), "{3}, {T}"),
|
||||
new CompositeCost(new ManaCostsImpl<>("{G}"), new TapSourceCost(), "{G}, {T}")
|
||||
)
|
||||
);
|
||||
ability.addTarget(new TargetCreaturePermanent());
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ public final class IonStorm extends CardImpl {
|
|||
|
||||
// {1}{R}, Remove a +1/+1 counter or a charge counter from a permanent you control: Ion Storm deals 2 damage to any target.
|
||||
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(2), new ManaCostsImpl("{1}{R}"));
|
||||
ability.addCost(new OrCost(new RemoveCounterCost(new TargetControlledPermanent(), CounterType.P1P1), new RemoveCounterCost(new TargetControlledPermanent(), CounterType.CHARGE), " Remove a +1/+1 counter or a charge counter from a permanent you control"));
|
||||
ability.addCost(new OrCost(" Remove a +1/+1 counter or a charge counter from a permanent you control", new RemoveCounterCost(new TargetControlledPermanent(), CounterType.P1P1), new RemoveCounterCost(new TargetControlledPermanent(), CounterType.CHARGE)));
|
||||
ability.addTarget(new TargetAnyTarget());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,9 +31,8 @@ public final class JotunOwlKeeper extends CardImpl {
|
|||
|
||||
// Cumulative upkeep {W} or {U}
|
||||
this.addAbility(new CumulativeUpkeepAbility(new OrCost(
|
||||
new ManaCostsImpl("{W}"),
|
||||
new ManaCostsImpl("{U}"),
|
||||
"{W} or {U}"
|
||||
"{W} or {U}", new ManaCostsImpl("{W}"),
|
||||
new ManaCostsImpl("{U}")
|
||||
)));
|
||||
|
||||
// When Jötun Owl Keeper dies, put a 1/1 white Bird creature token with flying onto the battlefield for each age counter on it.
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ public final class KrovikanWhispers extends CardImpl {
|
|||
this.addAbility(ability);
|
||||
|
||||
// Cumulative upkeep-Pay {U} or {B}.
|
||||
this.addAbility(new CumulativeUpkeepAbility(new OrCost(new ManaCostsImpl("{U}"), new ManaCostsImpl("{B}"), "{U} or {B}")));
|
||||
this.addAbility(new CumulativeUpkeepAbility(new OrCost("{U} or {B}", new ManaCostsImpl("{U}"), new ManaCostsImpl("{B}"))));
|
||||
|
||||
// You control enchanted creature.
|
||||
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ControlEnchantedEffect()));
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ public final class LightningAxe extends CardImpl {
|
|||
|
||||
|
||||
// As an additional cost to cast Lightning Axe, discard a card or pay {5}.
|
||||
this.getSpellAbility().addCost(new OrCost(new DiscardCardCost(), new GenericManaCost(5),"discard a card or pay {5}"));
|
||||
this.getSpellAbility().addCost(new OrCost("discard a card or pay {5}", new DiscardCardCost(), new GenericManaCost(5)));
|
||||
// Lightning Axe deals 5 damage to target creature.
|
||||
this.getSpellAbility().addEffect(new DamageTargetEffect(5));
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ class LimDulsHexEffect extends OneShotEffect {
|
|||
for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) {
|
||||
Player player = game.getPlayer(playerId);
|
||||
if (player != null) {
|
||||
OrCost costToPay = new OrCost(new ManaCostsImpl("{B}"), new ManaCostsImpl("{3}"), "{B} or {3}");
|
||||
OrCost costToPay = new OrCost("{B} or {3}", new ManaCostsImpl("{B}"), new ManaCostsImpl("{3}"));
|
||||
costToPay.clearPaid();
|
||||
if (!(player.chooseUse(Outcome.Benefit, "Pay {B} or {3}?", source, game) && costToPay.pay(source, game, source, player.getId(), false, null))) {
|
||||
game.informPlayers(player.getLogName() + " chooses not to pay " + costToPay.getText() + " to prevent 1 damage from " + sourcePermanent.getLogName());
|
||||
|
|
|
|||
|
|
@ -29,9 +29,9 @@ public final class MorkrutBehemoth extends CardImpl {
|
|||
|
||||
// As an additional cost to cast this spell, sacrifice a creature or pay {1}{B}.
|
||||
this.getSpellAbility().addCost(new OrCost(
|
||||
new SacrificeTargetCost(new TargetControlledPermanent(
|
||||
"sacrifice a creature or pay {1}{B}", new SacrificeTargetCost(new TargetControlledPermanent(
|
||||
StaticFilters.FILTER_CONTROLLED_CREATURE_SHORT_TEXT
|
||||
)), new ManaCostsImpl<>("{1}{B}"), "sacrifice a creature or pay {1}{B}"
|
||||
)), new ManaCostsImpl<>("{1}{B}")
|
||||
));
|
||||
|
||||
// Menace
|
||||
|
|
|
|||
|
|
@ -29,9 +29,8 @@ public final class PearlShard extends CardImpl {
|
|||
Ability ability = new SimpleActivatedAbility(
|
||||
new PreventDamageToTargetEffect(Duration.EndOfTurn, 2),
|
||||
new OrCost(
|
||||
new CompositeCost(new GenericManaCost(3), new TapSourceCost(), "{3}, {T}"),
|
||||
new CompositeCost(new ManaCostsImpl<>("{W}"), new TapSourceCost(), "{W}, {T}"),
|
||||
"{3}, {T} or {W}, {T}"
|
||||
"{3}, {T} or {W}, {T}", new CompositeCost(new GenericManaCost(3), new TapSourceCost(), "{3}, {T}"),
|
||||
new CompositeCost(new ManaCostsImpl<>("{W}"), new TapSourceCost(), "{W}, {T}")
|
||||
)
|
||||
);
|
||||
ability.addTarget(new TargetAnyTarget());
|
||||
|
|
|
|||
|
|
@ -37,9 +37,9 @@ public final class SadisticSkymarcher extends CardImpl {
|
|||
|
||||
// As an additional cost to cast Sadistic Skymarcher, reveal a Vampire card from your hand or pay {1}.
|
||||
this.getSpellAbility().addCost(new OrCost(
|
||||
new RevealTargetFromHandCost(new TargetCardInHand(filter)),
|
||||
new GenericManaCost(1),
|
||||
"reveal a Vampire card from your hand or pay {1}"));
|
||||
"reveal a Vampire card from your hand or pay {1}", new RevealTargetFromHandCost(new TargetCardInHand(filter)),
|
||||
new GenericManaCost(1)
|
||||
));
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
|
|
|
|||
|
|
@ -35,9 +35,8 @@ public final class SkeletonShard extends CardImpl {
|
|||
Ability ability = new SimpleActivatedAbility(
|
||||
new ReturnFromGraveyardToHandTargetEffect(),
|
||||
new OrCost(
|
||||
new CompositeCost(new GenericManaCost(3), new TapSourceCost(), "{3}, {T}"),
|
||||
new CompositeCost(new ManaCostsImpl<>("{B}"), new TapSourceCost(), "{B}, {T}"),
|
||||
"{3}, {T} or {B}, {T}"
|
||||
"{3}, {T} or {B}, {T}", new CompositeCost(new GenericManaCost(3), new TapSourceCost(), "{3}, {T}"),
|
||||
new CompositeCost(new ManaCostsImpl<>("{B}"), new TapSourceCost(), "{B}, {T}")
|
||||
)
|
||||
);
|
||||
ability.addTarget(new TargetCardInYourGraveyard(filter));
|
||||
|
|
|
|||
|
|
@ -22,8 +22,8 @@ public final class SparkHarvest extends CardImpl {
|
|||
|
||||
// As an additional cost to cast this spell, sacrifice a creature or pay {3}{B}.
|
||||
this.getSpellAbility().addCost(new OrCost(
|
||||
new SacrificeTargetCost(new TargetControlledCreaturePermanent()),
|
||||
new ManaCostsImpl<>("{3}{B}"), "sacrifice a creature or pay {3}{B}"
|
||||
"sacrifice a creature or pay {3}{B}", new SacrificeTargetCost(new TargetControlledCreaturePermanent()),
|
||||
new ManaCostsImpl<>("{3}{B}")
|
||||
));
|
||||
|
||||
// Destroy target creature or planeswalker.
|
||||
|
|
|
|||
|
|
@ -35,9 +35,9 @@ public final class SqueakingPieSneak extends CardImpl {
|
|||
|
||||
// As an additional cost to cast Squeaking Pie Sneak, reveal a Goblin card from your hand or pay {3}.
|
||||
this.getSpellAbility().addCost(new OrCost(
|
||||
new RevealTargetFromHandCost(new TargetCardInHand(filter)),
|
||||
new GenericManaCost(3),
|
||||
"reveal a Goblin card from your hand or pay {3}"));
|
||||
"reveal a Goblin card from your hand or pay {3}", new RevealTargetFromHandCost(new TargetCardInHand(filter)),
|
||||
new GenericManaCost(3)
|
||||
));
|
||||
// Fear
|
||||
this.addAbility(FearAbility.getInstance());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,9 +38,9 @@ public final class SurtlandElementalist extends CardImpl {
|
|||
|
||||
// As an additional cost to cast this spell, reveal a Giant card from your hand or pay {2}.
|
||||
this.getSpellAbility().addCost(new OrCost(
|
||||
new RevealTargetFromHandCost(new TargetCardInHand(filter)),
|
||||
new GenericManaCost(2),
|
||||
"reveal a Giant card from your hand or pay {2}"));
|
||||
"reveal a Giant card from your hand or pay {2}", new RevealTargetFromHandCost(new TargetCardInHand(filter)),
|
||||
new GenericManaCost(2)
|
||||
));
|
||||
|
||||
// Whenever Surtland Elementalist attacks, you may cast an instant or sorcery spell from your hand without paying its mana cost.
|
||||
this.addAbility(new AttacksTriggeredAbility(new CastFromHandForFreeEffect(filter2), true));
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ public final class ThrullWizard extends CardImpl {
|
|||
this.toughness = new MageInt(1);
|
||||
|
||||
// {1}{B}: Counter target black spell unless that spell's controller pays {B} or {3}.
|
||||
Cost cost = new OrCost(new ColoredManaCost(ColoredManaSymbol.B), new GenericManaCost(3), "pay {B} or pay {3}");
|
||||
Cost cost = new OrCost("pay {B} or pay {3}", new ColoredManaCost(ColoredManaSymbol.B), new GenericManaCost(3));
|
||||
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CounterUnlessPaysEffect(cost), new ManaCostsImpl("{1}{B}"));
|
||||
ability.addTarget(new TargetSpell(filter));
|
||||
this.addAbility(ability);
|
||||
|
|
|
|||
|
|
@ -32,9 +32,9 @@ public final class ThunderherdMigration extends CardImpl {
|
|||
|
||||
// As an additional cost to cast Thunderherd Migration, reveal a Dinosaur card from your hand or pay {1}.
|
||||
this.getSpellAbility().addCost(new OrCost(
|
||||
new RevealTargetFromHandCost(new TargetCardInHand(filter)),
|
||||
new GenericManaCost(1),
|
||||
"reveal a Dinosaur card from your hand or pay {1}"));
|
||||
"reveal a Dinosaur card from your hand or pay {1}", new RevealTargetFromHandCost(new TargetCardInHand(filter)),
|
||||
new GenericManaCost(1)
|
||||
));
|
||||
|
||||
// Search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library.
|
||||
this.getSpellAbility().addEffect(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND), true, true));
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ public final class TidalControl extends CardImpl {
|
|||
this.addAbility(new CumulativeUpkeepAbility(new ManaCostsImpl("{2}")));
|
||||
|
||||
// Pay 2 life or {2}: Counter target red or green spell. Any player may activate this ability.
|
||||
SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CounterTargetEffect(), new OrCost(new PayLifeCost(2), new ManaCostsImpl("{2}"), "pay 2 life or pay {2}"));
|
||||
SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CounterTargetEffect(), new OrCost("pay 2 life or pay {2}", new PayLifeCost(2), new ManaCostsImpl("{2}")));
|
||||
ability.addTarget(new TargetSpell(filter));
|
||||
ability.setMayActivate(TargetController.ANY);
|
||||
ability.addEffect(new InfoEffect("Any player may activate this ability"));
|
||||
|
|
|
|||
|
|
@ -35,9 +35,9 @@ public final class WrensRunVanquisher extends CardImpl {
|
|||
|
||||
// As an additional cost to cast Wren's Run Vanquisher, reveal an Elf card from your hand or pay {3}.
|
||||
this.getSpellAbility().addCost(new OrCost(
|
||||
new RevealTargetFromHandCost(new TargetCardInHand(filter)),
|
||||
new GenericManaCost(3),
|
||||
"reveal an Elf card from your hand or pay {3}"));
|
||||
"reveal an Elf card from your hand or pay {3}", new RevealTargetFromHandCost(new TargetCardInHand(filter)),
|
||||
new GenericManaCost(3)
|
||||
));
|
||||
|
||||
// Deathtouch
|
||||
this.addAbility(DeathtouchAbility.getInstance());
|
||||
|
|
|
|||
|
|
@ -93,6 +93,7 @@ public final class StreetsOfNewCapenna extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Dig Up the Body", 76, Rarity.COMMON, mage.cards.d.DigUpTheBody.class));
|
||||
cards.add(new SetCardInfo("Disciplined Duelist", 182, Rarity.UNCOMMON, mage.cards.d.DisciplinedDuelist.class));
|
||||
cards.add(new SetCardInfo("Disdainful Stroke", 39, Rarity.COMMON, mage.cards.d.DisdainfulStroke.class));
|
||||
cards.add(new SetCardInfo("Dusk Mangler", 77, Rarity.UNCOMMON, mage.cards.d.DuskMangler.class));
|
||||
cards.add(new SetCardInfo("Echo Inspector", 40, Rarity.COMMON, mage.cards.e.EchoInspector.class));
|
||||
cards.add(new SetCardInfo("Elegant Entourage", 143, Rarity.UNCOMMON, mage.cards.e.ElegantEntourage.class));
|
||||
cards.add(new SetCardInfo("Elspeth Resplendent", 11, Rarity.MYTHIC, mage.cards.e.ElspethResplendent.class));
|
||||
|
|
|
|||
|
|
@ -1,32 +1,32 @@
|
|||
|
||||
package mage.abilities.costs;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.costs.mana.ManaCost;
|
||||
import mage.choices.Choice;
|
||||
import mage.choices.ChoiceImpl;
|
||||
import mage.constants.Outcome;
|
||||
import mage.game.Game;
|
||||
import mage.players.Player;
|
||||
import mage.target.Targets;
|
||||
|
||||
import java.util.UUID;
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class OrCost implements Cost {
|
||||
|
||||
private final Cost firstCost;
|
||||
private final Cost secondCost;
|
||||
private final List<Cost> costs = new ArrayList<>();
|
||||
private String description;
|
||||
// which cost was slected to pay
|
||||
private Cost selectedCost;
|
||||
|
||||
public OrCost(Cost firstCost, Cost secondCost, String description) {
|
||||
this.firstCost = firstCost;
|
||||
this.secondCost = secondCost;
|
||||
public OrCost(String description, Cost... costs) {
|
||||
Collections.addAll(this.costs, costs);
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
public OrCost(final OrCost cost) {
|
||||
this.firstCost = cost.firstCost.copy();
|
||||
this.secondCost = cost.secondCost.copy();
|
||||
cost.costs.stream().map(Cost::copy).forEach(this.costs::add);
|
||||
this.description = cost.description;
|
||||
this.selectedCost = cost.selectedCost;
|
||||
}
|
||||
|
|
@ -49,7 +49,7 @@ public class OrCost implements Cost {
|
|||
|
||||
@Override
|
||||
public boolean canPay(Ability ability, Ability source, UUID controllerId, Game game) {
|
||||
return firstCost.canPay(ability, source, controllerId, game) || secondCost.canPay(ability, source, controllerId, game);
|
||||
return costs.stream().anyMatch(cost -> cost.canPay(ability, source, controllerId, game));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -60,28 +60,47 @@ public class OrCost implements Cost {
|
|||
@Override
|
||||
public boolean pay(Ability ability, Game game, Ability source, UUID controllerId, boolean noMana, Cost costToPay) {
|
||||
selectedCost = null;
|
||||
// if only one can be paid select it
|
||||
if (!firstCost.canPay(ability, source, controllerId, game)) {
|
||||
selectedCost = secondCost;
|
||||
}
|
||||
if (!secondCost.canPay(ability, source, controllerId, game)) {
|
||||
selectedCost = firstCost;
|
||||
}
|
||||
// if both can be paid player has to select
|
||||
if (selectedCost == null) {
|
||||
List<Cost> usable = costs
|
||||
.stream()
|
||||
.filter(cost -> cost.canPay(ability, source, controllerId, game))
|
||||
.collect(Collectors.toList());
|
||||
Player controller = game.getPlayer(controllerId);
|
||||
if (controller != null) {
|
||||
if (controller == null) {
|
||||
return false;
|
||||
}
|
||||
switch (usable.size()) {
|
||||
case 0:
|
||||
return false;
|
||||
case 1:
|
||||
selectedCost = usable.get(0);
|
||||
break;
|
||||
case 2:
|
||||
StringBuilder sb = new StringBuilder();
|
||||
if (firstCost instanceof ManaCost) {
|
||||
if (usable.get(0) instanceof ManaCost) {
|
||||
sb.append("Pay ");
|
||||
}
|
||||
sb.append(firstCost.getText()).append('?');
|
||||
if (controller.chooseUse(Outcome.Detriment, sb.toString(), ability, game)) {
|
||||
selectedCost = firstCost;
|
||||
sb.append(usable.get(0).getText());
|
||||
sb.append(" or ");
|
||||
sb.append(usable.get(1));
|
||||
sb.append('?');
|
||||
if (controller.chooseUse(
|
||||
Outcome.Detriment, sb.toString(), null,
|
||||
usable.get(0).getText(), usable.get(1).getText(), ability, game
|
||||
)) {
|
||||
selectedCost = usable.get(0);
|
||||
} else {
|
||||
selectedCost = secondCost;
|
||||
}
|
||||
selectedCost = usable.get(1);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
Map<String, Cost> costMap = usable
|
||||
.stream()
|
||||
.collect(Collectors.toMap(Cost::getText, Function.identity()));
|
||||
Choice choice = new ChoiceImpl(true);
|
||||
choice.setMessage("Choose a cost to pay");
|
||||
choice.setChoices(costMap.keySet());
|
||||
controller.choose(Outcome.Neutral, choice, game);
|
||||
selectedCost = costMap.getOrDefault(choice.getChoice(), null);
|
||||
}
|
||||
if (selectedCost == null) {
|
||||
return false;
|
||||
|
|
@ -92,17 +111,13 @@ public class OrCost implements Cost {
|
|||
|
||||
@Override
|
||||
public boolean isPaid() {
|
||||
if (selectedCost != null) {
|
||||
return selectedCost.isPaid();
|
||||
}
|
||||
return false;
|
||||
return selectedCost != null ? selectedCost.isPaid() : false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearPaid() {
|
||||
selectedCost = null;
|
||||
firstCost.clearPaid();
|
||||
secondCost.clearPaid();
|
||||
costs.stream().forEach(Cost::clearPaid);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package mage.abilities.effects.common;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.Mode;
|
||||
import mage.abilities.dynamicvalue.DynamicValue;
|
||||
import mage.abilities.dynamicvalue.common.StaticValue;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
|
|
@ -40,7 +41,6 @@ public class SacrificeOpponentsEffect extends OneShotEffect {
|
|||
this.amount = amount;
|
||||
this.filter = filter.copy();
|
||||
this.filter.add(TargetController.YOU.getControllerPredicate());
|
||||
setText();
|
||||
}
|
||||
|
||||
public SacrificeOpponentsEffect(final SacrificeOpponentsEffect effect) {
|
||||
|
|
@ -79,7 +79,11 @@ public class SacrificeOpponentsEffect extends OneShotEffect {
|
|||
return true;
|
||||
}
|
||||
|
||||
private void setText() {
|
||||
@Override
|
||||
public String getText(Mode mode) {
|
||||
if (staticText != null && !staticText.isEmpty()) {
|
||||
return staticText;
|
||||
}
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("each opponent sacrifices ");
|
||||
switch (amount.toString()) {
|
||||
|
|
@ -92,6 +96,6 @@ public class SacrificeOpponentsEffect extends OneShotEffect {
|
|||
default:
|
||||
sb.append(CardUtil.numberToText(amount.toString())).append(' ').append(filter.getMessage());
|
||||
}
|
||||
staticText = sb.toString();
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue