Phyrexian mana now correctly a payment choice.

Per rule 601.2b, it is not determined at the pay costs step,
but at the "choice" step, long before costs are determined.

This fixes trinisphere interactions and should be consistent with the
rules.
This commit is contained in:
Nathaniel Brandes 2017-03-08 20:03:28 -08:00
parent 209e2d13c1
commit ce1f4a3bf8
47 changed files with 234 additions and 222 deletions

View file

@ -54,7 +54,7 @@ public class ActOfAggression extends CardImpl {
}
public ActOfAggression(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{3}{RP}{RP}");
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{3}{R/P}{R/P}");
this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter));
this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.EndOfTurn));

View file

@ -63,9 +63,9 @@ public class ApostlesBlessing extends CardImpl {
}
public ApostlesBlessing(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{WP}");
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{W/P}");
// ({WP} can be paid with either {W} or 2 life.)
// ({W/P} can be paid with either {W} or 2 life.)
// Target artifact or creature you control gains protection from artifacts or from the color of your choice until end of turn.
this.getSpellAbility().addEffect(new ApostlesBlessingEffect());
this.getSpellAbility().addTarget(new TargetControlledPermanent(filter));

View file

@ -57,11 +57,11 @@ import mage.target.common.TargetControlledCreaturePermanent;
public class BirthingPod extends CardImpl {
public BirthingPod(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}{GP}");
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}{G/P}");
// {1}{GP}, {tap}, Sacrifice a creature: Search your library for a creature card with converted mana cost equal to 1 plus the sacrificed creature's converted mana cost,
// {1}{G/P}, {tap}, Sacrifice a creature: Search your library for a creature card with converted mana cost equal to 1 plus the sacrificed creature's converted mana cost,
// put that card onto the battlefield, then shuffle your library. Activate this ability only any time you could cast a sorcery.
Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new BirthingPodEffect(), new ManaCostsImpl("{1}{GP}"));
Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new BirthingPodEffect(), new ManaCostsImpl("{1}{G/P}"));
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent()));
this.addAbility(ability);

View file

@ -53,7 +53,7 @@ public class BlindingSouleater extends CardImpl {
this.power = new MageInt(1);
this.toughness = new MageInt(3);
// {WP},{T}: Tap target creature. ( can be paid with either or 2 life.)
// {W/P},{T}: Tap target creature. ( can be paid with either or 2 life.)
SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
new TapTargetEffect(),
new PhyrexianManaCost(ColoredManaSymbol.W));

View file

@ -51,13 +51,13 @@ import java.util.UUID;
public class CathedralMembrane extends CardImpl {
public CathedralMembrane(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{1}{WP}");
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{1}{W/P}");
this.subtype.add("Wall");
this.power = new MageInt(0);
this.toughness = new MageInt(3);
// <i>({WP} can be paid with either {W} or 2 life.)</i>
// <i>({W/P} can be paid with either {W} or 2 life.)</i>
this.addAbility(DefenderAbility.getInstance());
// When Cathedral Membrane dies during combat, it deals 6 damage to each creature it blocked this combat.

View file

@ -50,7 +50,7 @@ public class CorrosiveGale extends CardImpl {
}
public CorrosiveGale(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{GP}");
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{G/P}");
this.getSpellAbility().addEffect(new DamageAllEffect(new ManacostVariableValue(), filter));

View file

@ -44,7 +44,7 @@ import mage.target.common.TargetCreaturePermanent;
public class Dismember extends CardImpl {
public Dismember (UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{BP}{BP}");
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{B/P}{B/P}");
// Target creature gets -5/-5 until end of turn.

View file

@ -42,7 +42,7 @@ import mage.target.TargetPlayer;
public class GitaxianProbe extends CardImpl {
public GitaxianProbe(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{UP}");
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{U/P}");
// Look at target player's hand.
this.getSpellAbility().addEffect(new LookAtTargetPlayerHandEffect());

View file

@ -41,7 +41,7 @@ import mage.target.common.TargetCreatureOrPlayer;
public class GutShot extends CardImpl {
public GutShot(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{RP}");
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{R/P}");
this.getSpellAbility().addEffect(new DamageTargetEffect(1));
this.getSpellAbility().addTarget(new TargetCreatureOrPlayer());

View file

@ -58,8 +58,8 @@ public class HexParasite extends CardImpl {
this.power = new MageInt(1);
this.toughness = new MageInt(1);
// {X}{BP}: Remove up to X counters from target permanent. For each counter removed this way, Hex Parasite gets +1/+0 until end of turn.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new HexParasiteEffect(), new ManaCostsImpl("{X}{BP}"));
// {X}{B/P}: Remove up to X counters from target permanent. For each counter removed this way, Hex Parasite gets +1/+0 until end of turn.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new HexParasiteEffect(), new ManaCostsImpl("{X}{B/P}"));
ability.addTarget(new TargetPermanent());
this.addAbility(ability);
}

View file

@ -64,7 +64,7 @@ public class Lashwrithe extends CardImpl {
this.addAbility(new LivingWeaponAbility());
PermanentsOnBattlefieldCount value = new PermanentsOnBattlefieldCount(filter);
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(value, value)));
this.addAbility(new EquipAbility(Outcome.BoostCreature, new ManaCostsImpl("{BP}{BP}")));
this.addAbility(new EquipAbility(Outcome.BoostCreature, new ManaCostsImpl("{B/P}{B/P}")));
}
public Lashwrithe(final Lashwrithe card) {

View file

@ -41,7 +41,7 @@ import mage.filter.common.FilterAttackingCreature;
public class MarrowShards extends CardImpl {
public MarrowShards(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{WP}");
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{W/P}");
this.getSpellAbility().addEffect(new DamageAllEffect(1, new FilterAttackingCreature()));

View file

@ -50,7 +50,7 @@ public class MentalMisstep extends CardImpl {
}
public MentalMisstep(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{UP}");
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{U/P}");
// Counter target spell with converted mana cost 1.
this.getSpellAbility().addEffect(new CounterTargetEffect());

View file

@ -47,7 +47,7 @@ import mage.constants.Zone;
public class MoltensteelDragon extends CardImpl {
public MoltensteelDragon(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{4}{RP}{RP}");
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{4}{R/P}{R/P}");
this.subtype.add("Dragon");
this.power = new MageInt(4);

View file

@ -43,7 +43,7 @@ import mage.target.common.TargetCreaturePermanent;
public class MutagenicGrowth extends CardImpl {
public MutagenicGrowth (UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{GP}");
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{G/P}");
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
this.getSpellAbility().addEffect(new BoostTargetEffect(2, 2, Duration.EndOfTurn));

View file

@ -42,11 +42,11 @@ import mage.constants.Zone;
public class NornsAnnex extends CardImpl {
public NornsAnnex(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}{WP}{WP}");
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}{W/P}{W/P}");
// {WP} ({WP} can be paid with either or 2 life.)
// Creatures can't attack you or a planeswalker you control unless their controller pays {WP} for each of those creatures.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackYouUnlessPayManaAllEffect(new ManaCostsImpl<>("{WP}"), true)));
// {W/P} ({W/P} can be paid with either or 2 life.)
// Creatures can't attack you or a planeswalker you control unless their controller pays {W/P} for each of those creatures.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackYouUnlessPayManaAllEffect(new ManaCostsImpl<>("{W/P}"), true)));
}
public NornsAnnex(final NornsAnnex card) {

View file

@ -42,7 +42,7 @@ import mage.target.common.TargetCardInGraveyard;
public class NoxiousRevival extends CardImpl {
public NoxiousRevival (UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{GP}");
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{G/P}");
this.getSpellAbility().addEffect(new PutOnLibraryTargetEffect(true));
this.getSpellAbility().addTarget(new TargetCardInGraveyard());

View file

@ -61,7 +61,7 @@ public class PhyrexianMetamorph extends CardImpl {
}
public PhyrexianMetamorph(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}{UP}");
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}{U/P}");
this.subtype.add("Shapeshifter");
this.power = new MageInt(0);
@ -83,7 +83,7 @@ public class PhyrexianMetamorph extends CardImpl {
};
// {UP} ( can be paid with either {U} or 2 life.)
// {U/P} ( can be paid with either {U} or 2 life.)
// You may have Phyrexian Metamorph enter the battlefield as a copy of any artifact or creature on the battlefield, except it's an artifact in addition to its other types.
Effect effect = new CopyPermanentEffect(filter, phyrexianMetamorphApplier);
effect.setText("You may have {this} enter the battlefield as a copy of any artifact or creature on the battlefield, except it's an artifact in addition to its other types");

View file

@ -44,7 +44,7 @@ import mage.target.common.TargetCreaturePermanent;
public class PithDriller extends CardImpl {
public PithDriller(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{4}{BP}");
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{4}{B/P}");
this.subtype.add("Horror");
this.power = new MageInt(2);

View file

@ -41,7 +41,7 @@ import mage.cards.CardSetInfo;
public class PorcelainLegionnaire extends CardImpl {
public PorcelainLegionnaire(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{2}{WP}");
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{2}{W/P}");
this.subtype.add("Soldier");
this.power = new MageInt(3);

View file

@ -60,7 +60,7 @@ import mage.target.targetpointer.FixedTarget;
public class PostmortemLunge extends CardImpl {
public PostmortemLunge(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{BP}");
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{B/P}");
// Return target creature card with converted mana cost X from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step.
this.getSpellAbility().addEffect(new PostmortemLungeEffect());

View file

@ -49,7 +49,7 @@ import mage.target.common.TargetCreatureOrPlayer;
public class RageExtractor extends CardImpl {
public RageExtractor(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}{RP}");
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}{R/P}");
this.addAbility(new RageExtractorTriggeredAbility());

View file

@ -46,7 +46,7 @@ import mage.game.permanent.Permanent;
public class RuthlessInvasion extends CardImpl {
public RuthlessInvasion (UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{RP}");
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{R/P}");
this.getSpellAbility().addEffect(new RuthlessInvasionEffect());
}

View file

@ -41,7 +41,7 @@ import mage.cards.CardSetInfo;
public class SlashPanther extends CardImpl {
public SlashPanther(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{4}{RP}");
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{4}{R/P}");
this.subtype.add("Cat");
this.power = new MageInt(4);

View file

@ -61,8 +61,8 @@ public class Spellskite extends CardImpl {
this.power = new MageInt(0);
this.toughness = new MageInt(4);
// {UP}: Change a target of target spell or ability to Spellskite.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new SpellskiteEffect(), new ManaCostsImpl("{UP}"));
// {U/P}: Change a target of target spell or ability to Spellskite.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new SpellskiteEffect(), new ManaCostsImpl("{U/P}"));
ability.addTarget(new TargetStackObject());
this.addAbility(ability);
}

View file

@ -41,7 +41,7 @@ import mage.cards.CardSetInfo;
public class SpinedThopter extends CardImpl {
public SpinedThopter(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{2}{UP}");
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{2}{U/P}");
this.subtype.add("Thopter");
this.power = new MageInt(2);

View file

@ -63,7 +63,7 @@ public class SurgicalExtraction extends CardImpl {
}
public SurgicalExtraction(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{BP}");
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{B/P}");
// Choose target card in a graveyard other than a basic land card. Search its owner's graveyard,
// hand, and library for any number of cards with the same name as that card and exile them.

View file

@ -41,7 +41,7 @@ import mage.cards.CardSetInfo;
public class TezzeretsGambit extends CardImpl {
public TezzeretsGambit(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{UP}");
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{U/P}");
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(2));
this.getSpellAbility().addEffect(new ProliferateEffect());

View file

@ -41,7 +41,7 @@ import mage.cards.CardSetInfo;
public class ThunderingTanadon extends CardImpl {
public ThunderingTanadon(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{4}{GP}{GP}");
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{4}{G/P}{G/P}");
this.subtype.add("Beast");
this.power = new MageInt(5);

View file

@ -52,7 +52,7 @@ public class TrespassingSouleater extends CardImpl {
this.power = new MageInt(2);
this.toughness = new MageInt(2);
// {UP}: Trespassing Souleater can't be blocked this turn.
// {U/P}: Trespassing Souleater can't be blocked this turn.
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD,
new CantBeBlockedSourceEffect(Duration.EndOfTurn),
new PhyrexianManaCost(ColoredManaSymbol.U)));

View file

@ -42,7 +42,7 @@ import mage.cards.CardSetInfo;
public class VaultSkirge extends CardImpl {
public VaultSkirge(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{1}{BP}");
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{1}{B/P}");
this.subtype.add("Imp");
this.power = new MageInt(1);