mirror of
https://github.com/correl/mage.git
synced 2024-12-01 03:00:09 +00:00
[ALA] various text fixes
This commit is contained in:
parent
670c2a5615
commit
edaaac53d9
33 changed files with 185 additions and 248 deletions
|
@ -45,7 +45,7 @@ public final class AjaniVengeant extends CardImpl {
|
||||||
// −2: Ajani Vengeant deals 3 damage to any target and you gain 3 life.
|
// −2: Ajani Vengeant deals 3 damage to any target and you gain 3 life.
|
||||||
Effects effects1 = new Effects();
|
Effects effects1 = new Effects();
|
||||||
effects1.add(new DamageTargetEffect(3));
|
effects1.add(new DamageTargetEffect(3));
|
||||||
effects1.add(new GainLifeEffect(3));
|
effects1.add(new GainLifeEffect(3).concatBy("and"));
|
||||||
LoyaltyAbility ability2 = new LoyaltyAbility(effects1, -2);
|
LoyaltyAbility ability2 = new LoyaltyAbility(effects1, -2);
|
||||||
ability2.addTarget(new TargetAnyTarget());
|
ability2.addTarget(new TargetAnyTarget());
|
||||||
this.addAbility(ability2);
|
this.addAbility(ability2);
|
||||||
|
|
|
@ -43,7 +43,7 @@ public final class ArchdemonOfUnx extends CardImpl {
|
||||||
this.addAbility(TrampleAbility.getInstance());
|
this.addAbility(TrampleAbility.getInstance());
|
||||||
// At the beginning of your upkeep, sacrifice a non-Zombie creature, then create a 2/2 black Zombie creature token.
|
// At the beginning of your upkeep, sacrifice a non-Zombie creature, then create a 2/2 black Zombie creature token.
|
||||||
Ability ability = new BeginningOfUpkeepTriggeredAbility(new SacrificeControllerEffect(filter, 1, ""), TargetController.YOU, false);
|
Ability ability = new BeginningOfUpkeepTriggeredAbility(new SacrificeControllerEffect(filter, 1, ""), TargetController.YOU, false);
|
||||||
ability.addEffect(new CreateTokenEffect(new ZombieToken()));
|
ability.addEffect(new CreateTokenEffect(new ZombieToken()).concatBy(", then"));
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ import mage.MageInt;
|
||||||
import mage.abilities.common.DiesSourceTriggeredAbility;
|
import mage.abilities.common.DiesSourceTriggeredAbility;
|
||||||
import mage.abilities.costs.mana.GenericManaCost;
|
import mage.abilities.costs.mana.GenericManaCost;
|
||||||
import mage.abilities.effects.common.DoIfCostPaid;
|
import mage.abilities.effects.common.DoIfCostPaid;
|
||||||
|
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
|
||||||
import mage.abilities.effects.common.ReturnToHandTargetEffect;
|
import mage.abilities.effects.common.ReturnToHandTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
@ -21,7 +22,7 @@ import mage.target.common.TargetCardInYourGraveyard;
|
||||||
*/
|
*/
|
||||||
public final class CarrionThrash extends CardImpl {
|
public final class CarrionThrash 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());
|
||||||
|
@ -36,7 +37,7 @@ public final class CarrionThrash extends CardImpl {
|
||||||
this.toughness = new MageInt(4);
|
this.toughness = new MageInt(4);
|
||||||
|
|
||||||
// When Carrion Thrash dies, you may pay {2}. If you do, return another target creature card from your graveyard to your hand.
|
// When Carrion Thrash dies, you may pay {2}. If you do, return another target creature card from your graveyard to your hand.
|
||||||
DiesSourceTriggeredAbility ability = new DiesSourceTriggeredAbility(new DoIfCostPaid(new ReturnToHandTargetEffect(), new GenericManaCost(2)), false);
|
DiesSourceTriggeredAbility ability = new DiesSourceTriggeredAbility(new DoIfCostPaid(new ReturnFromGraveyardToHandTargetEffect(), new GenericManaCost(2)), false);
|
||||||
ability.addTarget(new TargetCardInYourGraveyard(filter));
|
ability.addTarget(new TargetCardInYourGraveyard(filter));
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,8 +2,6 @@ package mage.cards.c;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
|
||||||
import mage.abilities.effects.common.GainLifeEffect;
|
|
||||||
import mage.abilities.effects.common.LoseLifeTargetEffect;
|
import mage.abilities.effects.common.LoseLifeTargetEffect;
|
||||||
import mage.abilities.effects.common.SacrificeEffect;
|
import mage.abilities.effects.common.SacrificeEffect;
|
||||||
import mage.abilities.effects.common.discard.DiscardTargetEffect;
|
import mage.abilities.effects.common.discard.DiscardTargetEffect;
|
||||||
|
@ -32,13 +30,13 @@ public final class CruelUltimatum extends CardImpl {
|
||||||
// Target opponent sacrifices a creature, discards three cards, then loses 5 life.
|
// Target opponent sacrifices a creature, discards three cards, then loses 5 life.
|
||||||
// You return a creature card from your graveyard to your hand, draw three cards, then gain 5 life.
|
// You return a creature card from your graveyard to your hand, draw three cards, then gain 5 life.
|
||||||
this.getSpellAbility().addTarget(new TargetOpponent());
|
this.getSpellAbility().addTarget(new TargetOpponent());
|
||||||
this.getSpellAbility().addEffect(new SacrificeEffect(StaticFilters.FILTER_PERMANENT_CREATURE, 1, "Target opponent"));
|
this.getSpellAbility().addEffect(new SacrificeEffect(
|
||||||
this.getSpellAbility().addEffect(new DiscardTargetEffect(3));
|
StaticFilters.FILTER_PERMANENT_CREATURE,
|
||||||
this.getSpellAbility().addEffect(new LoseLifeTargetEffect(5));
|
1, "Target opponent"
|
||||||
|
));
|
||||||
|
this.getSpellAbility().addEffect(new DiscardTargetEffect(3).setText(", discards three cards"));
|
||||||
|
this.getSpellAbility().addEffect(new LoseLifeTargetEffect(5).setText(", then loses 5 life"));
|
||||||
this.getSpellAbility().addEffect(new CruelUltimatumEffect());
|
this.getSpellAbility().addEffect(new CruelUltimatumEffect());
|
||||||
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(3));
|
|
||||||
this.getSpellAbility().addEffect(new GainLifeEffect(5));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private CruelUltimatum(final CruelUltimatum card) {
|
private CruelUltimatum(final CruelUltimatum card) {
|
||||||
|
@ -55,7 +53,8 @@ class CruelUltimatumEffect extends OneShotEffect {
|
||||||
|
|
||||||
public CruelUltimatumEffect() {
|
public CruelUltimatumEffect() {
|
||||||
super(Outcome.ReturnToHand);
|
super(Outcome.ReturnToHand);
|
||||||
this.staticText = "Return a creature card from your graveyard to your hand";
|
this.staticText = "You return a creature card from your graveyard " +
|
||||||
|
"to your hand, draw three cards, then gain 5 life";
|
||||||
}
|
}
|
||||||
|
|
||||||
public CruelUltimatumEffect(final CruelUltimatumEffect effect) {
|
public CruelUltimatumEffect(final CruelUltimatumEffect effect) {
|
||||||
|
@ -74,14 +73,13 @@ class CruelUltimatumEffect extends OneShotEffect {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
TargetCardInYourGraveyard target = new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD);
|
TargetCardInYourGraveyard target = new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD);
|
||||||
if (target.canChoose(source.getSourceId(), source.getControllerId(), game) && controller.choose(Outcome.ReturnToHand, target, source.getSourceId(), game)) {
|
controller.choose(Outcome.ReturnToHand, target, source.getSourceId(), game);
|
||||||
Card card = game.getCard(target.getFirstTarget());
|
Card card = game.getCard(target.getFirstTarget());
|
||||||
if (card == null) {
|
if (card != null) {
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return controller.moveCards(card, Zone.HAND, source, game);
|
return controller.moveCards(card, Zone.HAND, source, game);
|
||||||
}
|
}
|
||||||
|
controller.drawCards(1, source, game);
|
||||||
|
controller.gainLife(1, game, source);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,7 @@ public final class GoblinAssault extends CardImpl {
|
||||||
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new CreateTokenEffect(new GoblinToken(true)), TargetController.YOU, false));
|
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new CreateTokenEffect(new GoblinToken(true)), TargetController.YOU, false));
|
||||||
|
|
||||||
// Goblin creatures attack each turn if able.
|
// Goblin creatures attack each turn if able.
|
||||||
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new AttacksIfAbleAllEffect(StaticFilters.FILTER_PERMANENT_CREATURE_GOBLINS, Duration.WhileOnBattlefield)), new AttackedThisTurnWatcher());
|
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new AttacksIfAbleAllEffect(StaticFilters.FILTER_PERMANENT_CREATURE_GOBLINS, Duration.WhileOnBattlefield, true)), new AttackedThisTurnWatcher());
|
||||||
}
|
}
|
||||||
|
|
||||||
private GoblinAssault(final GoblinAssault card) {
|
private GoblinAssault(final GoblinAssault card) {
|
||||||
|
|
|
@ -33,7 +33,7 @@ public final class GrixisCharm extends CardImpl {
|
||||||
this.getSpellAbility().addMode(mode);
|
this.getSpellAbility().addMode(mode);
|
||||||
// or creatures you control get +2/+0 until end of turn.
|
// or creatures you control get +2/+0 until end of turn.
|
||||||
mode = new Mode();
|
mode = new Mode();
|
||||||
mode.addEffect(new BoostControlledEffect(2, 0, Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURE, false));
|
mode.addEffect(new BoostControlledEffect(2, 0, Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES, false));
|
||||||
this.getSpellAbility().addMode(mode);
|
this.getSpellAbility().addMode(mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,36 +1,36 @@
|
||||||
|
|
||||||
package mage.cards.g;
|
package mage.cards.g;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
import mage.abilities.costs.common.SacrificeSourceCost;
|
import mage.abilities.costs.common.SacrificeSourceCost;
|
||||||
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
|
||||||
import mage.abilities.keyword.FlyingAbility;
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
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.constants.SubType;
|
|
||||||
import mage.constants.ComparisonType;
|
import mage.constants.ComparisonType;
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
import mage.constants.Zone;
|
import mage.constants.SubType;
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
import mage.filter.FilterPermanent;
|
||||||
|
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||||
import mage.filter.predicate.mageobject.PowerPredicate;
|
import mage.filter.predicate.mageobject.PowerPredicate;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author North
|
* @author North
|
||||||
*/
|
*/
|
||||||
public final class GustriderExuberant extends CardImpl {
|
public final class GustriderExuberant extends CardImpl {
|
||||||
|
|
||||||
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with power 5 or greater");
|
private static final FilterPermanent filter
|
||||||
|
= new FilterControlledCreaturePermanent("creatures you control with power 5 or greater");
|
||||||
|
|
||||||
static {
|
static {
|
||||||
filter.add(new PowerPredicate(ComparisonType.MORE_THAN, 4));
|
filter.add(new PowerPredicate(ComparisonType.MORE_THAN, 4));
|
||||||
}
|
}
|
||||||
|
|
||||||
public GustriderExuberant(UUID ownerId, CardSetInfo setInfo) {
|
public GustriderExuberant(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}");
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}");
|
||||||
this.subtype.add(SubType.HUMAN);
|
this.subtype.add(SubType.HUMAN);
|
||||||
this.subtype.add(SubType.WIZARD);
|
this.subtype.add(SubType.WIZARD);
|
||||||
|
|
||||||
|
@ -38,9 +38,9 @@ public final class GustriderExuberant extends CardImpl {
|
||||||
this.toughness = new MageInt(2);
|
this.toughness = new MageInt(2);
|
||||||
|
|
||||||
this.addAbility(FlyingAbility.getInstance());
|
this.addAbility(FlyingAbility.getInstance());
|
||||||
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD,
|
this.addAbility(new SimpleActivatedAbility(new GainAbilityAllEffect(
|
||||||
new GainAbilityControlledEffect(FlyingAbility.getInstance(), Duration.EndOfTurn, filter),
|
FlyingAbility.getInstance(), Duration.EndOfTurn, filter
|
||||||
new SacrificeSourceCost()));
|
), new SacrificeSourceCost()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private GustriderExuberant(final GustriderExuberant card) {
|
private GustriderExuberant(final GustriderExuberant card) {
|
||||||
|
|
|
@ -36,7 +36,7 @@ public final class HinderingLight extends CardImpl {
|
||||||
this.getSpellAbility().addEffect(new CounterTargetEffect());
|
this.getSpellAbility().addEffect(new CounterTargetEffect());
|
||||||
this.getSpellAbility().addTarget(new TargetSpell(filter));
|
this.getSpellAbility().addTarget(new TargetSpell(filter));
|
||||||
// Draw a card.
|
// Draw a card.
|
||||||
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1));
|
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("<br>"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private HinderingLight(final HinderingLight card) {
|
private HinderingLight(final HinderingLight card) {
|
||||||
|
|
|
@ -25,7 +25,7 @@ public final class HissingIguanar extends CardImpl {
|
||||||
this.toughness = new MageInt(1);
|
this.toughness = new MageInt(1);
|
||||||
|
|
||||||
// Whenever another creature dies, you may have Hissing Iguanar deal 1 damage to target player.
|
// Whenever another creature dies, you may have Hissing Iguanar deal 1 damage to target player.
|
||||||
DiesCreatureTriggeredAbility ability = new DiesCreatureTriggeredAbility(new DamageTargetEffect(1), true, true);
|
DiesCreatureTriggeredAbility ability = new DiesCreatureTriggeredAbility(new DamageTargetEffect(1).setText("you may have {this} deal 1 damage to target player or planeswalker"), true, true);
|
||||||
ability.addTarget(new TargetPlayerOrPlaneswalker());
|
ability.addTarget(new TargetPlayerOrPlaneswalker());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,7 +79,7 @@ class ImmortalCoilAbility extends StateTriggeredAbility {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getRule() {
|
public String getRule() {
|
||||||
return "When there are no cards in your graveyard, you lose the game";
|
return "When there are no cards in your graveyard, you lose the game.";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ import mage.filter.predicate.mageobject.AnotherPredicate;
|
||||||
*/
|
*/
|
||||||
public final class KederektLeviathan extends CardImpl {
|
public final class KederektLeviathan extends CardImpl {
|
||||||
|
|
||||||
private static final FilterNonlandPermanent filter = new FilterNonlandPermanent("all other nonland permanents");
|
private static final FilterNonlandPermanent filter = new FilterNonlandPermanent("other nonland permanents");
|
||||||
static{
|
static{
|
||||||
filter.add(AnotherPredicate.instance);
|
filter.add(AnotherPredicate.instance);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,38 +1,39 @@
|
||||||
|
|
||||||
package mage.cards.m;
|
package mage.cards.m;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.TriggeredAbilityImpl;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.effects.common.InfoEffect;
|
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||||
|
import mage.abilities.dynamicvalue.DynamicValue;
|
||||||
|
import mage.abilities.effects.Effect;
|
||||||
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
||||||
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.constants.SubType;
|
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
import mage.constants.Zone;
|
import mage.constants.SubType;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.events.GameEvent;
|
|
||||||
import mage.game.stack.Spell;
|
import mage.game.stack.Spell;
|
||||||
import mage.target.targetpointer.FixedTarget;
|
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author Plopman
|
* @author Plopman
|
||||||
*/
|
*/
|
||||||
public final class Manaplasm extends CardImpl {
|
public final class Manaplasm extends CardImpl {
|
||||||
|
|
||||||
public Manaplasm(UUID ownerId, CardSetInfo setInfo) {
|
public Manaplasm(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}");
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}");
|
||||||
this.subtype.add(SubType.OOZE);
|
this.subtype.add(SubType.OOZE);
|
||||||
|
|
||||||
this.power = new MageInt(1);
|
this.power = new MageInt(1);
|
||||||
this.toughness = new MageInt(1);
|
this.toughness = new MageInt(1);
|
||||||
|
|
||||||
// Whenever you cast a spell, Manaplasm gets +X/+X until end of turn, where X is that spell's converted mana cost.
|
// Whenever you cast a spell, Manaplasm gets +X/+X until end of turn, where X is that spell's converted mana cost.
|
||||||
this.addAbility(new ManaplasmAbility());
|
this.addAbility(new SpellCastControllerTriggeredAbility(new BoostSourceEffect(
|
||||||
|
ManaplasmValue.instance, ManaplasmValue.instance,
|
||||||
|
Duration.EndOfTurn, true
|
||||||
|
), false));
|
||||||
}
|
}
|
||||||
|
|
||||||
private Manaplasm(final Manaplasm card) {
|
private Manaplasm(final Manaplasm card) {
|
||||||
|
@ -45,44 +46,26 @@ public final class Manaplasm extends CardImpl {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum ManaplasmValue implements DynamicValue {
|
||||||
|
instance;
|
||||||
|
|
||||||
class ManaplasmAbility extends TriggeredAbilityImpl {
|
@Override
|
||||||
|
public int calculate(Game game, Ability sourceAbility, Effect effect) {
|
||||||
public ManaplasmAbility() {
|
return Optional.of((Spell) effect.getValue("spellCast")).map(Spell::getManaValue).orElse(0);
|
||||||
super(Zone.BATTLEFIELD, new InfoEffect("{this} gets +X/+X until end of turn, where X is that spell's mana value"), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public ManaplasmAbility(final ManaplasmAbility ability) {
|
|
||||||
super(ability);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean checkEventType(GameEvent event, Game game) {
|
public ManaplasmValue copy() {
|
||||||
return event.getType() == GameEvent.EventType.SPELL_CAST;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean checkTrigger(GameEvent event, Game game) {
|
public String getMessage() {
|
||||||
Spell spell = game.getStack().getSpell(event.getTargetId());
|
return "that spell's mana value";
|
||||||
if (spell != null && spell.isControlledBy(controllerId)) {
|
|
||||||
this.getEffects().remove(0);
|
|
||||||
int x = spell.getManaValue();
|
|
||||||
this.addEffect(new BoostSourceEffect(x,x, Duration.EndOfTurn));
|
|
||||||
this.getEffects().get(0).setTargetPointer(new FixedTarget(event.getPlayerId()));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getRule() {
|
public String toString() {
|
||||||
return "Whenever you cast a spell, {this} gets +X/+X until end of turn, where X is that spell's mana value";
|
return "X";
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ManaplasmAbility copy() {
|
|
||||||
return new ManaplasmAbility(this);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,31 +1,23 @@
|
||||||
|
|
||||||
package mage.cards.m;
|
package mage.cards.m;
|
||||||
|
|
||||||
import java.util.UUID;
|
import mage.abilities.common.SpellCastOpponentTriggeredAbility;
|
||||||
import mage.abilities.TriggeredAbilityImpl;
|
import mage.abilities.effects.common.MillCardsTargetEffect;
|
||||||
import mage.abilities.effects.common.PutLibraryIntoGraveTargetEffect;
|
|
||||||
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.constants.Zone;
|
|
||||||
import mage.game.Game;
|
import java.util.UUID;
|
||||||
import mage.game.events.GameEvent;
|
|
||||||
import mage.game.events.GameEvent.EventType;
|
|
||||||
import mage.game.stack.Spell;
|
|
||||||
import mage.target.targetpointer.FixedTarget;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author Plopman
|
* @author Plopman
|
||||||
*/
|
*/
|
||||||
public final class MemoryErosion extends CardImpl {
|
public final class MemoryErosion extends CardImpl {
|
||||||
|
|
||||||
public MemoryErosion(UUID ownerId, CardSetInfo setInfo) {
|
public MemoryErosion(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{U}{U}");
|
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}{U}");
|
||||||
|
|
||||||
|
|
||||||
// Whenever an opponent casts a spell, that player puts the top two cards of their library into their graveyard.
|
// Whenever an opponent casts a spell, that player puts the top two cards of their library into their graveyard.
|
||||||
this.addAbility(new SpellCastTriggeredAbility());
|
this.addAbility(new SpellCastOpponentTriggeredAbility(new MillCardsTargetEffect(2), false));
|
||||||
}
|
}
|
||||||
|
|
||||||
private MemoryErosion(final MemoryErosion card) {
|
private MemoryErosion(final MemoryErosion card) {
|
||||||
|
@ -37,42 +29,3 @@ public final class MemoryErosion extends CardImpl {
|
||||||
return new MemoryErosion(this);
|
return new MemoryErosion(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class SpellCastTriggeredAbility extends TriggeredAbilityImpl {
|
|
||||||
|
|
||||||
public SpellCastTriggeredAbility() {
|
|
||||||
super(Zone.BATTLEFIELD, new PutLibraryIntoGraveTargetEffect(2), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public SpellCastTriggeredAbility(final SpellCastTriggeredAbility ability) {
|
|
||||||
super(ability);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean checkEventType(GameEvent event, Game game) {
|
|
||||||
return event.getType() == GameEvent.EventType.SPELL_CAST;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean checkTrigger(GameEvent event, Game game) {
|
|
||||||
Spell spell = game.getStack().getSpell(event.getTargetId());
|
|
||||||
if (spell != null && game.getOpponents(this.getControllerId()).contains(spell.getControllerId())) {
|
|
||||||
this.getEffects().get(0).setTargetPointer(new FixedTarget(event.getPlayerId()));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getRule() {
|
|
||||||
return "Whenever an opponent casts a spell, that player mills two cards";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SpellCastTriggeredAbility copy() {
|
|
||||||
return new SpellCastTriggeredAbility(this);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,7 +1,5 @@
|
||||||
|
|
||||||
package mage.cards.m;
|
package mage.cards.m;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.BeginningOfEndStepTriggeredAbility;
|
import mage.abilities.common.BeginningOfEndStepTriggeredAbility;
|
||||||
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
|
||||||
|
@ -21,32 +19,31 @@ import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.target.targetpointer.FixedTarget;
|
import mage.target.targetpointer.FixedTarget;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author Plopman
|
* @author Plopman
|
||||||
*/
|
*/
|
||||||
public final class MinionReflector extends CardImpl {
|
public final class MinionReflector extends CardImpl {
|
||||||
|
|
||||||
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nontoken creature");
|
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a nontoken creature");
|
||||||
|
|
||||||
static {
|
static {
|
||||||
filter.add(TokenPredicate.FALSE);
|
filter.add(TokenPredicate.FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public MinionReflector(UUID ownerId, CardSetInfo setInfo) {
|
public MinionReflector(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{5}");
|
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{5}");
|
||||||
|
|
||||||
// Whenever a nontoken creature enters the battlefield under your control, you may pay {2}. If you do, create a token that's a copy of that creature. That token has haste and "At the beginning of the end step, sacrifice this permanent."
|
// Whenever a nontoken creature enters the battlefield under your control, you may pay {2}. If you do, create a token that's a copy of that creature. That token has haste and "At the beginning of the end step, sacrifice this permanent."
|
||||||
Ability ability = new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, new DoIfCostPaid(
|
this.addAbility(new EntersBattlefieldControlledTriggeredAbility(
|
||||||
new MinionReflectorEffect(), new ManaCostsImpl("{2}"),
|
Zone.BATTLEFIELD,
|
||||||
"Pay {2} to create a token that's a copy of that creature that " +
|
new DoIfCostPaid(
|
||||||
"entered the battlefield?"),
|
new MinionReflectorEffect(), new ManaCostsImpl<>("{2}"), "Pay {2} " +
|
||||||
filter, false, SetTargetPointer.PERMANENT,
|
"to create a token that's a copy of that creature that entered the battlefield?"
|
||||||
"Whenever a nontoken creature enters the battlefield under your control, " +
|
),
|
||||||
"you may pay 2. If you do, create a token that's a copy of that creature, " +
|
filter, false, SetTargetPointer.PERMANENT, null
|
||||||
"except it has haste and \"At the beginning of the end step, sacrifice this " +
|
));
|
||||||
"permanent.\"");
|
|
||||||
this.addAbility(ability);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private MinionReflector(final MinionReflector card) {
|
private MinionReflector(final MinionReflector card) {
|
||||||
|
@ -64,7 +61,7 @@ class MinionReflectorEffect extends OneShotEffect {
|
||||||
|
|
||||||
public MinionReflectorEffect() {
|
public MinionReflectorEffect() {
|
||||||
super(Outcome.PutCreatureInPlay);
|
super(Outcome.PutCreatureInPlay);
|
||||||
this.staticText = "create a token that's a copy of that creature, except it has haste and \"At the beginning of the end step, sacrifice this permanent.";
|
this.staticText = "create a token that's a copy of that creature, except it has haste and \"At the beginning of the end step, sacrifice this permanent.\"";
|
||||||
}
|
}
|
||||||
|
|
||||||
public MinionReflectorEffect(final MinionReflectorEffect effect) {
|
public MinionReflectorEffect(final MinionReflectorEffect effect) {
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.q;
|
package mage.cards.q;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.condition.CompoundCondition;
|
import mage.abilities.condition.CompoundCondition;
|
||||||
|
@ -13,27 +12,28 @@ import mage.abilities.effects.common.continuous.CastAsThoughItHadFlashSourceEffe
|
||||||
import mage.abilities.keyword.ReachAbility;
|
import mage.abilities.keyword.ReachAbility;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.*;
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Duration;
|
||||||
|
import mage.constants.SubType;
|
||||||
import mage.filter.common.FilterControlledPermanent;
|
import mage.filter.common.FilterControlledPermanent;
|
||||||
import mage.watchers.common.PlayerAttackedStepWatcher;
|
import mage.watchers.common.PlayerAttackedStepWatcher;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author Plopman
|
* @author Plopman
|
||||||
*/
|
*/
|
||||||
public final class QasaliAmbusher extends CardImpl {
|
public final class QasaliAmbusher extends CardImpl {
|
||||||
|
|
||||||
private static final FilterControlledPermanent filterForest = new FilterControlledPermanent();
|
private static final FilterControlledPermanent filterForest = new FilterControlledPermanent(SubType.FOREST);
|
||||||
private static final FilterControlledPermanent filterPlains = new FilterControlledPermanent();
|
private static final FilterControlledPermanent filterPlains = new FilterControlledPermanent(SubType.PLAINS);
|
||||||
|
|
||||||
static {
|
private static final Condition condition = new CompoundCondition(
|
||||||
filterForest.add(SubType.FOREST.getPredicate());
|
"If a creature is attacking you and you control a Forest and a Plains",
|
||||||
filterPlains.add(SubType.PLAINS.getPredicate());
|
AttackedThisStepCondition.instance,
|
||||||
}
|
new PermanentsOnTheBattlefieldCondition(filterForest),
|
||||||
|
new PermanentsOnTheBattlefieldCondition(filterPlains)
|
||||||
private static final Condition condition =
|
);
|
||||||
new CompoundCondition("If a creature is attacking you and you control a Forest and a Plains",
|
|
||||||
AttackedThisStepCondition.instance, new PermanentsOnTheBattlefieldCondition(filterForest), new PermanentsOnTheBattlefieldCondition(filterPlains));
|
|
||||||
|
|
||||||
public QasaliAmbusher(UUID ownerId, CardSetInfo setInfo) {
|
public QasaliAmbusher(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}{W}");
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}{W}");
|
||||||
|
@ -48,11 +48,14 @@ public final class QasaliAmbusher extends CardImpl {
|
||||||
|
|
||||||
// If a creature is attacking you and you control a Forest and a Plains,
|
// If a creature is attacking you and you control a Forest and a Plains,
|
||||||
// you may cast Qasali Ambusher without paying its mana cost and as though it had flash.
|
// you may cast Qasali Ambusher without paying its mana cost and as though it had flash.
|
||||||
Ability ability = new AlternativeCostSourceAbility(null, condition);
|
Ability ability = new AlternativeCostSourceAbility(
|
||||||
ability.addEffect(new ConditionalAsThoughEffect(new CastAsThoughItHadFlashSourceEffect(Duration.EndOfGame), condition)
|
null, condition, "if a creature is attacking you and you control a Forest and a Plains, " +
|
||||||
.setText("you may cast {this} without paying its mana cost and as though it had flash"));
|
"you may cast {this} without paying its mana cost and as though it had flash."
|
||||||
ability.addWatcher(new PlayerAttackedStepWatcher());
|
);
|
||||||
this.addAbility(ability);
|
ability.addEffect(new ConditionalAsThoughEffect(
|
||||||
|
new CastAsThoughItHadFlashSourceEffect(Duration.EndOfGame), condition
|
||||||
|
));
|
||||||
|
this.addAbility(ability, new PlayerAttackedStepWatcher());
|
||||||
}
|
}
|
||||||
|
|
||||||
private QasaliAmbusher(final QasaliAmbusher card) {
|
private QasaliAmbusher(final QasaliAmbusher card) {
|
||||||
|
|
|
@ -31,7 +31,7 @@ public final class QuietusSpike extends CardImpl {
|
||||||
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(DeathtouchAbility.getInstance(), AttachmentType.EQUIPMENT)));
|
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(DeathtouchAbility.getInstance(), AttachmentType.EQUIPMENT)));
|
||||||
|
|
||||||
// Whenever equipped creature deals combat damage to a player, that player loses half their life, rounded up.
|
// Whenever equipped creature deals combat damage to a player, that player loses half their life, rounded up.
|
||||||
this.addAbility(new DealsDamageToAPlayerAttachedTriggeredAbility(new LoseHalfLifeTargetEffect(), "equipped", false, true));
|
this.addAbility(new DealsDamageToAPlayerAttachedTriggeredAbility(new LoseHalfLifeTargetEffect(), "equipped creature", false, true));
|
||||||
|
|
||||||
// Equip {3}
|
// Equip {3}
|
||||||
this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(3)));
|
this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(3)));
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
|
|
||||||
package mage.cards.r;
|
package mage.cards.r;
|
||||||
|
|
||||||
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;
|
||||||
|
@ -13,23 +11,24 @@ import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.constants.Zone;
|
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
import mage.filter.common.FilterCreaturePermanent;
|
||||||
import mage.filter.predicate.mageobject.AbilityPredicate;
|
import mage.filter.predicate.mageobject.AbilityPredicate;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author Plopman
|
* @author Plopman
|
||||||
*/
|
*/
|
||||||
public final class RockcasterPlatoon extends CardImpl {
|
public final class RockcasterPlatoon extends CardImpl {
|
||||||
|
|
||||||
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with flying");
|
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with flying");
|
||||||
|
|
||||||
static {
|
static {
|
||||||
filter.add(new AbilityPredicate(FlyingAbility.class));
|
filter.add(new AbilityPredicate(FlyingAbility.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
public RockcasterPlatoon(UUID ownerId, CardSetInfo setInfo) {
|
public RockcasterPlatoon(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{W}{W}");
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{W}{W}");
|
||||||
this.subtype.add(SubType.RHINO);
|
this.subtype.add(SubType.RHINO);
|
||||||
this.subtype.add(SubType.SOLDIER);
|
this.subtype.add(SubType.SOLDIER);
|
||||||
|
|
||||||
|
@ -37,8 +36,8 @@ public final class RockcasterPlatoon extends CardImpl {
|
||||||
this.toughness = new MageInt(7);
|
this.toughness = new MageInt(7);
|
||||||
|
|
||||||
// {4}{G}: Rockcaster Platoon deals 2 damage to each creature with flying and each player.
|
// {4}{G}: Rockcaster Platoon deals 2 damage to each creature with flying and each player.
|
||||||
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageAllEffect(2, filter), new ManaCostsImpl("{4}{G}"));
|
Ability ability = new SimpleActivatedAbility(new DamageAllEffect(2, filter), new ManaCostsImpl<>("{4}{G}"));
|
||||||
ability.addEffect(new DamagePlayersEffect(2));
|
ability.addEffect(new DamagePlayersEffect(2).setText("and each player"));
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
|
|
||||||
package mage.cards.s;
|
package mage.cards.s;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.effects.common.continuous.BoostTargetEffect;
|
import mage.abilities.effects.common.continuous.BoostTargetEffect;
|
||||||
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
|
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
|
||||||
import mage.abilities.keyword.DoubleStrikeAbility;
|
import mage.abilities.keyword.DoubleStrikeAbility;
|
||||||
|
@ -11,19 +9,23 @@ import mage.constants.CardType;
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author North
|
* @author North
|
||||||
*/
|
*/
|
||||||
public final class SangriteSurge extends CardImpl {
|
public final class SangriteSurge extends CardImpl {
|
||||||
|
|
||||||
public SangriteSurge(UUID ownerId, CardSetInfo setInfo) {
|
public SangriteSurge(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{4}{R}{G}");
|
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{R}{G}");
|
||||||
|
|
||||||
|
|
||||||
// Target creature gets +3/+3 and gains double strike until end of turn.
|
// Target creature gets +3/+3 and gains double strike until end of turn.
|
||||||
this.getSpellAbility().addEffect(new BoostTargetEffect(3, 3, Duration.EndOfTurn));
|
this.getSpellAbility().addEffect(new BoostTargetEffect(
|
||||||
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(DoubleStrikeAbility.getInstance(), Duration.EndOfTurn));
|
3, 3, Duration.EndOfTurn
|
||||||
|
).setText("target creature gets +3/+3"));
|
||||||
|
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(
|
||||||
|
DoubleStrikeAbility.getInstance(), Duration.EndOfTurn
|
||||||
|
).setText("and gains double strike until end of turn"));
|
||||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,8 +26,6 @@ import java.util.UUID;
|
||||||
*/
|
*/
|
||||||
public final class SarkhanVol extends CardImpl {
|
public final class SarkhanVol extends CardImpl {
|
||||||
|
|
||||||
private static DragonToken dragonToken = new DragonToken();
|
|
||||||
|
|
||||||
public SarkhanVol(UUID ownerId, CardSetInfo setInfo) {
|
public SarkhanVol(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{R}{G}");
|
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{R}{G}");
|
||||||
this.addSuperType(SuperType.LEGENDARY);
|
this.addSuperType(SuperType.LEGENDARY);
|
||||||
|
@ -36,20 +34,26 @@ public final class SarkhanVol extends CardImpl {
|
||||||
this.setStartingLoyalty(4);
|
this.setStartingLoyalty(4);
|
||||||
|
|
||||||
// +1: Creatures you control get +1/+1 and gain haste until end of turn.
|
// +1: Creatures you control get +1/+1 and gain haste until end of turn.
|
||||||
Effects effects1 = new Effects();
|
Effects effects1 = new Effects(new BoostControlledEffect(
|
||||||
effects1.add(new BoostControlledEffect(1, 1, Duration.EndOfTurn));
|
1, 1, Duration.EndOfTurn
|
||||||
effects1.add(new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES));
|
).setText("creatures you control get +1/+1"));
|
||||||
|
effects1.add(new GainAbilityControlledEffect(
|
||||||
|
HasteAbility.getInstance(), Duration.EndOfTurn,
|
||||||
|
StaticFilters.FILTER_PERMANENT_CREATURES
|
||||||
|
).setText("and gain haste until end of turn"));
|
||||||
this.addAbility(new LoyaltyAbility(effects1, 1));
|
this.addAbility(new LoyaltyAbility(effects1, 1));
|
||||||
|
|
||||||
// -2: Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn.
|
// -2: Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn.
|
||||||
LoyaltyAbility ability = new LoyaltyAbility(new GainControlTargetEffect(Duration.EndOfTurn), -2);
|
LoyaltyAbility ability = new LoyaltyAbility(new GainControlTargetEffect(Duration.EndOfTurn), -2);
|
||||||
ability.addEffect(new UntapTargetEffect().setText("Untap that creature"));
|
ability.addEffect(new UntapTargetEffect().setText("Untap that creature"));
|
||||||
ability.addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn));
|
ability.addEffect(new GainAbilityTargetEffect(
|
||||||
|
HasteAbility.getInstance(), Duration.EndOfTurn
|
||||||
|
).setText("It gains haste until end of turn"));
|
||||||
ability.addTarget(new TargetCreaturePermanent());
|
ability.addTarget(new TargetCreaturePermanent());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
|
|
||||||
// -6: Create five 4/4 red Dragon creature tokens with flying.
|
// -6: Create five 4/4 red Dragon creature tokens with flying.
|
||||||
this.addAbility(new LoyaltyAbility(new CreateTokenEffect(dragonToken, 5), -6));
|
this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new DragonToken(), 5), -6));
|
||||||
}
|
}
|
||||||
|
|
||||||
private SarkhanVol(final SarkhanVol card) {
|
private SarkhanVol(final SarkhanVol card) {
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
|
|
||||||
|
|
||||||
package mage.cards.s;
|
package mage.cards.s;
|
||||||
|
|
||||||
import java.util.UUID;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
import mage.abilities.effects.common.AttachEffect;
|
import mage.abilities.effects.common.AttachEffect;
|
||||||
|
@ -13,23 +11,19 @@ import mage.abilities.keyword.EnchantAbility;
|
||||||
import mage.abilities.keyword.TrampleAbility;
|
import mage.abilities.keyword.TrampleAbility;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.AttachmentType;
|
import mage.constants.*;
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.constants.Duration;
|
|
||||||
import mage.constants.Outcome;
|
|
||||||
import mage.constants.Zone;
|
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author Loki
|
* @author Loki
|
||||||
*/
|
*/
|
||||||
public final class SavageHunger extends CardImpl {
|
public final class SavageHunger extends CardImpl {
|
||||||
|
|
||||||
public SavageHunger (UUID ownerId, CardSetInfo setInfo) {
|
public SavageHunger(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{G}");
|
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}");
|
||||||
this.subtype.add(SubType.AURA);
|
this.subtype.add(SubType.AURA);
|
||||||
|
|
||||||
|
|
||||||
|
@ -38,13 +32,17 @@ public final class SavageHunger extends CardImpl {
|
||||||
this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
|
this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
|
||||||
this.addAbility(new EnchantAbility(auraTarget.getTargetName()));
|
this.addAbility(new EnchantAbility(auraTarget.getTargetName()));
|
||||||
|
|
||||||
SimpleStaticAbility ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 0, Duration.WhileOnBattlefield));
|
Ability ability = new SimpleStaticAbility(new BoostEnchantedEffect(
|
||||||
ability.addEffect(new GainAbilityAttachedEffect(TrampleAbility.getInstance(), AttachmentType.AURA));
|
1, 0, Duration.WhileOnBattlefield
|
||||||
|
));
|
||||||
|
ability.addEffect(new GainAbilityAttachedEffect(
|
||||||
|
TrampleAbility.getInstance(), AttachmentType.AURA
|
||||||
|
).setText("and has trample"));
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
this.addAbility(new CyclingAbility(new ManaCostsImpl("{2}")));
|
this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{2}")));
|
||||||
}
|
}
|
||||||
|
|
||||||
public SavageHunger (final SavageHunger card) {
|
public SavageHunger(final SavageHunger card) {
|
||||||
super(card);
|
super(card);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ public final class TortoiseFormation extends CardImpl {
|
||||||
// Creatures you control gain shroud until end of turn.
|
// Creatures you control gain shroud until end of turn.
|
||||||
this.getSpellAbility().addEffect(new GainAbilityControlledEffect(
|
this.getSpellAbility().addEffect(new GainAbilityControlledEffect(
|
||||||
ShroudAbility.getInstance(), Duration.EndOfTurn,
|
ShroudAbility.getInstance(), Duration.EndOfTurn,
|
||||||
StaticFilters.FILTER_CONTROLLED_CREATURES
|
StaticFilters.FILTER_PERMANENT_CREATURES
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
|
|
||||||
package mage.cards.v;
|
package mage.cards.v;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.DiesCreatureTriggeredAbility;
|
import mage.abilities.common.DiesCreatureTriggeredAbility;
|
||||||
import mage.abilities.dynamicvalue.common.CardsInTargetHandCount;
|
import mage.abilities.dynamicvalue.common.CardsInTargetHandCount;
|
||||||
|
@ -11,18 +9,19 @@ import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.target.TargetPlayer;
|
import mage.target.TargetPlayer;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author Plopman
|
* @author Plopman
|
||||||
*/
|
*/
|
||||||
public final class ViciousShadows extends CardImpl {
|
public final class ViciousShadows extends CardImpl {
|
||||||
|
|
||||||
public ViciousShadows(UUID ownerId, CardSetInfo setInfo) {
|
public ViciousShadows(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{6}{R}");
|
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{6}{R}");
|
||||||
|
|
||||||
|
|
||||||
// Whenever a creature dies, you may have Vicious Shadows deal damage to target player equal to the number of cards in that player's hand.
|
// Whenever a creature dies, you may have Vicious Shadows deal damage to target player equal to the number of cards in that player's hand.
|
||||||
Ability ability = new DiesCreatureTriggeredAbility(new DamageTargetEffect(CardsInTargetHandCount.instance), true);
|
Ability ability = new DiesCreatureTriggeredAbility(new DamageTargetEffect(CardsInTargetHandCount.instance)
|
||||||
|
.setText("you may have {this} deal damage to target player equal to the number of cards in that player's hand"), true);
|
||||||
ability.addTarget(new TargetPlayer());
|
ability.addTarget(new TargetPlayer());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,30 +1,28 @@
|
||||||
|
|
||||||
|
|
||||||
package mage.cards.v;
|
package mage.cards.v;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||||
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.FilterPermanent;
|
import mage.filter.StaticFilters;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author Loki
|
* @author Loki
|
||||||
*/
|
*/
|
||||||
public final class ViolentUltimatum extends CardImpl {
|
public final class ViolentUltimatum extends CardImpl {
|
||||||
|
|
||||||
public ViolentUltimatum (UUID ownerId, CardSetInfo setInfo) {
|
public ViolentUltimatum(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{B}{B}{R}{R}{R}{G}{G}");
|
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{B}{B}{R}{R}{R}{G}{G}");
|
||||||
|
|
||||||
|
|
||||||
this.getSpellAbility().addEffect(new DestroyTargetEffect());
|
this.getSpellAbility().addEffect(new DestroyTargetEffect());
|
||||||
this.getSpellAbility().addTarget(new TargetPermanent(3, 3, new FilterPermanent(), false));
|
this.getSpellAbility().addTarget(new TargetPermanent(3, StaticFilters.FILTER_PERMANENTS));
|
||||||
}
|
}
|
||||||
|
|
||||||
public ViolentUltimatum (final ViolentUltimatum card) {
|
public ViolentUltimatum(final ViolentUltimatum card) {
|
||||||
super(card);
|
super(card);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
|
|
||||||
package mage.cards.w;
|
package mage.cards.w;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
|
@ -11,18 +9,19 @@ import mage.abilities.keyword.FlyingAbility;
|
||||||
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.constants.SubType;
|
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
|
import mage.constants.SubType;
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author North
|
* @author North
|
||||||
*/
|
*/
|
||||||
public final class WelkinGuide extends CardImpl {
|
public final class WelkinGuide extends CardImpl {
|
||||||
|
|
||||||
public WelkinGuide(UUID ownerId, CardSetInfo setInfo) {
|
public WelkinGuide(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{W}");
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}");
|
||||||
this.subtype.add(SubType.BIRD);
|
this.subtype.add(SubType.BIRD);
|
||||||
this.subtype.add(SubType.CLERIC);
|
this.subtype.add(SubType.CLERIC);
|
||||||
|
|
||||||
|
@ -30,8 +29,12 @@ public final class WelkinGuide extends CardImpl {
|
||||||
this.toughness = new MageInt(2);
|
this.toughness = new MageInt(2);
|
||||||
|
|
||||||
this.addAbility(FlyingAbility.getInstance());
|
this.addAbility(FlyingAbility.getInstance());
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(new BoostTargetEffect(2, 2, Duration.EndOfTurn), false);
|
Ability ability = new EntersBattlefieldTriggeredAbility(new BoostTargetEffect(
|
||||||
ability.addEffect(new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn));
|
2, 2, Duration.EndOfTurn
|
||||||
|
).setText("target creature gets +2/+2"), false);
|
||||||
|
ability.addEffect(new GainAbilityTargetEffect(
|
||||||
|
FlyingAbility.getInstance(), Duration.EndOfTurn
|
||||||
|
).setText("and gains flying until end of turn"));
|
||||||
ability.addTarget(new TargetCreaturePermanent());
|
ability.addTarget(new TargetCreaturePermanent());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ import mage.target.common.TargetAnyTarget;
|
||||||
*/
|
*/
|
||||||
public final class WhereAncientsTread extends CardImpl {
|
public final class WhereAncientsTread extends CardImpl {
|
||||||
|
|
||||||
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with power 5 or greater");
|
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a creature with power 5 or greater");
|
||||||
static {
|
static {
|
||||||
filter.add(new PowerPredicate(ComparisonType.MORE_THAN, 4));
|
filter.add(new PowerPredicate(ComparisonType.MORE_THAN, 4));
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ import mage.target.common.TargetAnyTarget;
|
||||||
|
|
||||||
|
|
||||||
// Whenever a creature with power 5 or greater enters the battlefield under your control, you may have Where Ancients Tread deal 5 damage to any target.
|
// Whenever a creature with power 5 or greater enters the battlefield under your control, you may have Where Ancients Tread deal 5 damage to any target.
|
||||||
Ability ability = new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, new DamageTargetEffect(5), filter, true);
|
Ability ability = new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, new DamageTargetEffect(5).setText("you may have {this} deal 5 damage to any target"), filter, true);
|
||||||
ability.addTarget(new TargetAnyTarget());
|
ability.addTarget(new TargetAnyTarget());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,7 +62,7 @@ public class VerifyCardDataTest {
|
||||||
|
|
||||||
private static final Logger logger = Logger.getLogger(VerifyCardDataTest.class);
|
private static final Logger logger = Logger.getLogger(VerifyCardDataTest.class);
|
||||||
|
|
||||||
private static final String FULL_ABILITIES_CHECK_SET_CODE = "KHC"; // check all abilities and output cards with wrong abilities texts;
|
private static final String FULL_ABILITIES_CHECK_SET_CODE = "ALA"; // check all abilities and output cards with wrong abilities texts;
|
||||||
private static final boolean AUTO_FIX_SAMPLE_DECKS = false; // debug only: auto-fix sample decks by test_checkSampleDecks test run
|
private static final boolean AUTO_FIX_SAMPLE_DECKS = false; // debug only: auto-fix sample decks by test_checkSampleDecks test run
|
||||||
private static final boolean ONLY_TEXT = false; // use when checking text locally, suppresses unnecessary checks and output messages
|
private static final boolean ONLY_TEXT = false; // use when checking text locally, suppresses unnecessary checks and output messages
|
||||||
|
|
||||||
|
|
|
@ -118,11 +118,12 @@ public class CreateTokenEffect extends OneShotEffect {
|
||||||
}
|
}
|
||||||
StringBuilder sb = new StringBuilder("create ");
|
StringBuilder sb = new StringBuilder("create ");
|
||||||
if (amount.toString().equals("1")) {
|
if (amount.toString().equals("1")) {
|
||||||
sb.append("a ");
|
|
||||||
if (tapped && !attacking) {
|
if (tapped && !attacking) {
|
||||||
sb.append("tapped ");
|
sb.append("a tapped ");
|
||||||
}
|
|
||||||
sb.append(token.getDescription());
|
sb.append(token.getDescription());
|
||||||
|
} else {
|
||||||
|
sb.append(CardUtil.addArticle(token.getDescription()));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
sb.append(CardUtil.numberToText(amount.toString())).append(' ');
|
sb.append(CardUtil.numberToText(amount.toString())).append(' ');
|
||||||
if (tapped && !attacking) {
|
if (tapped && !attacking) {
|
||||||
|
|
|
@ -1,26 +1,23 @@
|
||||||
|
|
||||||
|
|
||||||
package mage.abilities.effects.common;
|
package mage.abilities.effects.common;
|
||||||
|
|
||||||
import mage.constants.Outcome;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
|
import mage.constants.Outcome;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author BetaSteward_at_googlemail.com
|
* @author BetaSteward_at_googlemail.com
|
||||||
*/
|
*/
|
||||||
public class DestroyAllControlledTargetEffect extends OneShotEffect {
|
public class DestroyAllControlledTargetEffect extends OneShotEffect {
|
||||||
|
|
||||||
private FilterPermanent filter;
|
private final FilterPermanent filter;
|
||||||
|
|
||||||
public DestroyAllControlledTargetEffect(FilterPermanent filter) {
|
public DestroyAllControlledTargetEffect(FilterPermanent filter) {
|
||||||
super(Outcome.DestroyPermanent);
|
super(Outcome.DestroyPermanent);
|
||||||
this.filter = filter;
|
this.filter = filter;
|
||||||
staticText = "Destroy all " + filter.getMessage() + " controlled by target player";
|
staticText = "Destroy all " + filter.getMessage() + " target player controls";
|
||||||
}
|
}
|
||||||
|
|
||||||
public DestroyAllControlledTargetEffect(final DestroyAllControlledTargetEffect effect) {
|
public DestroyAllControlledTargetEffect(final DestroyAllControlledTargetEffect effect) {
|
||||||
|
@ -35,10 +32,9 @@ public class DestroyAllControlledTargetEffect extends OneShotEffect {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(Game game, Ability source) {
|
public boolean apply(Game game, Ability source) {
|
||||||
for (Permanent permanent: game.getBattlefield().getAllActivePermanents(filter, source.getFirstTarget(), game)) {
|
for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, source.getFirstTarget(), game)) {
|
||||||
permanent.destroy(source, game, false);
|
permanent.destroy(source, game, false);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,8 @@ public class MayTapOrUntapTargetEffect extends OneShotEffect {
|
||||||
if (mode.getTargets().isEmpty()) {
|
if (mode.getTargets().isEmpty()) {
|
||||||
return "you may tap or untap it";
|
return "you may tap or untap it";
|
||||||
} else {
|
} else {
|
||||||
return "you may tap or untap target " + mode.getTargets().get(0).getTargetName();
|
String targetName = mode.getTargets().get(0).getTargetName();
|
||||||
|
return "you may tap or untap " + (targetName.contains("target") ? "" : "target ") + targetName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,11 +51,12 @@ public class MillCardsTargetEffect extends OneShotEffect {
|
||||||
if (staticText != null && !staticText.isEmpty()) {
|
if (staticText != null && !staticText.isEmpty()) {
|
||||||
return staticText;
|
return staticText;
|
||||||
}
|
}
|
||||||
StringBuilder sb = new StringBuilder("target ");
|
StringBuilder sb = new StringBuilder();
|
||||||
if (!mode.getTargets().isEmpty()) {
|
if (!mode.getTargets().isEmpty()) {
|
||||||
|
sb.append("target ");
|
||||||
sb.append(mode.getTargets().get(0).getTargetName());
|
sb.append(mode.getTargets().get(0).getTargetName());
|
||||||
} else {
|
} else {
|
||||||
sb.append("player");
|
sb.append("that player");
|
||||||
}
|
}
|
||||||
sb.append(" mills ");
|
sb.append(" mills ");
|
||||||
if (numberCards.toString().equals("1")) {
|
if (numberCards.toString().equals("1")) {
|
||||||
|
|
|
@ -24,7 +24,7 @@ public class ReturnToHandFromBattlefieldAllEffect extends OneShotEffect {
|
||||||
public ReturnToHandFromBattlefieldAllEffect(FilterPermanent filter) {
|
public ReturnToHandFromBattlefieldAllEffect(FilterPermanent filter) {
|
||||||
super(Outcome.ReturnToHand);
|
super(Outcome.ReturnToHand);
|
||||||
this.filter = filter;
|
this.filter = filter;
|
||||||
staticText = "Return all " + filter.getMessage() + " to their owners' hands";
|
staticText = "return all " + filter.getMessage() + " to their owners' hands";
|
||||||
}
|
}
|
||||||
|
|
||||||
public ReturnToHandFromBattlefieldAllEffect(final ReturnToHandFromBattlefieldAllEffect effect) {
|
public ReturnToHandFromBattlefieldAllEffect(final ReturnToHandFromBattlefieldAllEffect effect) {
|
||||||
|
|
|
@ -13,7 +13,7 @@ import mage.abilities.keyword.FlyingAbility;
|
||||||
public final class ThopterToken extends TokenImpl {
|
public final class ThopterToken extends TokenImpl {
|
||||||
|
|
||||||
public ThopterToken() {
|
public ThopterToken() {
|
||||||
super("Thopter", "1/1 blue Thopter artifact creature tokens with flying");
|
super("Thopter", "1/1 blue Thopter artifact creature token with flying");
|
||||||
cardType.add(CardType.CREATURE);
|
cardType.add(CardType.CREATURE);
|
||||||
cardType.add(CardType.ARTIFACT);
|
cardType.add(CardType.ARTIFACT);
|
||||||
color.setBlue(true);
|
color.setBlue(true);
|
||||||
|
|
|
@ -948,7 +948,7 @@ public final class CardUtil {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final String vowels = "aeiouAEIOU";
|
private static final String vowels = "aeiouAEIOU8";
|
||||||
|
|
||||||
public static String addArticle(String text) {
|
public static String addArticle(String text) {
|
||||||
if (text.startsWith("a ")
|
if (text.startsWith("a ")
|
||||||
|
|
Loading…
Reference in a new issue