fext tixes

This commit is contained in:
Evan Kranzler 2017-10-07 18:37:09 -04:00
parent 77f15413e6
commit f16b5881e8
61 changed files with 223 additions and 224 deletions

View file

@ -53,7 +53,7 @@ import mage.target.common.TargetControlledCreaturePermanent;
/** /**
* *
* @author jeffwadsworth * @author jeffwadsworth
*
*/ */
public class AltarGolem extends CardImpl { public class AltarGolem extends CardImpl {
@ -74,7 +74,7 @@ public class AltarGolem extends CardImpl {
this.addAbility(TrampleAbility.getInstance()); this.addAbility(TrampleAbility.getInstance());
// Altar Golem's power and toughness are each equal to the number of creatures on the battlefield. // Altar Golem's power and toughness are each equal to the number of creatures on the battlefield.
DynamicValue amount = new PermanentsOnBattlefieldCount(new FilterCreaturePermanent("creatures in play")); DynamicValue amount = new PermanentsOnBattlefieldCount(new FilterCreaturePermanent("creatures on the battlefield"));
this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(amount, Duration.EndOfGame))); this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(amount, Duration.EndOfGame)));
// Altar Golem doesn't untap during your untap step. // Altar Golem doesn't untap during your untap step.

View file

@ -79,10 +79,9 @@ public class BattlefieldThaumaturge extends CardImpl {
class BattlefieldThaumaturgeSpellsCostReductionEffect extends CostModificationEffectImpl { class BattlefieldThaumaturgeSpellsCostReductionEffect extends CostModificationEffectImpl {
public BattlefieldThaumaturgeSpellsCostReductionEffect() { public BattlefieldThaumaturgeSpellsCostReductionEffect() {
super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.REDUCE_COST); super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.REDUCE_COST);
this.staticText = "Each instant and sorcery spell you cast costs 1 less to cast for each creature it targets"; this.staticText = "Each instant and sorcery spell you cast costs {1} less to cast for each creature it targets";
} }
protected BattlefieldThaumaturgeSpellsCostReductionEffect(BattlefieldThaumaturgeSpellsCostReductionEffect effect) { protected BattlefieldThaumaturgeSpellsCostReductionEffect(BattlefieldThaumaturgeSpellsCostReductionEffect effect) {

View file

@ -88,7 +88,7 @@ public class BloodcrazedHoplite extends CardImpl {
class BloodcrazedHopliteTriggeredAbility extends TriggeredAbilityImpl { class BloodcrazedHopliteTriggeredAbility extends TriggeredAbilityImpl {
public BloodcrazedHopliteTriggeredAbility() { public BloodcrazedHopliteTriggeredAbility() {
super(Zone.ALL, new RemoveCounterTargetEffect(CounterType.P1P1.createInstance()), true); super(Zone.ALL, new RemoveCounterTargetEffect(CounterType.P1P1.createInstance()), false);
} }
public BloodcrazedHopliteTriggeredAbility(BloodcrazedHopliteTriggeredAbility ability) { public BloodcrazedHopliteTriggeredAbility(BloodcrazedHopliteTriggeredAbility ability) {

View file

@ -64,7 +64,10 @@ public class CavalryMaster extends CardImpl {
// Flanking // Flanking
this.addAbility(new FlankingAbility()); this.addAbility(new FlankingAbility());
// Other creatures you control with flanking have flanking. // Other creatures you control with flanking have flanking.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(new FlankingAbility(), Duration.WhileOnBattlefield, filter, true))); this.addAbility(new SimpleStaticAbility(
Zone.BATTLEFIELD, new GainAbilityAllEffect(new FlankingAbility(), Duration.WhileOnBattlefield, filter, true)
.setText("Other creatures you control with flanking have flanking.")
));
} }
public CavalryMaster(final CavalryMaster card) { public CavalryMaster(final CavalryMaster card) {

View file

@ -58,7 +58,7 @@ public class ChariotOfVictory extends CardImpl {
// Equipped creature has first strike, trample, and haste. // Equipped creature has first strike, trample, and haste.
Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(FirstStrikeAbility.getInstance(), AttachmentType.EQUIPMENT)); Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(FirstStrikeAbility.getInstance(), AttachmentType.EQUIPMENT));
Effect effect = new GainAbilityAttachedEffect(TrampleAbility.getInstance(), AttachmentType.EQUIPMENT); Effect effect = new GainAbilityAttachedEffect(TrampleAbility.getInstance(), AttachmentType.EQUIPMENT);
effect.setText(", trample"); effect.setText(", trample,");
ability.addEffect(effect); ability.addEffect(effect);
effect = new GainAbilityAttachedEffect(HasteAbility.getInstance(), AttachmentType.EQUIPMENT); effect = new GainAbilityAttachedEffect(HasteAbility.getInstance(), AttachmentType.EQUIPMENT);
effect.setText("and haste"); effect.setText("and haste");

View file

@ -47,12 +47,11 @@ public class ColossalHeroics extends CardImpl {
public ColossalHeroics(UUID ownerId, CardSetInfo setInfo) { public ColossalHeroics(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{G}"); super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{G}");
// Strive - Colossal Heroics costs {1}{G} more to cast for each target beyond the first. // Strive - Colossal Heroics costs {1}{G} more to cast for each target beyond the first.
this.addAbility(new StriveAbility("{1}{G}")); this.addAbility(new StriveAbility("{1}{G}"));
// Any number of target creatures each get +2/+2 until end of turn. Untap those creatures. // Any number of target creatures each get +2/+2 until end of turn. Untap those creatures.
Effect effect = new BoostTargetEffect(2, 2, Duration.EndOfTurn); Effect effect = new BoostTargetEffect(2, 2, Duration.EndOfTurn);
effect.setText("Any number of target creatures each get +2/+2"); effect.setText("Any number of target creatures each get +2/+2 until end of turn.");
this.getSpellAbility().addEffect(effect); this.getSpellAbility().addEffect(effect);
effect = new UntapTargetEffect(); effect = new UntapTargetEffect();
effect.setText("Untap those creatures"); effect.setText("Untap those creatures");

View file

@ -64,7 +64,6 @@ public class DakraMystic extends CardImpl {
ability.addCost(new TapSourceCost()); ability.addCost(new TapSourceCost());
this.addAbility(ability); this.addAbility(ability);
} }
public DakraMystic(final DakraMystic card) { public DakraMystic(final DakraMystic card) {
@ -81,7 +80,7 @@ class DakraMysticEffect extends OneShotEffect {
public DakraMysticEffect() { public DakraMysticEffect() {
super(Outcome.Detriment); super(Outcome.Detriment);
this.staticText = "Each player reveals the top card of his or her library. You may put the revealed cards into their owners graveyard. If you don't, each player draws a card"; this.staticText = "Each player reveals the top card of his or her library. You may put the revealed cards into their owners' graveyard. If you don't, each player draws a card";
} }
public DakraMysticEffect(final DakraMysticEffect effect) { public DakraMysticEffect(final DakraMysticEffect effect) {

View file

@ -70,7 +70,12 @@ public class DementiaSliver extends CardImpl {
gainedAbility.addTarget(new TargetOpponent()); gainedAbility.addTarget(new TargetOpponent());
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD,
new GainAbilityAllEffect(gainedAbility, Duration.WhileOnBattlefield, filter, new GainAbilityAllEffect(gainedAbility, Duration.WhileOnBattlefield, filter,
"All Slivers have \"{T}: Name a card. Target opponent reveals a card at random from his or her hand. If it's the named card, that player discards it\""))); "All Slivers have \"{T}: Choose a card name. "
+ "Target opponent reveals a card at random from his or her hand."
+ " If that card has the chosen name, that player discards it."
+ " Activate this ability only during your turn.\""
)
));
} }
public DementiaSliver(final DementiaSliver card) { public DementiaSliver(final DementiaSliver card) {

View file

@ -45,7 +45,7 @@ import mage.filter.predicate.permanent.ControllerPredicate;
*/ */
public class DictateOfErebos extends CardImpl { public class DictateOfErebos extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature you control"); private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a creature you control");
static { static {
filter.add(new ControllerPredicate(TargetController.YOU)); filter.add(new ControllerPredicate(TargetController.YOU));
@ -57,7 +57,7 @@ public class DictateOfErebos extends CardImpl {
// Flash // Flash
this.addAbility(FlashAbility.getInstance()); this.addAbility(FlashAbility.getInstance());
// Whenever a creature you control dies, each opponent sacrifices a creature. // Whenever a creature you control dies, each opponent sacrifices a creature.
this.addAbility(new DiesCreatureTriggeredAbility(new SacrificeOpponentsEffect(new FilterControlledCreaturePermanent("a creature")), false, filter)); this.addAbility(new DiesCreatureTriggeredAbility(new SacrificeOpponentsEffect(new FilterControlledCreaturePermanent("creature")), false, filter));
} }
public DictateOfErebos(final DictateOfErebos card) { public DictateOfErebos(final DictateOfErebos card) {

View file

@ -53,7 +53,7 @@ public class Evangelize extends CardImpl {
// Gain control of target creature of an opponent's choice that he or she controls. // Gain control of target creature of an opponent's choice that he or she controls.
GainControlTargetEffect effect = new GainControlTargetEffect(Duration.EndOfGame); GainControlTargetEffect effect = new GainControlTargetEffect(Duration.EndOfGame);
effect.setText("Gain control of target creature of an opponent's choice that he or she controls"); effect.setText("Gain control of target creature of an opponent's choice he or she controls");
this.getSpellAbility().addEffect(effect); this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addTarget(new TargetOpponentsChoicePermanent(1, 1, filter, false, true)); this.getSpellAbility().addTarget(new TargetOpponentsChoicePermanent(1, 1, filter, false, true));
} }

View file

@ -53,7 +53,7 @@ import mage.target.common.TargetCreaturePermanent;
*/ */
public class FirewakeSliver extends CardImpl { public class FirewakeSliver extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("All sliver creatures"); private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("All Sliver creatures");
private static final FilterCreaturePermanent targetSliverFilter = new FilterCreaturePermanent("Sliver"); private static final FilterCreaturePermanent targetSliverFilter = new FilterCreaturePermanent("Sliver");
static { static {

View file

@ -60,7 +60,7 @@ public class FlagstonesOfTrokair extends CardImpl {
this.addAbility(new WhiteManaAbility()); this.addAbility(new WhiteManaAbility());
// When Flagstones of Trokair is put into a graveyard from the battlefield, you may search your library for a Plains card and put it onto the battlefield tapped. If you do, shuffle your library. // When Flagstones of Trokair is put into a graveyard from the battlefield, you may search your library for a Plains card and put it onto the battlefield tapped. If you do, shuffle your library.
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(FILTER), true, true), true)); this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(FILTER), true, false), true));
} }
public FlagstonesOfTrokair(final FlagstonesOfTrokair card) { public FlagstonesOfTrokair(final FlagstonesOfTrokair card) {

View file

@ -31,7 +31,7 @@ import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.DiscardTargetCost; import mage.abilities.costs.common.DiscardCardCost;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.Effect; import mage.abilities.effects.Effect;
@ -43,7 +43,6 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.target.common.TargetCardInHand;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
/** /**
@ -69,7 +68,7 @@ public class FlowstoneChanneler extends CardImpl {
ability.addEffect(effect); ability.addEffect(effect);
ability.addTarget(new TargetCreaturePermanent()); ability.addTarget(new TargetCreaturePermanent());
ability.addCost(new TapSourceCost()); ability.addCost(new TapSourceCost());
ability.addCost(new DiscardTargetCost(new TargetCardInHand())); ability.addCost(new DiscardCardCost());
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -48,7 +48,7 @@ import mage.target.common.TargetCreaturePermanent;
/** /**
* *
* @author LoneFox * @author LoneFox
*
*/ */
public class GoblinSkycutter extends CardImpl { public class GoblinSkycutter extends CardImpl {
@ -67,7 +67,7 @@ public class GoblinSkycutter extends CardImpl {
// Sacrifice Goblin Skycutter: Goblin Skycutter deals 2 damage to target creature with flying. That creature loses flying until end of turn. // Sacrifice Goblin Skycutter: Goblin Skycutter deals 2 damage to target creature with flying. That creature loses flying until end of turn.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(2), new SacrificeSourceCost()); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(2), new SacrificeSourceCost());
ability.addEffect(new LoseAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn)); ability.addEffect(new LoseAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn).setText("that creature loses flying until end of turn"));
ability.addTarget(new TargetCreaturePermanent(filter)); ability.addTarget(new TargetCreaturePermanent(filter));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -195,7 +195,7 @@ class GodsendRuleModifyingEffect extends ContinuousRuleModifyingEffectImpl {
public GodsendRuleModifyingEffect() { public GodsendRuleModifyingEffect() {
super(Duration.WhileOnBattlefield, Outcome.Detriment); super(Duration.WhileOnBattlefield, Outcome.Detriment);
staticText = "Opponents can't cast cards with the same name as cards exiled with {this}"; staticText = "Your opponents can't cast cards with the same name as cards exiled with {this}";
} }
public GodsendRuleModifyingEffect(final GodsendRuleModifyingEffect effect) { public GodsendRuleModifyingEffect(final GodsendRuleModifyingEffect effect) {

View file

@ -59,7 +59,7 @@ public class Greenseeker extends CardImpl {
// {G}, {tap}, Discard a card: Search your library for a basic land card, reveal it, and put it into your hand. Then shuffle your library. // {G}, {tap}, Discard a card: Search your library for a basic land card, reveal it, and put it into your hand. Then shuffle your library.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
new SearchLibraryPutInHandEffect(new TargetCardInLibrary(0, 1, StaticFilters.FILTER_BASIC_LAND_CARD), true, true), new SearchLibraryPutInHandEffect(new TargetCardInLibrary(1, 1, StaticFilters.FILTER_BASIC_LAND_CARD), true, true),
new ManaCostsImpl("{G}")); new ManaCostsImpl("{G}"));
ability.addCost(new TapSourceCost()); ability.addCost(new TapSourceCost());
ability.addCost(new DiscardCardCost()); ability.addCost(new DiscardCardCost());

View file

@ -80,7 +80,7 @@ class HubrisReturnEffect extends OneShotEffect {
public HubrisReturnEffect() { public HubrisReturnEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
this.staticText = "Return target creature and all Auras attached to it to their owners' hand"; this.staticText = "Return target creature and all Auras attached to it to their owners' hands";
} }
public HubrisReturnEffect(final HubrisReturnEffect effect) { public HubrisReturnEffect(final HubrisReturnEffect effect) {

View file

@ -55,7 +55,7 @@ public class LaunchTheFleet extends CardImpl {
// Until end of turn, any number of target creatures each gain "Whenever this creature attacks, create a 1/1 white Soldier token tapped and attacking." // Until end of turn, any number of target creatures each gain "Whenever this creature attacks, create a 1/1 white Soldier token tapped and attacking."
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, Integer.MAX_VALUE)); this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, Integer.MAX_VALUE));
Effect effect = new GainAbilityTargetEffect(new AttacksTriggeredAbility(new CreateTokenEffect(new SoldierToken(), 1, true, true), false), Duration.EndOfTurn); Effect effect = new GainAbilityTargetEffect(new AttacksTriggeredAbility(new CreateTokenEffect(new SoldierToken(), 1, true, true), false), Duration.EndOfTurn);
effect.setText("Until end of turn, any number of target creatures each gain \"Whenever this creature attacks, create a 1/1 white Soldier token tapped and attacking.\""); effect.setText("Until end of turn, any number of target creatures each gain \"Whenever this creature attacks, create a 1/1 white Soldier creature token that's tapped and attacking.\"");
this.getSpellAbility().addEffect(effect); this.getSpellAbility().addEffect(effect);
} }

View file

@ -58,7 +58,7 @@ import mage.target.targetpointer.FixedTarget;
*/ */
public class LimDulTheNecromancer extends CardImpl { public class LimDulTheNecromancer extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature an opponent controls"); private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a creature an opponent controls");
private static final FilterPermanent filter2 = new FilterPermanent("Zombie"); private static final FilterPermanent filter2 = new FilterPermanent("Zombie");
static { static {

View file

@ -85,7 +85,7 @@ class MagusOfTheScrollEffect extends OneShotEffect {
public MagusOfTheScrollEffect() { public MagusOfTheScrollEffect() {
super(Outcome.Neutral); super(Outcome.Neutral);
staticText = "Reveal a card at random from your hand. If it's the named card, {this} deals 2 damage to target creature or player"; staticText = ", then reveal a card at random from your hand. If it's the named card, {this} deals 2 damage to target creature or player";
} }
public MagusOfTheScrollEffect(final MagusOfTheScrollEffect effect) { public MagusOfTheScrollEffect(final MagusOfTheScrollEffect effect) {

View file

@ -59,7 +59,7 @@ public class MangaraOfCorondor extends CardImpl {
// {T}: Exile Mangara of Corondor and target permanent. // {T}: Exile Mangara of Corondor and target permanent.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileSourceEffect(), new TapSourceCost()); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileSourceEffect(), new TapSourceCost());
ability.addEffect(new ExileTargetEffect()); ability.addEffect(new ExileTargetEffect().setText("and target permanent"));
ability.addTarget(new TargetPermanent()); ability.addTarget(new TargetPermanent());
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -55,7 +55,7 @@ public class MirrorUniverse extends CardImpl {
Zone.BATTLEFIELD, Zone.BATTLEFIELD,
new ExchangeLifeTargetEffect(), new ExchangeLifeTargetEffect(),
new TapSourceCost(), new TapSourceCost(),
new IsStepCondition(PhaseStep.UPKEEP), new IsStepCondition(PhaseStep.UPKEEP, true),
null); null);
ability.addCost(new SacrificeSourceCost()); ability.addCost(new SacrificeSourceCost());
ability.addTarget(new TargetOpponent()); ability.addTarget(new TargetOpponent());

View file

@ -66,7 +66,7 @@ public class MogissWarhound extends CardImpl {
effect.setText("Enchanted creature gets +2/+2"); effect.setText("Enchanted creature gets +2/+2");
Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect);
effect = new AttacksIfAbleAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.AURA); effect = new AttacksIfAbleAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.AURA);
effect.setText("and attacks each turn if able"); effect.setText("and attacks each combat if able");
ability.addEffect(effect); ability.addEffect(effect);
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -52,7 +52,7 @@ public class Molder extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{G}"); super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{G}");
// Destroy target artifact or enchantment with converted mana cost X. It can't be regenerated. You gain X life. // Destroy target artifact or enchantment with converted mana cost X. It can't be regenerated. You gain X life.
this.getSpellAbility().addEffect(new DestroyTargetEffect()); this.getSpellAbility().addEffect(new DestroyTargetEffect(true));
this.getSpellAbility().addTarget(new TargetPermanent(new FilterArtifactOrEnchantmentPermanent("artifact or enchantment with converted mana cost X"))); this.getSpellAbility().addTarget(new TargetPermanent(new FilterArtifactOrEnchantmentPermanent("artifact or enchantment with converted mana cost X")));
this.getSpellAbility().addEffect(new GainLifeEffect(new ManacostVariableValue())); this.getSpellAbility().addEffect(new GainLifeEffect(new ManacostVariableValue()));
} }

View file

@ -46,14 +46,17 @@ import mage.target.common.TargetCardInLibrary;
*/ */
public class MwonvuliAcidMoss extends CardImpl { public class MwonvuliAcidMoss extends CardImpl {
private static final FilterLandCard filterForest = new FilterLandCard("Forest card");
static {
filterForest.add(new SubtypePredicate(SubType.FOREST));
}
public MwonvuliAcidMoss(UUID ownerId, CardSetInfo setInfo) { public MwonvuliAcidMoss(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{G}{G}"); super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{G}{G}");
FilterLandCard filterForest = new FilterLandCard();
filterForest.add(new SubtypePredicate(SubType.FOREST));
// Destroy target land. Search your library for a Forest card and put that card onto the battlefield tapped. Then shuffle your library. // Destroy target land. Search your library for a Forest card and put that card onto the battlefield tapped. Then shuffle your library.
this.getSpellAbility().addEffect(new DestroyTargetEffect(true)); this.getSpellAbility().addEffect(new DestroyTargetEffect());
this.getSpellAbility().addTarget(new TargetPermanent(new FilterLandPermanent())); this.getSpellAbility().addTarget(new TargetPermanent(new FilterLandPermanent()));
this.getSpellAbility().addEffect(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filterForest), true, true)); this.getSpellAbility().addEffect(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filterForest), true, true));
} }
@ -67,4 +70,3 @@ public class MwonvuliAcidMoss extends CardImpl {
return new MwonvuliAcidMoss(this); return new MwonvuliAcidMoss(this);
} }
} }

View file

@ -87,7 +87,7 @@ class NessianGameWardenEffect extends OneShotEffect {
public NessianGameWardenEffect() { public NessianGameWardenEffect() {
super(Outcome.DrawCard); super(Outcome.DrawCard);
this.staticText = "look at the top X cards of your library, where X is the number of forests you control. You may reveal a creature card from among them and put it into your hand. Put the rest on the bottom of your library in any order"; this.staticText = "look at the top X cards of your library, where X is the number of Forests you control. You may reveal a creature card from among them and put it into your hand. Put the rest on the bottom of your library in any order";
} }
public NessianGameWardenEffect(final NessianGameWardenEffect effect) { public NessianGameWardenEffect(final NessianGameWardenEffect effect) {

View file

@ -52,6 +52,7 @@ import mage.filter.predicate.permanent.ControllerPredicate;
public class PendelhavenElder extends CardImpl { public class PendelhavenElder extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("each 1/1 creature you control"); private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("each 1/1 creature you control");
static { static {
filter.add(new PowerPredicate(ComparisonType.EQUAL_TO, 1)); filter.add(new PowerPredicate(ComparisonType.EQUAL_TO, 1));
filter.add(new ToughnessPredicate(ComparisonType.EQUAL_TO, 1)); filter.add(new ToughnessPredicate(ComparisonType.EQUAL_TO, 1));
@ -66,7 +67,10 @@ public class PendelhavenElder extends CardImpl {
this.toughness = new MageInt(1); this.toughness = new MageInt(1);
// {tap}: Each 1/1 creature you control gets +1/+2 until end of turn. // {tap}: Each 1/1 creature you control gets +1/+2 until end of turn.
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostAllEffect(1, 2, Duration.EndOfTurn, filter, false), new TapSourceCost())); this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostAllEffect(1, 2, Duration.EndOfTurn, filter, false)
.setText("Each 1/1 creature you control gets +1/+2 until end of turn."),
new TapSourceCost()
));
} }
public PendelhavenElder(final PendelhavenElder card) { public PendelhavenElder(final PendelhavenElder card) {

View file

@ -91,7 +91,7 @@ class PharikaExileEffect extends OneShotEffect {
public PharikaExileEffect() { public PharikaExileEffect() {
super(Outcome.PutCreatureInPlay); super(Outcome.PutCreatureInPlay);
staticText = "Exile target creature card from a graveyard. It's owner creates a 1/1 black and green Snake enchantment creature token with deathtouch"; staticText = "Exile target creature card from a graveyard. Its owner creates a 1/1 black and green Snake enchantment creature token with deathtouch";
} }
public PharikaExileEffect(final PharikaExileEffect effect) { public PharikaExileEffect(final PharikaExileEffect effect) {

View file

@ -29,19 +29,20 @@ package mage.cards.p;
import java.util.UUID; import java.util.UUID;
import mage.Mana; import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.dynamicvalue.common.DomainValue; import mage.abilities.dynamicvalue.common.DomainValue;
import mage.abilities.mana.DynamicManaAbility; import mage.abilities.mana.DynamicManaAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AbilityWord;
import mage.constants.CardType; import mage.constants.CardType;
/** /**
* *
* @author fireshoes * @author fireshoes
*/ */
public class PrismaticGeoscope extends CardImpl { public class PrismaticGeoscope extends CardImpl {
public PrismaticGeoscope(UUID ownerId, CardSetInfo setInfo) { public PrismaticGeoscope(UUID ownerId, CardSetInfo setInfo) {
@ -51,8 +52,13 @@ public class PrismaticGeoscope extends CardImpl {
this.addAbility(new EntersBattlefieldTappedAbility()); this.addAbility(new EntersBattlefieldTappedAbility());
// <i>Domain</i> &mdash; {T}: Add X mana in any combination of colors to your mana pool, where X is the number of basic land types among lands you control. // <i>Domain</i> &mdash; {T}: Add X mana in any combination of colors to your mana pool, where X is the number of basic land types among lands you control.
this.addAbility(new DynamicManaAbility(new Mana(0,0,0,0,0,0,1, 0), new DomainValue(), new TapSourceCost(), Ability ability = new DynamicManaAbility(
"Add X mana in any combination of colors to your mana pool, where X is the number of basic land types among lands you control.")); new Mana(0, 0, 0, 0, 0, 0, 1, 0), new DomainValue(), new TapSourceCost(),
"Add X mana in any combination of colors to your mana pool,"
+ " where X is the number of basic land types among lands you control."
);
ability.setAbilityWord(AbilityWord.DOMAIN);
this.addAbility(ability);
} }
public PrismaticGeoscope(final PrismaticGeoscope card) { public PrismaticGeoscope(final PrismaticGeoscope card) {

View file

@ -87,7 +87,7 @@ class PropheticFlamespeakerExileEffect extends OneShotEffect {
public PropheticFlamespeakerExileEffect() { public PropheticFlamespeakerExileEffect() {
super(Outcome.Detriment); super(Outcome.Detriment);
this.staticText = "Exile the top card of your library. You may play it this turn"; this.staticText = "exile the top card of your library. You may play it this turn";
} }
public PropheticFlamespeakerExileEffect(final PropheticFlamespeakerExileEffect effect) { public PropheticFlamespeakerExileEffect(final PropheticFlamespeakerExileEffect effect) {
@ -142,7 +142,7 @@ class PropheticFlamespeakerCastFromExileEffect extends AsThoughEffectImpl {
@Override @Override
public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
return source.getControllerId().equals(affectedControllerId) && return source.getControllerId().equals(affectedControllerId)
objectId.equals(getTargetPointer().getFirst(game, source)); && objectId.equals(getTargetPointer().getFirst(game, source));
} }
} }

View file

@ -33,9 +33,7 @@ import mage.abilities.keyword.BuybackAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.filter.FilterSpell; import mage.filter.StaticFilters;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.CardTypePredicate;
import mage.target.TargetSpell; import mage.target.TargetSpell;
/** /**
@ -44,14 +42,6 @@ import mage.target.TargetSpell;
*/ */
public class Reiterate extends CardImpl { public class Reiterate extends CardImpl {
private static final FilterSpell filter = new FilterSpell();
static {
filter.add(Predicates.or(
new CardTypePredicate(CardType.INSTANT),
new CardTypePredicate(CardType.SORCERY)));
}
public Reiterate(UUID ownerId, CardSetInfo setInfo) { public Reiterate(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{R}{R}"); super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{R}{R}");
@ -59,7 +49,7 @@ public class Reiterate extends CardImpl {
this.addAbility(new BuybackAbility("{3}")); this.addAbility(new BuybackAbility("{3}"));
// Copy target instant or sorcery spell. You may choose new targets for the copy. // Copy target instant or sorcery spell. You may choose new targets for the copy.
this.getSpellAbility().addTarget(new TargetSpell(filter)); this.getSpellAbility().addTarget(new TargetSpell(StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL));
this.getSpellAbility().addEffect(new CopyTargetSpellEffect()); this.getSpellAbility().addEffect(new CopyTargetSpellEffect());
} }

View file

@ -53,7 +53,6 @@ public class RiptideChimera extends CardImpl {
filter.add(new CardTypePredicate(CardType.ENCHANTMENT)); filter.add(new CardTypePredicate(CardType.ENCHANTMENT));
} }
public RiptideChimera(UUID ownerId, CardSetInfo setInfo) { public RiptideChimera(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "{2}{U}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "{2}{U}");
this.subtype.add(SubType.CHIMERA); this.subtype.add(SubType.CHIMERA);
@ -65,7 +64,7 @@ public class RiptideChimera extends CardImpl {
this.addAbility(FlyingAbility.getInstance()); this.addAbility(FlyingAbility.getInstance());
// At the beginning of your upkeep, return an enchantment you control to its owner's hand. // At the beginning of your upkeep, return an enchantment you control to its owner's hand.
Effect effect = new ReturnToHandChosenControlledPermanentEffect(filter, 1); Effect effect = new ReturnToHandChosenControlledPermanentEffect(filter, 1);
effect.setText("return an enchanment you control to its owner's hand"); effect.setText("return an enchantment you control to its owner's hand");
this.addAbility(new BeginningOfUpkeepTriggeredAbility(effect, TargetController.YOU, false)); this.addAbility(new BeginningOfUpkeepTriggeredAbility(effect, TargetController.YOU, false));
} }

View file

@ -71,7 +71,7 @@ class RitualOfTheReturnedExileEffect extends OneShotEffect {
public RitualOfTheReturnedExileEffect() { public RitualOfTheReturnedExileEffect() {
super(Outcome.PutCreatureInPlay); super(Outcome.PutCreatureInPlay);
this.staticText = "Exile target creature card from your graveyard. Create a black Zombie creature token with power equal to the exiled card's power and toughness equal to the exiled card's toughness"; this.staticText = "Exile target creature card from your graveyard. Create a black Zombie creature token. Its power is equal to that card's power and its toughness is equal to that card's toughness.";
} }
public RitualOfTheReturnedExileEffect(final RitualOfTheReturnedExileEffect effect) { public RitualOfTheReturnedExileEffect(final RitualOfTheReturnedExileEffect effect) {

View file

@ -42,8 +42,6 @@ import mage.constants.SubType;
*/ */
public class ScarwoodTreefolk extends CardImpl { public class ScarwoodTreefolk extends CardImpl {
private static final String staticText = "{this} enters the battlefield tapped";
public ScarwoodTreefolk(UUID ownerId, CardSetInfo setInfo) { public ScarwoodTreefolk(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}");
this.subtype.add(SubType.TREEFOLK); this.subtype.add(SubType.TREEFOLK);
@ -51,7 +49,7 @@ public class ScarwoodTreefolk extends CardImpl {
this.toughness = new MageInt(5); this.toughness = new MageInt(5);
// Scarwood Treefolk enters the battlefield tapped. // Scarwood Treefolk enters the battlefield tapped.
this.addAbility(new EntersBattlefieldAbility(new TapSourceEffect(), staticText)); this.addAbility(new EntersBattlefieldAbility(new TapSourceEffect(), "tapped"));
} }
public ScarwoodTreefolk(final ScarwoodTreefolk card) { public ScarwoodTreefolk(final ScarwoodTreefolk card) {

View file

@ -63,7 +63,7 @@ public class ScreechingSliver extends CardImpl {
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD,
new GainAbilityAllEffect(ability, Duration.WhileOnBattlefield, new GainAbilityAllEffect(ability, Duration.WhileOnBattlefield,
filter, "All Sliver creatures have \"{T}: Target player puts the top card of his or her library into his or her graveyard.\""))); filter, "All Slivers have \"{T}: Target player puts the top card of his or her library into his or her graveyard.\"")));
} }
public ScreechingSliver(final ScreechingSliver card) { public ScreechingSliver(final ScreechingSliver card) {

View file

@ -53,7 +53,8 @@ import mage.target.common.TargetCreaturePermanent;
*/ */
public class ScrybRanger extends CardImpl { public class ScrybRanger extends CardImpl {
private static final FilterControlledLandPermanent filterForest = new FilterControlledLandPermanent("Forest"); private static final FilterControlledLandPermanent filterForest = new FilterControlledLandPermanent("a Forest");
static { static {
filterForest.add(new SubtypePredicate(SubType.FOREST)); filterForest.add(new SubtypePredicate(SubType.FOREST));
} }

View file

@ -60,7 +60,6 @@ public class SetessanTactics extends CardImpl {
public SetessanTactics(UUID ownerId, CardSetInfo setInfo) { public SetessanTactics(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{G}"); super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{G}");
// Strive - Setessan Tactics costs G more to cast for each target beyond the first. // Strive - Setessan Tactics costs G more to cast for each target beyond the first.
this.addAbility(new StriveAbility("{G}")); this.addAbility(new StriveAbility("{G}"));
// Until end of turn, any number of target creatures each get +1/+1 and gain "T: This creature fights another target creature." // Until end of turn, any number of target creatures each get +1/+1 and gain "T: This creature fights another target creature."
@ -71,7 +70,7 @@ public class SetessanTactics extends CardImpl {
Ability gainedAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new FightTargetSourceEffect(), new TapSourceCost()); Ability gainedAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new FightTargetSourceEffect(), new TapSourceCost());
gainedAbility.addTarget(new TargetCreaturePermanent(filter)); gainedAbility.addTarget(new TargetCreaturePermanent(filter));
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(gainedAbility, Duration.EndOfTurn, this.getSpellAbility().addEffect(new GainAbilityTargetEffect(gainedAbility, Duration.EndOfTurn,
"and gain \"T: This creature fights another target creature.\"")); "and gain \"{T}: This creature fights another target creature.\""));
} }
public SetessanTactics(final SetessanTactics card) { public SetessanTactics(final SetessanTactics card) {

View file

@ -61,7 +61,10 @@ public class SidewinderSliver extends CardImpl {
this.toughness = new MageInt(1); this.toughness = new MageInt(1);
// All Sliver creatures have flanking. // All Sliver creatures have flanking.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(new FlankingAbility(), Duration.WhileOnBattlefield, filter, false))); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD,
new GainAbilityAllEffect(new FlankingAbility(), Duration.WhileOnBattlefield, filter, false)
.setText("all Slivers have flanking")
));
} }
public SidewinderSliver(final SidewinderSliver card) { public SidewinderSliver(final SidewinderSliver card) {

View file

@ -69,7 +69,7 @@ class SpellSwindleEffect extends OneShotEffect {
public SpellSwindleEffect() { public SpellSwindleEffect() {
super(Outcome.Detriment); super(Outcome.Detriment);
staticText = "Counter target spell. Create X colorless Treasure artifact tokens, where X is that spell's converted mana cost. " staticText = "Counter target spell. Create X colorless Treasure artifact tokens, where X is that spell's converted mana cost. "
+ "They have \"{T}, Sacrifice this artifact: Add one mana of any color to your mana pool\""; + "They have \"{T}, Sacrifice this artifact: Add one mana of any color to your mana pool.\"";
} }
public SpellSwindleEffect(final SpellSwindleEffect effect) { public SpellSwindleEffect(final SpellSwindleEffect effect) {

View file

@ -61,12 +61,12 @@ public class Spirespine extends CardImpl {
this.addAbility(new BestowAbility(this, "{4}{G}")); this.addAbility(new BestowAbility(this, "{4}{G}"));
// Spirespine blocks each turn if able. // Spirespine blocks each turn if able.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BlocksIfAbleSourceEffect(Duration.WhileOnBattlefield))); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BlocksIfAbleSourceEffect(Duration.WhileOnBattlefield)));
// Enchanted creature gets +4/+1 and blocks each turn if able. // Enchanted creature gets +4/+1 and blocks each combat if able.
Effect effect = new BoostEnchantedEffect(4, 1, Duration.WhileOnBattlefield); Effect effect = new BoostEnchantedEffect(4, 1, Duration.WhileOnBattlefield);
effect.setText("Enchanted creature gets +4/+1"); effect.setText("Enchanted creature gets +4/+1");
Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect);
effect = new BlocksIfAbleAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.AURA); effect = new BlocksIfAbleAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.AURA);
effect.setText("and blocks each turn if able"); effect.setText("and blocks each combat if able");
ability.addEffect(effect); ability.addEffect(effect);
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -60,7 +60,7 @@ public class StormFleetAerialist extends CardImpl {
// Raid - Storm Fleet Aerialist enters the battlefield with a +1/+1 counter on it if you attacked with a creature this turn. // Raid - Storm Fleet Aerialist enters the battlefield with a +1/+1 counter on it if you attacked with a creature this turn.
this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(1), false), this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(1), false),
RaidCondition.instance, RaidCondition.instance,
"<i>Raid</i> - {this} enters the battlefield with a +1/+1 counter on it if you attacked with a creature this turn", "<i>Raid</i> - {this} enters the battlefield with a +1/+1 counter on it if you attacked with a creature this turn.",
"{this} enters the battlefield with a +1/+1 counter"), "{this} enters the battlefield with a +1/+1 counter"),
new PlayerAttackedWatcher()); new PlayerAttackedWatcher());
} }

View file

@ -45,7 +45,7 @@ import mage.target.common.TargetCreaturePermanent;
*/ */
public class StranglingSoot extends CardImpl { public class StranglingSoot extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with toughess 3 or less"); private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with toughness 3 or less");
static { static {
filter.add(new ToughnessPredicate(ComparisonType.FEWER_THAN, 4)); filter.add(new ToughnessPredicate(ComparisonType.FEWER_THAN, 4));

View file

@ -118,6 +118,6 @@ class SwarmbornGiantTriggeredAbility extends TriggeredAbilityImpl {
@Override @Override
public String getRule() { public String getRule() {
return "Whenever you're dealt combat damage, " + super.getRule(); return "When you're dealt combat damage, " + super.getRule();
} }
} }

View file

@ -72,9 +72,6 @@ public class VesuvanShapeshifter extends CardImpl {
this.power = new MageInt(0); this.power = new MageInt(0);
this.toughness = new MageInt(0); this.toughness = new MageInt(0);
// Morph {1}{U}
this.addAbility(new MorphAbility(this, new ManaCostsImpl("{1}{U}")));
// As Vesuvan Shapeshifter turned face up, may choose another creature. If you do, until Vesuvan Shapeshifter is turned face down, it becomes a copy of that creature // As Vesuvan Shapeshifter turned face up, may choose another creature. If you do, until Vesuvan Shapeshifter is turned face down, it becomes a copy of that creature
Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new AsTurnedFaceUpEffect(new VesuvanShapeshifterEffect(), false)); Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new AsTurnedFaceUpEffect(new VesuvanShapeshifterEffect(), false));
ability.setWorksFaceDown(true); ability.setWorksFaceDown(true);
@ -91,6 +88,9 @@ public class VesuvanShapeshifter extends CardImpl {
effect = new VesuvanShapeshifterFaceDownEffect(); effect = new VesuvanShapeshifterFaceDownEffect();
ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, effect, TargetController.YOU, true); ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, effect, TargetController.YOU, true);
this.addAbility(ability); this.addAbility(ability);
// Morph {1}{U}
this.addAbility(new MorphAbility(this, new ManaCostsImpl("{1}{U}")));
} }
public VesuvanShapeshifter(final VesuvanShapeshifter card) { public VesuvanShapeshifter(final VesuvanShapeshifter card) {

View file

@ -51,7 +51,7 @@ public class WheelOfFate extends CardImpl {
this.addAbility(new SuspendAbility(4, new ManaCostsImpl("{1}{R}"), this)); this.addAbility(new SuspendAbility(4, new ManaCostsImpl("{1}{R}"), this));
// Each player discards his or her hand, then draws seven cards. // Each player discards his or her hand, then draws seven cards.
this.getSpellAbility().addEffect(new DiscardHandAllEffect()); this.getSpellAbility().addEffect(new DiscardHandAllEffect());
this.getSpellAbility().addEffect(new DrawCardAllEffect(7)); this.getSpellAbility().addEffect(new DrawCardAllEffect(7).setText(", then draws seven cards"));
} }
public WheelOfFate(final WheelOfFate card) { public WheelOfFate(final WheelOfFate card) {

View file

@ -58,13 +58,13 @@ public class WormwoodDryad extends CardImpl {
// {G}: Wormwood Dryad gains forestwalk until end of turn and deals 1 damage to you. // {G}: Wormwood Dryad gains forestwalk until end of turn and deals 1 damage to you.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
new GainAbilitySourceEffect(new ForestwalkAbility(false), Duration.EndOfTurn), new ManaCostsImpl("{G}")); new GainAbilitySourceEffect(new ForestwalkAbility(false), Duration.EndOfTurn), new ManaCostsImpl("{G}"));
ability.addEffect(new DamageControllerEffect(1)); ability.addEffect(new DamageControllerEffect(1).setText("and deals 1 damage to you"));
this.addAbility(ability); this.addAbility(ability);
// {B}: Wormwood Dryad gains swampwalk until end of turn and deals 1 damage to you. // {B}: Wormwood Dryad gains swampwalk until end of turn and deals 1 damage to you.
ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
new GainAbilitySourceEffect(new SwampwalkAbility(false), Duration.EndOfTurn), new ManaCostsImpl("{B}")); new GainAbilitySourceEffect(new SwampwalkAbility(false), Duration.EndOfTurn), new ManaCostsImpl("{B}"));
ability.addEffect(new DamageControllerEffect(1)); ability.addEffect(new DamageControllerEffect(1).setText("and deals 1 damage to you"));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -59,7 +59,7 @@ public class IsStepCondition implements Condition {
public String toString() { public String toString() {
StringBuilder sb = new StringBuilder("during "); StringBuilder sb = new StringBuilder("during ");
if (onlyDuringYourSteps) { if (onlyDuringYourSteps) {
sb.append("your "); sb.append("your ").append(phaseStep.getStepText());
} else if (phaseStep == PhaseStep.UPKEEP) { } else if (phaseStep == PhaseStep.UPKEEP) {
sb.append("any upkeep step"); sb.append("any upkeep step");
} else { } else {

View file

@ -63,7 +63,9 @@ public class AddConditionalManaOfAnyColorEffect extends ManaEffect {
staticText = "Add " staticText = "Add "
+ (amount instanceof StaticValue ? (CardUtil.numberToText(((StaticValue) amount).toString())) : "") + (amount instanceof StaticValue ? (CardUtil.numberToText(((StaticValue) amount).toString())) : "")
+ " mana " + " mana "
+ (oneChoice ? "of any one color" : "in any combination of colors") + (oneChoice ? "of any"
+ (amount instanceof StaticValue && (((StaticValue) amount).toString()).equals("1") ? "" : " one")
+ " color" : "in any combination of colors")
+ " to your mana pool. " + manaBuilder.getRule(); + " to your mana pool. " + manaBuilder.getRule();
} }

View file

@ -277,14 +277,14 @@ public class CreateTokenCopyTargetEffect extends OneShotEffect {
if (tapped && !attacking) { if (tapped && !attacking) {
sb.append("tapped "); sb.append("tapped ");
} }
sb.append("token"); sb.append("token that's a copy of target creature");
} else { } else {
sb.append(number); sb.append(number);
sb.append(" "); sb.append(" ");
if (tapped && !attacking) { if (tapped && !attacking) {
sb.append("tapped "); sb.append("tapped ");
} }
sb.append("tokens"); sb.append("tokens that are copies of target creature");
} }
if (attacking) { if (attacking) {
sb.append(" that are"); sb.append(" that are");

View file

@ -25,7 +25,6 @@
* authors and should not be interpreted as representing official policies, either expressed * authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com. * or implied, of BetaSteward_at_googlemail.com.
*/ */
package mage.abilities.effects.common; package mage.abilities.effects.common;
import mage.constants.Duration; import mage.constants.Duration;
@ -83,9 +82,9 @@ public class PreventDamageToTargetEffect extends PreventionEffectImpl {
} }
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
if (amountToPrevent == Integer.MAX_VALUE) { if (amountToPrevent == Integer.MAX_VALUE) {
sb.append("Prevent all damage that would be dealt to target "); sb.append("prevent all damage that would be dealt to target ");
} else { } else {
sb.append("Prevent the next ").append(amountToPrevent).append(" damage that would be dealt to target "); sb.append("prevent the next ").append(amountToPrevent).append(" damage that would be dealt to target ");
} }
sb.append(mode.getTargets().get(0).getTargetName()); sb.append(mode.getTargets().get(0).getTargetName());
if (!duration.toString().isEmpty()) { if (!duration.toString().isEmpty()) {

View file

@ -75,7 +75,7 @@ public class PutTopCardOfLibraryIntoGraveTargetEffect extends OneShotEffect {
} }
private String setText() { private String setText() {
StringBuilder sb = new StringBuilder("Target player puts the top "); StringBuilder sb = new StringBuilder("target player puts the top ");
if (numberCards.toString().equals("1")) { if (numberCards.toString().equals("1")) {
sb.append(" card"); sb.append(" card");
} else { } else {

View file

@ -80,6 +80,6 @@ public class TapAllTargetPlayerControlsEffect extends OneShotEffect {
if (staticText != null && !staticText.isEmpty()) { if (staticText != null && !staticText.isEmpty()) {
return staticText; return staticText;
} }
return "tap all " + filter.getMessage() + " target " + mode.getTargets().get(0).getMessage() + " controls"; return "tap all " + filter.toString() + " target " + mode.getTargets().get(0).getMessage() + " controls";
} }
} }

View file

@ -25,7 +25,6 @@
* authors and should not be interpreted as representing official policies, either expressed * authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com. * or implied, of BetaSteward_at_googlemail.com.
*/ */
package mage.abilities.effects.common.combat; package mage.abilities.effects.common.combat;
import mage.abilities.Ability; import mage.abilities.Ability;
@ -38,12 +37,11 @@ import mage.game.permanent.Permanent;
/** /**
* @author LevelX2 * @author LevelX2
*/ */
public class BlocksIfAbleAttachedEffect extends RequirementEffect { public class BlocksIfAbleAttachedEffect extends RequirementEffect {
public BlocksIfAbleAttachedEffect(Duration duration, AttachmentType attachmentType) { public BlocksIfAbleAttachedEffect(Duration duration, AttachmentType attachmentType) {
super(duration); super(duration);
this.staticText = attachmentType.verb() + " creature blocks each turn if able"; this.staticText = attachmentType.verb() + " creature blocks each combat if able";
} }
public BlocksIfAbleAttachedEffect(final BlocksIfAbleAttachedEffect effect) { public BlocksIfAbleAttachedEffect(final BlocksIfAbleAttachedEffect effect) {

View file

@ -25,7 +25,6 @@
* authors and should not be interpreted as representing official policies, either expressed * authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com. * or implied, of BetaSteward_at_googlemail.com.
*/ */
package mage.abilities.effects.common.combat; package mage.abilities.effects.common.combat;
import mage.abilities.Ability; import mage.abilities.Ability;
@ -39,7 +38,6 @@ import mage.game.permanent.Permanent;
* *
* @author LevelX2 * @author LevelX2
*/ */
public class BlocksIfAbleSourceEffect extends RequirementEffect { public class BlocksIfAbleSourceEffect extends RequirementEffect {
public BlocksIfAbleSourceEffect(Duration duration) { public BlocksIfAbleSourceEffect(Duration duration) {
@ -78,7 +76,7 @@ public class BlocksIfAbleSourceEffect extends RequirementEffect {
@Override @Override
public String getText(Mode mode) { public String getText(Mode mode) {
return "{this} blocks each turn if able."; return "{this} blocks each combat if able.";
} }
} }

View file

@ -25,7 +25,6 @@
* authors and should not be interpreted as representing official policies, either expressed * authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com. * or implied, of BetaSteward_at_googlemail.com.
*/ */
package mage.abilities.effects.common.combat; package mage.abilities.effects.common.combat;
import java.util.UUID; import java.util.UUID;
@ -35,35 +34,32 @@ import mage.constants.Duration;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
/** /**
* !! This effect does only support one target. * !! This effect does only support one target.
* *
* *
* http://tappedout.net/mtg-questions/must-be-blocked-if-able-effect-makes-other-attacking-creatures-essentially-unblockable/ * http://tappedout.net/mtg-questions/must-be-blocked-if-able-effect-makes-other-attacking-creatures-essentially-unblockable/
* *
* When you Declare Blockers, you choose an arrangement for your blockers, * When you Declare Blockers, you choose an arrangement for your blockers, then
* then check to see if there are any restrictions or requirements. * check to see if there are any restrictions or requirements.
* *
* If any restrictions are violated, the block is illegal. (For example, * If any restrictions are violated, the block is illegal. (For example, trying
* trying to block with Sightless Ghoul) * to block with Sightless Ghoul) If any requirements are violated, the least
* If any requirements are violated, the least possible number of requirements * possible number of requirements must be violated, otherwise the block is
* must be violated, otherwise the block is illegal. (For example, your opponent * illegal. (For example, your opponent control two creatures that he has cast
* control two creatures that he has cast Deadly Allure on, but you control only * Deadly Allure on, but you control only one creature. Blocking either one will
* one creature. Blocking either one will violate a requirement, "This creature * violate a requirement, "This creature must be blocked this turn if able", but
* must be blocked this turn if able", but it will also violate the least * it will also violate the least possible number of requirements, thus it is
* possible number of requirements, thus it is legal.) * legal.) If the block is illegal, the game state backs up and you declare
* If the block is illegal, the game state backs up and you declare blockers * blockers again. (Note that while you can, in some cases, circumvent
* again. (Note that while you can, in some cases, circumvent requirements * requirements such as "This creature must be blocked" or "This creature must
* such as "This creature must be blocked" or "This creature must block * block any attacking creature" you can never circumvent restrictions: "This
* any attacking creature" you can never circumvent restrictions: "This creature * creature can't block" or "Only one creature may block this turn.") Because
* can't block" or "Only one creature may block this turn.") * you declare ALL your blockers at once, THEN check for
* Because you declare ALL your blockers at once, THEN check for * restrictions/requirements, you may block Deadly Allure'd creatures with only
* restrictions/requirements, you may block Deadly Allure'd creatures * one creature, if you choose. This still works with Lure: This card sets up a
* with only one creature, if you choose. * requirement that ALL creatures must block it if able. Any block that violates
* This still works with Lure: This card sets up a requirement that ALL * more than the minimum number of requirements is still illegal.
* creatures must block it if able. Any block that violates more than
* the minimum number of requirements is still illegal.
* *
* @author LevelX2 * @author LevelX2
*/ */
@ -75,7 +71,7 @@ public class MustBeBlockedByAtLeastOneTargetEffect extends RequirementEffect {
public MustBeBlockedByAtLeastOneTargetEffect(Duration duration) { public MustBeBlockedByAtLeastOneTargetEffect(Duration duration) {
super(duration); super(duration);
staticText = "Target creature must be blocked this turn if able"; staticText = "target creature must be blocked this turn if able";
} }
public MustBeBlockedByAtLeastOneTargetEffect(final MustBeBlockedByAtLeastOneTargetEffect effect) { public MustBeBlockedByAtLeastOneTargetEffect(final MustBeBlockedByAtLeastOneTargetEffect effect) {

View file

@ -129,7 +129,7 @@ public abstract class SearchTargetGraveyardHandLibraryForCardNameAndExileEffect
@Override @Override
public String getText(Mode mode) { public String getText(Mode mode) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append("Search ").append(this.searchWhatText); sb.append("search ").append(this.searchWhatText);
sb.append(" graveyard, hand, and library for "); sb.append(" graveyard, hand, and library for ");
sb.append(this.searchForText); sb.append(this.searchForText);
sb.append(" and exile them. Then that player shuffles his or her library"); sb.append(" and exile them. Then that player shuffles his or her library");

View file

@ -1,4 +1,3 @@
package mage.abilities.keyword; package mage.abilities.keyword;
import mage.abilities.TriggeredAbilityImpl; import mage.abilities.TriggeredAbilityImpl;
@ -11,12 +10,9 @@ import mage.game.events.GameEvent;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.target.targetpointer.FixedTarget; import mage.target.targetpointer.FixedTarget;
/** /**
* @author Plopman * @author Plopman
*/ */
public class FlankingAbility extends TriggeredAbilityImpl { public class FlankingAbility extends TriggeredAbilityImpl {
public FlankingAbility() { public FlankingAbility() {
@ -37,9 +33,8 @@ public class FlankingAbility extends TriggeredAbilityImpl {
if (event.getTargetId().equals(this.getSourceId())) { if (event.getTargetId().equals(this.getSourceId())) {
Permanent permanent = game.getPermanent(event.getSourceId()); Permanent permanent = game.getPermanent(event.getSourceId());
if (permanent != null) { if (permanent != null) {
boolean hasFlankingAbility = boolean hasFlankingAbility
permanent.getAbilities().stream().anyMatch(ability -> ability instanceof FlankingAbility); = permanent.getAbilities().stream().anyMatch(ability -> ability instanceof FlankingAbility);
if (!hasFlankingAbility) { if (!hasFlankingAbility) {
for (Effect effect : this.getEffects()) { for (Effect effect : this.getEffects()) {
@ -54,7 +49,7 @@ public class FlankingAbility extends TriggeredAbilityImpl {
@Override @Override
public String getRule() { public String getRule() {
return "Flanking"; return "flanking";
} }
@Override @Override
@ -62,5 +57,4 @@ public class FlankingAbility extends TriggeredAbilityImpl {
return new FlankingAbility(this); return new FlankingAbility(this);
} }
} }

View file

@ -138,7 +138,11 @@ public class MorphAbility extends StaticAbility implements AlternativeSourceCost
break; break;
} }
} }
sb.append(morphCosts.getText()).append(' '); sb.append(morphCosts.getText());
if (!(morphCosts.get(morphCosts.size() - 1) instanceof ManaCosts)) {
sb.append('.');
}
sb.append(' ');
if (megamorph) { if (megamorph) {
sb.append(REMINDER_TEXT_MEGA); sb.append(REMINDER_TEXT_MEGA);
} else { } else {

View file

@ -12,9 +12,11 @@ import mage.game.permanent.Permanent;
/** /**
* "Shadow" keyword * "Shadow" keyword
*
* @author Loki * @author Loki
*/ */
public class ShadowAbility extends EvasionAbility implements MageSingleton { public class ShadowAbility extends EvasionAbility implements MageSingleton {
private static final ShadowAbility instance = new ShadowAbility(); private static final ShadowAbility instance = new ShadowAbility();
private Object readResolve() throws ObjectStreamException { private Object readResolve() throws ObjectStreamException {
@ -31,7 +33,7 @@ public class ShadowAbility extends EvasionAbility implements MageSingleton {
@Override @Override
public String getRule() { public String getRule() {
return "Shadow <i>(This creature can block or be blocked by only creatures with shadow.)</i>"; return "shadow <i>(This creature can block or be blocked by only creatures with shadow.)</i>";
} }
@Override @Override

View file

@ -59,7 +59,7 @@ public final class StaticFilters {
public static final FilterCreaturePermanent FILTER_PERMANENT_A_CREATURE = new FilterCreaturePermanent("a creature"); public static final FilterCreaturePermanent FILTER_PERMANENT_A_CREATURE = new FilterCreaturePermanent("a creature");
public static final FilterCreaturePermanent FILTER_PERMANENT_CREATURES = new FilterCreaturePermanent("creatures"); public static final FilterCreaturePermanent FILTER_PERMANENT_CREATURES = new FilterCreaturePermanent("creatures");
public static final FilterCreaturePermanent FILTER_PERMANENT_CREATURE_GOBLINS = new FilterCreaturePermanent(SubType.GOBLIN, "Goblin creatures"); public static final FilterCreaturePermanent FILTER_PERMANENT_CREATURE_GOBLINS = new FilterCreaturePermanent(SubType.GOBLIN, "Goblin creatures");
public static final FilterCreaturePermanent FILTER_PERMANENT_CREATURE_SLIVERS = new FilterCreaturePermanent(SubType.SLIVER, "Sliver creatures"); public static final FilterCreaturePermanent FILTER_PERMANENT_CREATURE_SLIVERS = new FilterCreaturePermanent(SubType.SLIVER, "all Sliver creatures");
public static final FilterPlaneswalkerPermanent FILTER_PERMANENT_PLANESWALKER = new FilterPlaneswalkerPermanent(); public static final FilterPlaneswalkerPermanent FILTER_PERMANENT_PLANESWALKER = new FilterPlaneswalkerPermanent();
public static final FilterPermanent FILTER_PERMANENT_NON_LAND = new FilterNonlandPermanent(); public static final FilterPermanent FILTER_PERMANENT_NON_LAND = new FilterNonlandPermanent();