mirror of
https://github.com/magefree/mage.git
synced 2025-12-23 12:02:01 -08:00
text fixes and test fixes to fix how tests test text, then more text next
This commit is contained in:
parent
14107b3d55
commit
54b8f10c3c
76 changed files with 247 additions and 227 deletions
|
|
@ -56,7 +56,9 @@ public class BanishingKnack extends CardImpl {
|
||||||
|
|
||||||
Ability gainedAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), new TapSourceCost());
|
Ability gainedAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), new TapSourceCost());
|
||||||
gainedAbility.addTarget(new TargetPermanent(filter));
|
gainedAbility.addTarget(new TargetPermanent(filter));
|
||||||
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(gainedAbility, Duration.EndOfTurn));
|
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(gainedAbility, Duration.EndOfTurn)
|
||||||
|
.setText("Until end of turn, target creature gains \"{T}: Return target nonland permanent to its owner's hand.\"")
|
||||||
|
);
|
||||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ import mage.filter.predicate.permanent.AnotherPredicate;
|
||||||
*/
|
*/
|
||||||
public class BelltollDragon extends CardImpl {
|
public class BelltollDragon extends CardImpl {
|
||||||
|
|
||||||
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("each other Dragon creature you control");
|
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("other Dragon creature you control");
|
||||||
|
|
||||||
static {
|
static {
|
||||||
filter.add(new AnotherPredicate());
|
filter.add(new AnotherPredicate());
|
||||||
|
|
|
||||||
|
|
@ -64,10 +64,10 @@ public class BlackManaBattery extends CardImpl {
|
||||||
Mana.BlackMana(1),
|
Mana.BlackMana(1),
|
||||||
new IntPlusDynamicValue(1, new RemovedCountersForCostValue()),
|
new IntPlusDynamicValue(1, new RemovedCountersForCostValue()),
|
||||||
new TapSourceCost(),
|
new TapSourceCost(),
|
||||||
"Add {B} to your mana pool, then add {B} to your mana pool for each storage counter removed this way",
|
"Add {B} to your mana pool, then add {B} to your mana pool for each charge counter removed this way",
|
||||||
true, new CountersSourceCount(CounterType.STORAGE));
|
true, new CountersSourceCount(CounterType.CHARGE));
|
||||||
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(),
|
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.CHARGE.createInstance(),
|
||||||
"Remove any number of storage counters from {this}"));
|
"Remove any number of charge counters from {this}"));
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -64,10 +64,10 @@ public class BlueManaBattery extends CardImpl {
|
||||||
Mana.BlueMana(1),
|
Mana.BlueMana(1),
|
||||||
new IntPlusDynamicValue(1, new RemovedCountersForCostValue()),
|
new IntPlusDynamicValue(1, new RemovedCountersForCostValue()),
|
||||||
new TapSourceCost(),
|
new TapSourceCost(),
|
||||||
"Add {U} to your mana pool, then add {U} to your mana pool for each storage counter removed this way",
|
"Add {U} to your mana pool, then add {U} to your mana pool for each charge counter removed this way",
|
||||||
true, new CountersSourceCount(CounterType.STORAGE));
|
true, new CountersSourceCount(CounterType.CHARGE));
|
||||||
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(),
|
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.CHARGE.createInstance(),
|
||||||
"Remove any number of storage counters from {this}"));
|
"Remove any number of charge counters from {this}"));
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,6 @@ public class DeityOfScars extends CardImpl {
|
||||||
this.subtype.add(SubType.SPIRIT);
|
this.subtype.add(SubType.SPIRIT);
|
||||||
this.subtype.add(SubType.AVATAR);
|
this.subtype.add(SubType.AVATAR);
|
||||||
|
|
||||||
|
|
||||||
this.power = new MageInt(7);
|
this.power = new MageInt(7);
|
||||||
this.toughness = new MageInt(7);
|
this.toughness = new MageInt(7);
|
||||||
|
|
||||||
|
|
@ -62,7 +61,7 @@ public class DeityOfScars extends CardImpl {
|
||||||
this.addAbility(TrampleAbility.getInstance());
|
this.addAbility(TrampleAbility.getInstance());
|
||||||
|
|
||||||
// Deity of Scars enters the battlefield with two -1/-1 counters on it.
|
// Deity of Scars enters the battlefield with two -1/-1 counters on it.
|
||||||
this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.M1M1.createInstance(2))));
|
this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.M1M1.createInstance(2)), "with two -1/-1 counters on it"));
|
||||||
|
|
||||||
// {B/G}, Remove a -1/-1 counter from Deity of Scars: Regenerate Deity of Scars.
|
// {B/G}, Remove a -1/-1 counter from Deity of Scars: Regenerate Deity of Scars.
|
||||||
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{B/G}"));
|
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{B/G}"));
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ import mage.filter.common.FilterAttackingCreature;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author jeffwadsworth
|
* @author jeffwadsworth
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
public class DuergarMineCaptain extends CardImpl {
|
public class DuergarMineCaptain extends CardImpl {
|
||||||
|
|
||||||
|
|
@ -58,7 +58,10 @@ public class DuergarMineCaptain extends CardImpl {
|
||||||
this.toughness = new MageInt(1);
|
this.toughness = new MageInt(1);
|
||||||
|
|
||||||
// {1}{RW}, {untap}: Attacking creatures get +1/+0 until end of turn.
|
// {1}{RW}, {untap}: Attacking creatures get +1/+0 until end of turn.
|
||||||
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostAllEffect(1, 0, Duration.EndOfTurn, new FilterAttackingCreature(), false), new ManaCostsImpl("{1}{R/W}"));
|
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
|
||||||
|
new BoostAllEffect(1, 0, Duration.EndOfTurn, new FilterAttackingCreature("attacking creatures"), false),
|
||||||
|
new ManaCostsImpl("{1}{R/W}")
|
||||||
|
);
|
||||||
ability.addCost(new UntapSourceCost());
|
ability.addCost(new UntapSourceCost());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ import mage.target.common.TargetCardInYourGraveyard;
|
||||||
*/
|
*/
|
||||||
public class DutifulAttendant extends CardImpl {
|
public class DutifulAttendant extends CardImpl {
|
||||||
|
|
||||||
private static final FilterCreatureCard filter = new FilterCreatureCard("another creature card from your graveyard");
|
private static final FilterCreatureCard filter = new FilterCreatureCard("another target creature card from your graveyard");
|
||||||
|
|
||||||
static {
|
static {
|
||||||
filter.add(new AnotherCardPredicate());
|
filter.add(new AnotherCardPredicate());
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ import mage.abilities.effects.Effect;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
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;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
|
|
@ -56,13 +57,12 @@ public class FieryBombardment extends CardImpl {
|
||||||
public FieryBombardment(UUID ownerId, CardSetInfo setInfo) {
|
public FieryBombardment(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}");
|
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}");
|
||||||
|
|
||||||
|
|
||||||
// Chroma - {2}, Sacrifice a creature: Fiery Bombardment deals damage to target creature or player equal to the number of red mana symbols in the sacrificed creature's mana cost.
|
// Chroma - {2}, Sacrifice a creature: Fiery Bombardment deals damage to target creature or player equal to the number of red mana symbols in the sacrificed creature's mana cost.
|
||||||
Effect effect = new FieryBombardmentEffect();
|
Effect effect = new FieryBombardmentEffect();
|
||||||
effect.setText("<i>Chroma</i> - Fiery Bombardment deals damage to target creature or player equal to the number of red mana symbols in the sacrificed creature's mana cost.");
|
|
||||||
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{2}"));
|
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{2}"));
|
||||||
ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent()));
|
ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent()));
|
||||||
ability.addTarget(new TargetCreatureOrPlayer());
|
ability.addTarget(new TargetCreatureOrPlayer());
|
||||||
|
ability.setAbilityWord(AbilityWord.CHROMA);
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -81,6 +81,7 @@ class FieryBombardmentEffect extends OneShotEffect {
|
||||||
|
|
||||||
public FieryBombardmentEffect() {
|
public FieryBombardmentEffect() {
|
||||||
super(Outcome.Benefit);
|
super(Outcome.Benefit);
|
||||||
|
staticText = "{this} deals damage to target creature or player equal to the number of red mana symbols in the sacrificed creature's mana cost.";
|
||||||
}
|
}
|
||||||
|
|
||||||
public FieryBombardmentEffect(final FieryBombardmentEffect effect) {
|
public FieryBombardmentEffect(final FieryBombardmentEffect effect) {
|
||||||
|
|
|
||||||
|
|
@ -56,9 +56,8 @@ public class FireAtWill extends CardImpl {
|
||||||
public FireAtWill(UUID ownerId, CardSetInfo setInfo) {
|
public FireAtWill(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{R/W}{R/W}{R/W}");
|
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{R/W}{R/W}{R/W}");
|
||||||
|
|
||||||
|
|
||||||
// Fire at Will deals 3 damage divided as you choose among one, two, or three target attacking or blocking creatures.
|
// Fire at Will deals 3 damage divided as you choose among one, two, or three target attacking or blocking creatures.
|
||||||
this.getSpellAbility().addEffect(new DamageMultiEffect(3));
|
this.getSpellAbility().addEffect(new DamageMultiEffect(3).setText("{this} deals 3 damage divided as you choose among one, two, or three target attacking or blocking creatures."));
|
||||||
this.getSpellAbility().addTarget(new TargetCreaturePermanentAmount(3, filter));
|
this.getSpellAbility().addTarget(new TargetCreaturePermanentAmount(3, filter));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,7 @@ class GilderBairnEffect extends OneShotEffect {
|
||||||
|
|
||||||
public GilderBairnEffect() {
|
public GilderBairnEffect() {
|
||||||
super(Outcome.Benefit);
|
super(Outcome.Benefit);
|
||||||
this.staticText = "For each counter on target permanent, put another of those counters on that permanent";
|
this.staticText = "Double the number of each kind of counter on target permanent";
|
||||||
}
|
}
|
||||||
|
|
||||||
public GilderBairnEffect(final GilderBairnEffect effect) {
|
public GilderBairnEffect(final GilderBairnEffect effect) {
|
||||||
|
|
|
||||||
|
|
@ -70,7 +70,9 @@ public class GleamOfAuthority extends CardImpl {
|
||||||
|
|
||||||
// Enchanted creature gets +1/+1 for each +1/+1 counter on other creatures you control
|
// Enchanted creature gets +1/+1 for each +1/+1 counter on other creatures you control
|
||||||
DynamicValue amount = new CountersOnControlledCount();
|
DynamicValue amount = new CountersOnControlledCount();
|
||||||
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(amount, amount, Duration.WhileOnBattlefield)));
|
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(amount, amount, Duration.WhileOnBattlefield)
|
||||||
|
.setText("Enchanted creature gets +1/+1 for each +1/+1 counter on other creatures you control.")
|
||||||
|
));
|
||||||
|
|
||||||
// Enchanted creature has vigilance and "{W}, {T}: Bloster 1."
|
// Enchanted creature has vigilance and "{W}, {T}: Bloster 1."
|
||||||
ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(VigilanceAbility.getInstance(), AttachmentType.AURA));
|
ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(VigilanceAbility.getInstance(), AttachmentType.AURA));
|
||||||
|
|
|
||||||
|
|
@ -64,10 +64,10 @@ public class GreenManaBattery extends CardImpl {
|
||||||
Mana.GreenMana(1),
|
Mana.GreenMana(1),
|
||||||
new IntPlusDynamicValue(1, new RemovedCountersForCostValue()),
|
new IntPlusDynamicValue(1, new RemovedCountersForCostValue()),
|
||||||
new TapSourceCost(),
|
new TapSourceCost(),
|
||||||
"Add {G} to your mana pool, then add {G} to your mana pool for each storage counter removed this way",
|
"Add {G} to your mana pool, then add {G} to your mana pool for each charge counter removed this way",
|
||||||
true, new CountersSourceCount(CounterType.STORAGE));
|
true, new CountersSourceCount(CounterType.CHARGE));
|
||||||
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(),
|
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.CHARGE.createInstance(),
|
||||||
"Remove any number of storage counters from {this}"));
|
"Remove any number of charge counters from {this}"));
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ import mage.counters.CounterType;
|
||||||
*/
|
*/
|
||||||
public class HelixPinnacle extends CardImpl {
|
public class HelixPinnacle extends CardImpl {
|
||||||
|
|
||||||
static final String rule = "if there are 100 or more tower counters on Helix Pinnacle, you win the game";
|
static final String rule = "at the beginning of your upkeep, if there are 100 or more tower counters on Helix Pinnacle, you win the game";
|
||||||
|
|
||||||
public HelixPinnacle(UUID ownerId, CardSetInfo setInfo) {
|
public HelixPinnacle(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{G}");
|
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{G}");
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,7 @@ public class MerrowBonegnawer extends CardImpl {
|
||||||
|
|
||||||
private UUID exileId = UUID.randomUUID();
|
private UUID exileId = UUID.randomUUID();
|
||||||
|
|
||||||
private static final FilterSpell filter = new FilterSpell("black spell");
|
private static final FilterSpell filter = new FilterSpell("a black spell");
|
||||||
|
|
||||||
static {
|
static {
|
||||||
filter.add(new ColorPredicate(ObjectColor.BLACK));
|
filter.add(new ColorPredicate(ObjectColor.BLACK));
|
||||||
|
|
|
||||||
|
|
@ -60,8 +60,8 @@ public class Moonhold extends CardImpl {
|
||||||
// Target player can't play land cards this turn if {R} was spent to cast Moonhold and can't play creature cards this turn if {W} was spent to cast it.
|
// Target player can't play land cards this turn if {R} was spent to cast Moonhold and can't play creature cards this turn if {W} was spent to cast it.
|
||||||
ContinuousRuleModifyingEffect effect = new MoonholdEffect();
|
ContinuousRuleModifyingEffect effect = new MoonholdEffect();
|
||||||
ContinuousRuleModifyingEffect effect2 = new MoonholdEffect2();
|
ContinuousRuleModifyingEffect effect2 = new MoonholdEffect2();
|
||||||
effect.setText("Target player can't play land cards this turn if {R} was spent to cast {this} ");
|
effect.setText("Target player can't play lands this turn if {R} was spent to cast {this}");
|
||||||
effect2.setText("and can't play creature cards this turn if {W} was spent to cast it.");
|
effect2.setText("and can't cast creature spells this turn if {W} was spent to cast it.");
|
||||||
this.getSpellAbility().addEffect(new ConditionalContinuousRuleModifyingEffect(
|
this.getSpellAbility().addEffect(new ConditionalContinuousRuleModifyingEffect(
|
||||||
effect,
|
effect,
|
||||||
new LockedInCondition(new ManaWasSpentCondition(ColoredManaSymbol.R))));
|
new LockedInCondition(new ManaWasSpentCondition(ColoredManaSymbol.R))));
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ public class NightskyMimic extends CardImpl {
|
||||||
filter.add(new ColorPredicate(ObjectColor.BLACK));
|
filter.add(new ColorPredicate(ObjectColor.BLACK));
|
||||||
}
|
}
|
||||||
|
|
||||||
private String rule = "Whenever you cast a spell that's both white and black, {this} has base power and toughness 4/4 until end of turn and gains flying until end of turn";
|
private String rule = "Whenever you cast a spell that's both white and black, {this} has base power and toughness 4/4 until end of turn and gains flying until end of turn.";
|
||||||
|
|
||||||
public NightskyMimic(UUID ownerId, CardSetInfo setInfo) {
|
public NightskyMimic(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W/B}");
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W/B}");
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,7 @@ public class PunctureBlast extends CardImpl {
|
||||||
this.addAbility(WitherAbility.getInstance());
|
this.addAbility(WitherAbility.getInstance());
|
||||||
this.getSpellAbility().addEffect(new DamageTargetEffect(3));
|
this.getSpellAbility().addEffect(new DamageTargetEffect(3));
|
||||||
this.getSpellAbility().addTarget(new TargetCreatureOrPlayer());
|
this.getSpellAbility().addTarget(new TargetCreatureOrPlayer());
|
||||||
|
this.getSpellAbility().setRuleAtTheTop(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public PunctureBlast(final PunctureBlast card) {
|
public PunctureBlast(final PunctureBlast card) {
|
||||||
|
|
|
||||||
|
|
@ -64,10 +64,10 @@ public class RedManaBattery extends CardImpl {
|
||||||
Mana.RedMana(1),
|
Mana.RedMana(1),
|
||||||
new IntPlusDynamicValue(1, new RemovedCountersForCostValue()),
|
new IntPlusDynamicValue(1, new RemovedCountersForCostValue()),
|
||||||
new TapSourceCost(),
|
new TapSourceCost(),
|
||||||
"Add {R} to your mana pool, then add {R} to your mana pool for each storage counter removed this way",
|
"Add {R} to your mana pool, then add {R} to your mana pool for each charge counter removed this way",
|
||||||
true, new CountersSourceCount(CounterType.STORAGE));
|
true, new CountersSourceCount(CounterType.CHARGE));
|
||||||
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(),
|
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.CHARGE.createInstance(),
|
||||||
"Remove any number of storage counters from {this}"));
|
"Remove any number of charge counters from {this}"));
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ import java.util.UUID;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
|
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
|
||||||
import mage.abilities.condition.Condition;
|
import mage.abilities.condition.Condition;
|
||||||
import mage.abilities.decorator.ConditionalOneShotEffect;
|
import mage.abilities.decorator.ConditionalTriggeredAbility;
|
||||||
import mage.abilities.effects.common.DamageTargetEffect;
|
import mage.abilities.effects.common.DamageTargetEffect;
|
||||||
import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect;
|
import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
|
|
@ -54,13 +54,16 @@ public class RekindledFlame extends CardImpl {
|
||||||
public RekindledFlame(UUID ownerId, CardSetInfo setInfo) {
|
public RekindledFlame(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{R}{R}");
|
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{R}{R}");
|
||||||
|
|
||||||
|
|
||||||
// Rekindled Flame deals 4 damage to target creature or player.
|
// Rekindled Flame deals 4 damage to target creature or player.
|
||||||
this.getSpellAbility().addEffect(new DamageTargetEffect(4));
|
this.getSpellAbility().addEffect(new DamageTargetEffect(4));
|
||||||
this.getSpellAbility().addTarget(new TargetCreatureOrPlayer());
|
this.getSpellAbility().addTarget(new TargetCreatureOrPlayer());
|
||||||
|
|
||||||
// At the beginning of your upkeep, if an opponent has no cards in hand, you may return Rekindled Flame from your graveyard to your hand.
|
// At the beginning of your upkeep, if an opponent has no cards in hand, you may return Rekindled Flame from your graveyard to your hand.
|
||||||
Ability ability = new BeginningOfUpkeepTriggeredAbility(Zone.GRAVEYARD, new ConditionalOneShotEffect(new ReturnSourceFromGraveyardToHandEffect(), new OpponentHasNoCardsInHandCondition(), rule), TargetController.YOU, true);
|
Ability ability = new ConditionalTriggeredAbility(
|
||||||
|
new BeginningOfUpkeepTriggeredAbility(
|
||||||
|
Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), TargetController.YOU, true
|
||||||
|
),
|
||||||
|
new OpponentHasNoCardsInHandCondition(), rule);
|
||||||
ability.setRuleVisible(true);
|
ability.setRuleVisible(true);
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ public class ShorecrasherMimic extends CardImpl {
|
||||||
filter.add(new ColorPredicate(ObjectColor.BLUE));
|
filter.add(new ColorPredicate(ObjectColor.BLUE));
|
||||||
}
|
}
|
||||||
|
|
||||||
private String rule = "Whenever you cast a spell that's both green and blue, {this} has base power and toughness 5/3 until end of turn and gains trample until end of turn";
|
private String rule = "Whenever you cast a spell that's both green and blue, {this} has base power and toughness 5/3 until end of turn and gains trample until end of turn.";
|
||||||
|
|
||||||
public ShorecrasherMimic(UUID ownerId, CardSetInfo setInfo) {
|
public ShorecrasherMimic(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G/U}");
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G/U}");
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,6 @@ public class TalarasBane extends CardImpl {
|
||||||
public TalarasBane(UUID ownerId, CardSetInfo setInfo) {
|
public TalarasBane(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}");
|
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}");
|
||||||
|
|
||||||
|
|
||||||
// Target opponent reveals his or her hand. You choose a green or white creature card from it. You gain life equal that creature card's toughness, then that player discards that card.
|
// Target opponent reveals his or her hand. You choose a green or white creature card from it. You gain life equal that creature card's toughness, then that player discards that card.
|
||||||
this.getSpellAbility().addEffect(new TalarasBaneEffect());
|
this.getSpellAbility().addEffect(new TalarasBaneEffect());
|
||||||
this.getSpellAbility().addTarget(new TargetOpponent());
|
this.getSpellAbility().addTarget(new TargetOpponent());
|
||||||
|
|
@ -85,7 +84,7 @@ class TalarasBaneEffect extends OneShotEffect {
|
||||||
|
|
||||||
public TalarasBaneEffect() {
|
public TalarasBaneEffect() {
|
||||||
super(Outcome.Detriment);
|
super(Outcome.Detriment);
|
||||||
this.staticText = "Target opponent reveals his or her hand. You choose a green or white creature card from it. You gain life equal that creature card's toughness, then that player discards that card";
|
this.staticText = "Target opponent reveals his or her hand. You choose a green or white creature card from it. You gain life equal to that creature card's toughness, then that player discards that card";
|
||||||
}
|
}
|
||||||
|
|
||||||
public TalarasBaneEffect(final TalarasBaneEffect effect) {
|
public TalarasBaneEffect(final TalarasBaneEffect effect) {
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ import mage.watchers.common.ManaSpentToCastWatcher;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author jeffwadsworth
|
* @author jeffwadsworth
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
public class UnnervingAssault extends CardImpl {
|
public class UnnervingAssault extends CardImpl {
|
||||||
|
|
||||||
|
|
@ -60,14 +60,13 @@ public class UnnervingAssault extends CardImpl {
|
||||||
public UnnervingAssault(UUID ownerId, CardSetInfo setInfo) {
|
public UnnervingAssault(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U/R}");
|
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U/R}");
|
||||||
|
|
||||||
|
|
||||||
// Creatures your opponents control get -1/-0 until end of turn if {U} was spent to cast Unnerving Assault, and creatures you control get +1/+0 until end of turn if {R} was spent to cast it.
|
// Creatures your opponents control get -1/-0 until end of turn if {U} was spent to cast Unnerving Assault, and creatures you control get +1/+0 until end of turn if {R} was spent to cast it.
|
||||||
this.getSpellAbility().addEffect(new ConditionalContinuousEffect(
|
this.getSpellAbility().addEffect(new ConditionalContinuousEffect(
|
||||||
new BoostAllEffect(-1, 0, Duration.EndOfTurn, filter, false),
|
new BoostAllEffect(-1, 0, Duration.EndOfTurn, filter, false),
|
||||||
new ManaWasSpentCondition(ColoredManaSymbol.U), "Creatures your opponents control get -1/0 until end of turn if {U} was spent to cast {this},"));
|
new ManaWasSpentCondition(ColoredManaSymbol.U), "Creatures your opponents control get -1/-0 until end of turn if {U} was spent to cast {this},"));
|
||||||
this.getSpellAbility().addEffect(new ConditionalContinuousEffect(
|
this.getSpellAbility().addEffect(new ConditionalContinuousEffect(
|
||||||
new BoostAllEffect(1, 0, Duration.EndOfTurn, filter2, false),
|
new BoostAllEffect(1, 0, Duration.EndOfTurn, filter2, false),
|
||||||
new ManaWasSpentCondition(ColoredManaSymbol.R), " and creatures you control get +1/0 until end of turn if {R} was spent to cast it"));
|
new ManaWasSpentCondition(ColoredManaSymbol.R), " and creatures you control get +1/+0 until end of turn if {R} was spent to cast it"));
|
||||||
this.getSpellAbility().addEffect(new InfoEffect("<i>(Do both if {U}{R} was spent.)</i>"));
|
this.getSpellAbility().addEffect(new InfoEffect("<i>(Do both if {U}{R} was spent.)</i>"));
|
||||||
this.getSpellAbility().addWatcher(new ManaSpentToCastWatcher());
|
this.getSpellAbility().addWatcher(new ManaSpentToCastWatcher());
|
||||||
|
|
||||||
|
|
@ -82,4 +81,3 @@ public class UnnervingAssault extends CardImpl {
|
||||||
return new UnnervingAssault(this);
|
return new UnnervingAssault(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -98,7 +98,7 @@ class BecomesUntappedControlledPermanentTriggeredAbility extends TriggeredAbilit
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getRule() {
|
public String getRule() {
|
||||||
return "When a permanent you control becomes untapped, " + super.getRule();
|
return "Whenever a permanent you control becomes untapped, " + super.getRule();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -76,7 +76,9 @@ class WardOfBonesEffect extends ContinuousRuleModifyingEffectImpl {
|
||||||
|
|
||||||
public WardOfBonesEffect() {
|
public WardOfBonesEffect() {
|
||||||
super(Duration.WhileOnBattlefield, Outcome.Benefit);
|
super(Duration.WhileOnBattlefield, Outcome.Benefit);
|
||||||
staticText = "Each opponent who controls more creatures than you can't play creature cards. The same is true for artifacts, enchantments, and lands";
|
staticText = "Each opponent who controls more creatures than you can't cast creature spells. "
|
||||||
|
+ "The same is true for artifacts and enchantments.<br><br>"
|
||||||
|
+ "Each opponent who controls more lands than you can't play lands.";
|
||||||
}
|
}
|
||||||
|
|
||||||
public WardOfBonesEffect(final WardOfBonesEffect effect) {
|
public WardOfBonesEffect(final WardOfBonesEffect effect) {
|
||||||
|
|
|
||||||
|
|
@ -64,10 +64,10 @@ public class WhiteManaBattery extends CardImpl {
|
||||||
Mana.WhiteMana(1),
|
Mana.WhiteMana(1),
|
||||||
new IntPlusDynamicValue(1, new RemovedCountersForCostValue()),
|
new IntPlusDynamicValue(1, new RemovedCountersForCostValue()),
|
||||||
new TapSourceCost(),
|
new TapSourceCost(),
|
||||||
"Add {W} to your mana pool, then add {W} to your mana pool for each storage counter removed this way",
|
"Add {W} to your mana pool, then add {W} to your mana pool for each charge counter removed this way",
|
||||||
true, new CountersSourceCount(CounterType.STORAGE));
|
true, new CountersSourceCount(CounterType.CHARGE));
|
||||||
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(),
|
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.CHARGE.createInstance(),
|
||||||
"Remove any number of storage counters from {this}"));
|
"Remove any number of charge counters from {this}"));
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -214,7 +214,7 @@ public class ExchangeControlTest extends CardTestPlayerBase {
|
||||||
addTarget(playerA, "Manta Riders");
|
addTarget(playerA, "Manta Riders");
|
||||||
|
|
||||||
// now use the activated ability to make the "Silvercoat Lions" (that became Mana Riders) flying
|
// now use the activated ability to make the "Silvercoat Lions" (that became Mana Riders) flying
|
||||||
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{U}: {this} gains Flying until end of turn.");
|
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{U}: {this} gains flying until end of turn.");
|
||||||
|
|
||||||
setStopAt(1, PhaseStep.END_TURN);
|
setStopAt(1, PhaseStep.END_TURN);
|
||||||
execute();
|
execute();
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,10 @@
|
||||||
package org.mage.test.cards.mana;
|
package org.mage.test.cards.mana;
|
||||||
|
|
||||||
import mage.abilities.costs.mana.ColorlessManaCost;
|
|
||||||
import mage.constants.ManaType;
|
import mage.constants.ManaType;
|
||||||
import mage.constants.PhaseStep;
|
import mage.constants.PhaseStep;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mage.test.serverside.base.CardTestPlayerBase;
|
import org.mage.test.serverside.base.CardTestPlayerBase;
|
||||||
import org.mage.test.serverside.base.impl.CardTestAPIImpl;
|
|
||||||
|
|
||||||
public class DoublingCubeTest extends CardTestPlayerBase {
|
public class DoublingCubeTest extends CardTestPlayerBase {
|
||||||
|
|
||||||
|
|
@ -26,7 +24,6 @@ public class DoublingCubeTest extends CardTestPlayerBase {
|
||||||
addCard(Zone.BATTLEFIELD, playerA, cube);
|
addCard(Zone.BATTLEFIELD, playerA, cube);
|
||||||
addCard(Zone.BATTLEFIELD, playerA, upwelling);
|
addCard(Zone.BATTLEFIELD, playerA, upwelling);
|
||||||
|
|
||||||
|
|
||||||
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {G} to your mana pool");
|
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {G} to your mana pool");
|
||||||
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {G} to your mana pool");
|
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {G} to your mana pool");
|
||||||
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {G} to your mana pool");
|
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {G} to your mana pool");
|
||||||
|
|
@ -38,6 +35,5 @@ public class DoublingCubeTest extends CardTestPlayerBase {
|
||||||
execute();
|
execute();
|
||||||
assertManaPool(playerA, ManaType.COLORLESS, 4);
|
assertManaPool(playerA, ManaType.COLORLESS, 4);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -52,8 +52,8 @@ public class HarvesterDruidTest extends CardTestPlayerBase {
|
||||||
execute();
|
execute();
|
||||||
|
|
||||||
ManaOptions options = playerA.getAvailableManaTest(currentGame);
|
ManaOptions options = playerA.getAvailableManaTest(currentGame);
|
||||||
Assert.assertEquals("Player should be able to create 2 red and 1 blue mana", "{R}{R}{U}", options.get(0).toString());
|
Assert.assertEquals("Player should be able to create 2 red and 1 blue mana", "{U}{R}{R}", options.get(0).toString());
|
||||||
Assert.assertEquals("Player should be able to create 1 red and 3 blue mana", "{R}{U}{U}", options.get(1).toString());
|
Assert.assertEquals("Player should be able to create 1 red and 3 blue mana", "{U}{U}{R}", options.get(1).toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -68,9 +68,9 @@ public class HarvesterDruidTest extends CardTestPlayerBase {
|
||||||
execute();
|
execute();
|
||||||
|
|
||||||
ManaOptions options = playerA.getAvailableManaTest(currentGame);
|
ManaOptions options = playerA.getAvailableManaTest(currentGame);
|
||||||
Assert.assertEquals("Player should be able to create 3 red and 1 blue mana", "{R}{R}{R}{U}", options.get(0).toString());
|
Assert.assertEquals("Player should be able to create 3 red and 1 blue mana", "{U}{R}{R}{R}", options.get(0).toString());
|
||||||
Assert.assertEquals("Player should be able to create 2 red and 2 blue mana", "{R}{R}{U}{U}", options.get(1).toString());
|
Assert.assertEquals("Player should be able to create 2 red and 2 blue mana", "{U}{U}{R}{R}", options.get(1).toString());
|
||||||
Assert.assertEquals("Player should be able to create 2 red and 2 blue mana", "{R}{R}{U}{U}", options.get(2).toString());
|
Assert.assertEquals("Player should be able to create 2 red and 2 blue mana", "{U}{U}{R}{R}", options.get(2).toString());
|
||||||
Assert.assertEquals("Player should be able to create 1 red and 3 blue mana", "{R}{U}{U}{U}", options.get(3).toString());
|
Assert.assertEquals("Player should be able to create 1 red and 3 blue mana", "{U}{U}{U}{R}", options.get(3).toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -174,13 +174,13 @@ public class ReflectingPoolTest extends CardTestPlayerBase {
|
||||||
|
|
||||||
ManaOptions options = playerA.getAvailableManaTest(currentGame);
|
ManaOptions options = playerA.getAvailableManaTest(currentGame);
|
||||||
Assert.assertEquals("Player A should be able to create the ", "{G}{G}{G}", options.get(0).toString());
|
Assert.assertEquals("Player A should be able to create the ", "{G}{G}{G}", options.get(0).toString());
|
||||||
Assert.assertEquals("Player A should be able to create the ", "{G}{G}{W}", options.get(1).toString());
|
Assert.assertEquals("Player A should be able to create the ", "{W}{G}{G}", options.get(1).toString());
|
||||||
Assert.assertEquals("Player A should be able to create the ", "{G}{G}{W}", options.get(2).toString()); // ManaOption type optimzing seems not optimal yet
|
Assert.assertEquals("Player A should be able to create the ", "{W}{G}{G}", options.get(2).toString()); // ManaOption type optimzing seems not optimal yet
|
||||||
Assert.assertEquals("Player A should be able to create the ", "{G}{W}{W}", options.get(3).toString());
|
Assert.assertEquals("Player A should be able to create the ", "{W}{W}{G}", options.get(3).toString());
|
||||||
Assert.assertEquals("Player A should be able to create only 3 different mana options", 4, options.size());
|
Assert.assertEquals("Player A should be able to create only 3 different mana options", 4, options.size());
|
||||||
|
|
||||||
options = playerB.getAvailableManaTest(currentGame);
|
options = playerB.getAvailableManaTest(currentGame);
|
||||||
Assert.assertEquals("Player B should be able to create the ", "{G}{W}", options.get(0).toString());
|
Assert.assertEquals("Player B should be able to create the ", "{W}{G}", options.get(0).toString());
|
||||||
Assert.assertEquals("Player B should be able to create the ", "{W}{W}", options.get(1).toString());
|
Assert.assertEquals("Player B should be able to create the ", "{W}{W}", options.get(1).toString());
|
||||||
Assert.assertEquals("Player B should be able to create only 3 different mana options", 2, options.size());
|
Assert.assertEquals("Player B should be able to create only 3 different mana options", 2, options.size());
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -70,8 +70,8 @@ public class SylvokExplorerTest extends CardTestPlayerBase {
|
||||||
execute();
|
execute();
|
||||||
|
|
||||||
ManaOptions options = playerA.getAvailableManaTest(currentGame);
|
ManaOptions options = playerA.getAvailableManaTest(currentGame);
|
||||||
Assert.assertEquals("Player should be able to create 1 red and 1 white mana", "{R}{W}", options.get(0).toString());
|
Assert.assertEquals("Player should be able to create 1 red and 1 white mana", "{W}{R}", options.get(0).toString());
|
||||||
Assert.assertEquals("Player should be able to create 1 blue and 1 white mana", "{U}{W}", options.get(1).toString());
|
Assert.assertEquals("Player should be able to create 1 blue and 1 white mana", "{W}{U}", options.get(1).toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
||||||
|
|
@ -37,12 +37,11 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
|
||||||
*
|
*
|
||||||
* @author LevelX2
|
* @author LevelX2
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class GrindstoneTest extends CardTestPlayerBase {
|
public class GrindstoneTest extends CardTestPlayerBase {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests that Grindstone mills all cards to graveyard while Painter's Servant is in play
|
* Tests that Grindstone mills all cards to graveyard while Painter's
|
||||||
* Leaving one Progenius in play
|
* Servant is in play Leaving one Progenius in play
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testGrindstoneProgenius() {
|
public void testGrindstoneProgenius() {
|
||||||
|
|
@ -72,8 +71,8 @@ public class GrindstoneTest extends CardTestPlayerBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests that Grindstone mills all cards to graveyard while Painter's Servant is in play
|
* Tests that Grindstone mills all cards to graveyard while Painter's
|
||||||
* Iterating with two Progenius for a draw
|
* Servant is in play Iterating with two Progenius for a draw
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testGrindstoneProgeniusDraw() {
|
public void testGrindstoneProgeniusDraw() {
|
||||||
|
|
@ -103,8 +102,8 @@ public class GrindstoneTest extends CardTestPlayerBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests that Grindstone mills all cards to graveyard while Painter's Servant is in play
|
* Tests that Grindstone mills all cards to graveyard while Painter's
|
||||||
* Iterating with two Progenius for a draw
|
* Servant is in play Iterating with two Progenius for a draw
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testGrindstoneUlamog() {
|
public void testGrindstoneUlamog() {
|
||||||
|
|
@ -136,5 +135,3 @@ public class GrindstoneTest extends CardTestPlayerBase {
|
||||||
assertPermanentCount(playerA, "Painter's Servant", 1);
|
assertPermanentCount(playerA, "Painter's Servant", 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -72,9 +72,9 @@ public class ManaOptionsTest extends CardTestPlayerBase {
|
||||||
|
|
||||||
Assert.assertEquals("mana variations don't fit", 4, manaOptions.size());
|
Assert.assertEquals("mana variations don't fit", 4, manaOptions.size());
|
||||||
Assert.assertEquals("{G}{G}{G}", getManaOption(0, manaOptions));
|
Assert.assertEquals("{G}{G}{G}", getManaOption(0, manaOptions));
|
||||||
Assert.assertEquals("{R}{G}{G}{W}", getManaOption(1, manaOptions));
|
Assert.assertEquals("{W}{R}{G}{G}", getManaOption(1, manaOptions));
|
||||||
Assert.assertEquals("{R}{R}{G}{W}{W}", getManaOption(2, manaOptions));
|
Assert.assertEquals("{W}{W}{R}{R}{G}", getManaOption(2, manaOptions));
|
||||||
Assert.assertEquals("{R}{R}{R}{W}{W}{W}", getManaOption(3, manaOptions));
|
Assert.assertEquals("{W}{W}{W}{R}{R}{R}", getManaOption(3, manaOptions));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -95,11 +95,11 @@ public class ManaOptionsTest extends CardTestPlayerBase {
|
||||||
Assert.assertEquals("{C}{C}{W}", getManaOption(1, manaOptions));
|
Assert.assertEquals("{C}{C}{W}", getManaOption(1, manaOptions));
|
||||||
Assert.assertEquals("{C}{C}{U}", getManaOption(2, manaOptions));
|
Assert.assertEquals("{C}{C}{U}", getManaOption(2, manaOptions));
|
||||||
Assert.assertEquals("{C}{W}{W}", getManaOption(3, manaOptions));
|
Assert.assertEquals("{C}{W}{W}", getManaOption(3, manaOptions));
|
||||||
Assert.assertEquals("{C}{U}{W}", getManaOption(4, manaOptions));
|
Assert.assertEquals("{C}{W}{U}", getManaOption(4, manaOptions));
|
||||||
Assert.assertEquals("{C}{U}{U}", getManaOption(5, manaOptions));
|
Assert.assertEquals("{C}{U}{U}", getManaOption(5, manaOptions));
|
||||||
Assert.assertEquals("{W}{W}{W}", getManaOption(6, manaOptions));
|
Assert.assertEquals("{W}{W}{W}", getManaOption(6, manaOptions));
|
||||||
Assert.assertEquals("{U}{W}{W}", getManaOption(7, manaOptions));
|
Assert.assertEquals("{W}{W}{U}", getManaOption(7, manaOptions));
|
||||||
Assert.assertEquals("{U}{U}{W}", getManaOption(8, manaOptions));
|
Assert.assertEquals("{W}{U}{U}", getManaOption(8, manaOptions));
|
||||||
Assert.assertEquals("{U}{U}{U}", getManaOption(9, manaOptions));
|
Assert.assertEquals("{U}{U}{U}", getManaOption(9, manaOptions));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -151,7 +151,7 @@ public class ManaOptionsTest extends CardTestPlayerBase {
|
||||||
ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame);
|
ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame);
|
||||||
|
|
||||||
Assert.assertEquals("mana variations don't fit", 1, manaOptions.size());
|
Assert.assertEquals("mana variations don't fit", 1, manaOptions.size());
|
||||||
Assert.assertEquals("{C}{G}{G}{W}{W}", getManaOption(0, manaOptions));
|
Assert.assertEquals("{C}{W}{W}{G}{G}", getManaOption(0, manaOptions));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Crystal Quarry
|
// Crystal Quarry
|
||||||
|
|
@ -169,8 +169,8 @@ public class ManaOptionsTest extends CardTestPlayerBase {
|
||||||
ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame);
|
ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame);
|
||||||
|
|
||||||
Assert.assertEquals("mana variations don't fit", 2, manaOptions.size());
|
Assert.assertEquals("mana variations don't fit", 2, manaOptions.size());
|
||||||
Assert.assertEquals("{C}{G}{G}{G}{W}{W}", getManaOption(0, manaOptions));
|
Assert.assertEquals("{C}{W}{W}{G}{G}{G}", getManaOption(0, manaOptions));
|
||||||
Assert.assertEquals("{R}{G}{U}{W}{B}", getManaOption(1, manaOptions));
|
Assert.assertEquals("{W}{U}{B}{R}{G}", getManaOption(1, manaOptions));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Nykthos, Shrine to Nyx
|
// Nykthos, Shrine to Nyx
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,8 @@ public interface Abilities<T extends Ability> extends List<T>, Serializable {
|
||||||
*/
|
*/
|
||||||
List<String> getRules(String source);
|
List<String> getRules(String source);
|
||||||
|
|
||||||
|
List<String> getRules(String source, boolean capitalize);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves all activated abilities for the given {@link Zone}.
|
* Retrieves all activated abilities for the given {@link Zone}.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -69,6 +69,11 @@ public class AbilitiesImpl<T extends Ability> extends ArrayList<T> implements Ab
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> getRules(String source) {
|
public List<String> getRules(String source) {
|
||||||
|
return getRules(source, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getRules(String source, boolean capitalize) {
|
||||||
List<String> rules = new ArrayList<>();
|
List<String> rules = new ArrayList<>();
|
||||||
|
|
||||||
for (T ability : this) {
|
for (T ability : this) {
|
||||||
|
|
@ -78,7 +83,9 @@ public class AbilitiesImpl<T extends Ability> extends ArrayList<T> implements Ab
|
||||||
if (!(ability instanceof SpellAbility || ability instanceof PlayLandAbility)) {
|
if (!(ability instanceof SpellAbility || ability instanceof PlayLandAbility)) {
|
||||||
String rule = ability.getRule();
|
String rule = ability.getRule();
|
||||||
if (rule != null && rule.length() > 3) {
|
if (rule != null && rule.length() > 3) {
|
||||||
|
if (capitalize) {
|
||||||
rule = Character.toUpperCase(rule.charAt(0)) + rule.substring(1);
|
rule = Character.toUpperCase(rule.charAt(0)) + rule.substring(1);
|
||||||
|
}
|
||||||
if (ability.getRuleAtTheTop()) {
|
if (ability.getRuleAtTheTop()) {
|
||||||
rules.add(0, rule);
|
rules.add(0, rule);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ public class CompoundAbility extends AbilitiesImpl<Ability> {
|
||||||
}
|
}
|
||||||
|
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
List<String> rules = super.getRules(null);
|
List<String> rules = super.getRules(null,false);
|
||||||
for (int index = 0; index < rules.size(); index++) {
|
for (int index = 0; index < rules.size(); index++) {
|
||||||
if (index > 0) {
|
if (index > 0) {
|
||||||
if (index < rules.size() - 1) {
|
if (index < rules.size() - 1) {
|
||||||
|
|
|
||||||
|
|
@ -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.costs.common;
|
package mage.abilities.costs.common;
|
||||||
|
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
|
|
@ -38,6 +37,7 @@ import mage.target.common.TargetControlledPermanent;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import mage.abilities.costs.Cost;
|
import mage.abilities.costs.Cost;
|
||||||
|
import mage.util.CardUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
@ -49,7 +49,7 @@ public class UntapTargetCost extends CostImpl {
|
||||||
|
|
||||||
public UntapTargetCost(TargetControlledPermanent target) {
|
public UntapTargetCost(TargetControlledPermanent target) {
|
||||||
this.target = target;
|
this.target = target;
|
||||||
this.text = "Untap " + target.getMaxNumberOfTargets() + ' ' + target.getTargetName();
|
this.text = "Untap " + CardUtil.numberToText(target.getMaxNumberOfTargets(), "") + ' ' + target.getTargetName();
|
||||||
}
|
}
|
||||||
|
|
||||||
public UntapTargetCost(final UntapTargetCost cost) {
|
public UntapTargetCost(final UntapTargetCost cost) {
|
||||||
|
|
@ -62,8 +62,9 @@ public class UntapTargetCost extends CostImpl {
|
||||||
if (target.choose(Outcome.Untap, controllerId, sourceId, game)) {
|
if (target.choose(Outcome.Untap, controllerId, sourceId, game)) {
|
||||||
for (UUID targetId : (List<UUID>) target.getTargets()) {
|
for (UUID targetId : (List<UUID>) target.getTargets()) {
|
||||||
Permanent permanent = game.getPermanent(targetId);
|
Permanent permanent = game.getPermanent(targetId);
|
||||||
if (permanent == null)
|
if (permanent == null) {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
paid |= permanent.untap(game);
|
paid |= permanent.untap(game);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -80,5 +81,4 @@ public class UntapTargetCost extends CostImpl {
|
||||||
return new UntapTargetCost(this);
|
return new UntapTargetCost(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ public class GetEmblemEffect extends OneShotEffect {
|
||||||
public GetEmblemEffect(Emblem emblem) {
|
public GetEmblemEffect(Emblem emblem) {
|
||||||
super(Outcome.Benefit);
|
super(Outcome.Benefit);
|
||||||
this.emblem = emblem;
|
this.emblem = emblem;
|
||||||
this.staticText = "You get an emblem with \"" + +'"';
|
this.staticText = getText();
|
||||||
}
|
}
|
||||||
|
|
||||||
public GetEmblemEffect(final GetEmblemEffect effect) {
|
public GetEmblemEffect(final GetEmblemEffect effect) {
|
||||||
|
|
@ -74,7 +74,9 @@ public class GetEmblemEffect extends OneShotEffect {
|
||||||
sb.append("You get an emblem with \"");
|
sb.append("You get an emblem with \"");
|
||||||
List<String> rules = emblem.getAbilities().getRules(null);
|
List<String> rules = emblem.getAbilities().getRules(null);
|
||||||
if (rules.size() == 1) {
|
if (rules.size() == 1) {
|
||||||
sb.append(rules.get(0));
|
for (String s : rules) {
|
||||||
|
sb.append(s);
|
||||||
|
}
|
||||||
sb.append('"');
|
sb.append('"');
|
||||||
} else if (rules.size() == 2) {
|
} else if (rules.size() == 2) {
|
||||||
for (String s : rules) {
|
for (String s : rules) {
|
||||||
|
|
@ -83,7 +85,6 @@ public class GetEmblemEffect extends OneShotEffect {
|
||||||
}
|
}
|
||||||
sb.append('"');
|
sb.append('"');
|
||||||
}
|
}
|
||||||
sb.append('.');
|
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -264,9 +264,11 @@ public class LookLibraryAndPickControllerEffect extends LookLibraryControllerEff
|
||||||
sb.append(". You may reveal ");
|
sb.append(". You may reveal ");
|
||||||
sb.append(filter.getMessage()).append(" from among them and put it into your ");
|
sb.append(filter.getMessage()).append(" from among them and put it into your ");
|
||||||
} else if (targetPickedCards == Zone.BATTLEFIELD) {
|
} else if (targetPickedCards == Zone.BATTLEFIELD) {
|
||||||
sb.append(". You ");
|
sb.append(". ");
|
||||||
if (optional) {
|
if (optional) {
|
||||||
sb.append("may ");
|
sb.append("You may p");
|
||||||
|
} else {
|
||||||
|
sb.append('P');
|
||||||
}
|
}
|
||||||
sb.append("put ").append(filter.getMessage()).append(" from among them onto the ");
|
sb.append("put ").append(filter.getMessage()).append(" from among them onto the ");
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -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.continuous;
|
package mage.abilities.effects.common.continuous;
|
||||||
|
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
|
|
@ -116,21 +115,24 @@ public class BoostEquippedEffect extends ContinuousEffectImpl {
|
||||||
|
|
||||||
private void setText() {
|
private void setText() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
sb.append("Equipped creature gets ");
|
sb.append("equipped creature gets ");
|
||||||
String p = power.toString();
|
String p = power.toString();
|
||||||
if (!p.startsWith("-"))
|
if (!p.startsWith("-")) {
|
||||||
sb.append('+');
|
sb.append('+');
|
||||||
|
}
|
||||||
sb.append(p).append('/');
|
sb.append(p).append('/');
|
||||||
String t = toughness.toString();
|
String t = toughness.toString();
|
||||||
if (!t.startsWith("-")) {
|
if (!t.startsWith("-")) {
|
||||||
if (p.startsWith("-"))
|
if (p.startsWith("-")) {
|
||||||
sb.append('-');
|
sb.append('-');
|
||||||
else
|
} else {
|
||||||
sb.append('+');
|
sb.append('+');
|
||||||
}
|
}
|
||||||
|
}
|
||||||
sb.append(t);
|
sb.append(t);
|
||||||
if (duration != Duration.WhileOnBattlefield)
|
if (duration != Duration.WhileOnBattlefield) {
|
||||||
sb.append(' ').append(duration.toString());
|
sb.append(' ').append(duration.toString());
|
||||||
|
}
|
||||||
String message = power.getMessage();
|
String message = power.getMessage();
|
||||||
if (!message.isEmpty()) {
|
if (!message.isEmpty()) {
|
||||||
sb.append(" for each ");
|
sb.append(" for each ");
|
||||||
|
|
|
||||||
|
|
@ -89,7 +89,7 @@ public class ProtectionAbility extends StaticAbility {
|
||||||
@Override
|
@Override
|
||||||
public String getRule() {
|
public String getRule() {
|
||||||
|
|
||||||
return "protection from " + filter.getMessage() + (removeAuras ? "" : ". This effect doesn't remove auras.");
|
return "Protection from " + filter.getMessage() + (removeAuras ? "" : ". This effect doesn't remove auras.");
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canTarget(MageObject source, Game game) {
|
public boolean canTarget(MageObject source, Game game) {
|
||||||
|
|
|
||||||
|
|
@ -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.keyword;
|
package mage.abilities.keyword;
|
||||||
|
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
|
|
@ -37,11 +36,16 @@ import java.io.ObjectStreamException;
|
||||||
/**
|
/**
|
||||||
* 702.77. Wither
|
* 702.77. Wither
|
||||||
*
|
*
|
||||||
* 702.77a. Wither is a static ability. Damage dealt to a creature by a source with wither isn't marked on that creature. Rather, it causes that many -1/-1 counters to be put on that creature. See rule 119.3.
|
* 702.77a. Wither is a static ability. Damage dealt to a creature by a source
|
||||||
|
* with wither isn't marked on that creature. Rather, it causes that many -1/-1
|
||||||
|
* counters to be put on that creature. See rule 119.3.
|
||||||
*
|
*
|
||||||
* 702.77b. If a permanent leaves the battlefield before an effect causes it to deal damage, its last known information is used to determine whether it had wither.
|
* 702.77b. If a permanent leaves the battlefield before an effect causes it to
|
||||||
|
* deal damage, its last known information is used to determine whether it had
|
||||||
|
* wither.
|
||||||
*
|
*
|
||||||
* 702.77c. The wither rules function no matter what zone an object with wither deals damage from.
|
* 702.77c. The wither rules function no matter what zone an object with wither
|
||||||
|
* deals damage from.
|
||||||
*
|
*
|
||||||
* 702.77d. Multiple instances of wither on the same object are redundant.
|
* 702.77d. Multiple instances of wither on the same object are redundant.
|
||||||
*
|
*
|
||||||
|
|
@ -65,7 +69,7 @@ public class WitherAbility extends StaticAbility implements MageSingleton {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getRule() {
|
public String getRule() {
|
||||||
return "Wither <i>(This deals damage to creatures in the form of -1/-1 counters.)</i>";
|
return "wither <i>(This deals damage to creatures in the form of -1/-1 counters.)</i>";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -497,7 +497,7 @@ public class ManaTest {
|
||||||
String ret = mana.toString();
|
String ret = mana.toString();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertEquals("{6}{R}{G}{G}{U}{U}{U}{B}{B}{B}{Any}{Any}", ret);
|
assertEquals("{6}{U}{U}{U}{B}{B}{B}{R}{G}{G}{Any}{Any}", ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue