mirror of
https://github.com/correl/mage.git
synced 2024-11-24 19:19:56 +00:00
[FUT] various text fixes
This commit is contained in:
parent
27338dc620
commit
ca9b2ea135
24 changed files with 106 additions and 225 deletions
|
@ -30,7 +30,7 @@ public final class ChronomanticEscape extends CardImpl {
|
||||||
getSpellAbility().addEffect(new CantAttackYouAllEffect(Duration.UntilYourNextTurn, StaticFilters.FILTER_PERMANENT_CREATURES));
|
getSpellAbility().addEffect(new CantAttackYouAllEffect(Duration.UntilYourNextTurn, StaticFilters.FILTER_PERMANENT_CREATURES));
|
||||||
getSpellAbility().addEffect(new ExileSpellEffect());
|
getSpellAbility().addEffect(new ExileSpellEffect());
|
||||||
Effect effect = new AddCountersSourceEffect(CounterType.TIME.createInstance(), StaticValue.get(3), true, true);
|
Effect effect = new AddCountersSourceEffect(CounterType.TIME.createInstance(), StaticValue.get(3), true, true);
|
||||||
effect.setText("with 3 time counters on it");
|
effect.setText("with three time counters on it");
|
||||||
getSpellAbility().addEffect(effect);
|
getSpellAbility().addEffect(effect);
|
||||||
|
|
||||||
// Suspend 3-{2}{W}
|
// Suspend 3-{2}{W}
|
||||||
|
|
|
@ -30,7 +30,7 @@ public final class CyclicalEvolution extends CardImpl {
|
||||||
getSpellAbility().addTarget(new TargetCreaturePermanent());
|
getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||||
getSpellAbility().addEffect(new ExileSpellEffect());
|
getSpellAbility().addEffect(new ExileSpellEffect());
|
||||||
Effect effect = new AddCountersSourceEffect(CounterType.TIME.createInstance(), StaticValue.get(3), true, true);
|
Effect effect = new AddCountersSourceEffect(CounterType.TIME.createInstance(), StaticValue.get(3), true, true);
|
||||||
effect.setText("with 3 time counters on it");
|
effect.setText("with three time counters on it");
|
||||||
getSpellAbility().addEffect(effect);
|
getSpellAbility().addEffect(effect);
|
||||||
|
|
||||||
// Suspend 3-{2}{G}
|
// Suspend 3-{2}{G}
|
||||||
|
|
|
@ -1,32 +1,23 @@
|
||||||
|
|
||||||
package mage.cards.d;
|
package mage.cards.d;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageObject;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.Mode;
|
import mage.abilities.Mode;
|
||||||
import mage.abilities.effects.Effect;
|
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.cards.Card;
|
import mage.cards.Card;
|
||||||
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.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.counters.Counter;
|
|
||||||
import mage.counters.CounterType;
|
import mage.counters.CounterType;
|
||||||
import mage.filter.Filter;
|
import mage.filter.StaticFilters;
|
||||||
import mage.filter.FilterCard;
|
import mage.filter.common.FilterPermanentOrSuspendedCard;
|
||||||
import mage.filter.FilterPermanent;
|
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.players.Player;
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
* @author TheElk801
|
||||||
* @author Gal Lerman
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public final class DustOfMoments extends CardImpl {
|
public final class DustOfMoments extends CardImpl {
|
||||||
|
|
||||||
|
@ -34,11 +25,10 @@ public final class DustOfMoments extends CardImpl {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{W}");
|
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{W}");
|
||||||
|
|
||||||
// Choose one - Remove two time counters from each permanent and each suspended card
|
// Choose one - Remove two time counters from each permanent and each suspended card
|
||||||
this.getSpellAbility().addEffect(new RemoveCountersEffect());
|
this.getSpellAbility().addEffect(new DustOfMomentsEffect(true));
|
||||||
|
|
||||||
// Or put two time counters on each permanent with a time counter on it and each suspended card
|
// Or put two time counters on each permanent with a time counter on it and each suspended card
|
||||||
Mode mode = new Mode(new AddCountersEffect());
|
this.getSpellAbility().addMode(new Mode(new DustOfMomentsEffect(false)));
|
||||||
this.getSpellAbility().addMode(mode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private DustOfMoments(final DustOfMoments card) {
|
private DustOfMoments(final DustOfMoments card) {
|
||||||
|
@ -49,173 +39,60 @@ public final class DustOfMoments extends CardImpl {
|
||||||
public DustOfMoments copy() {
|
public DustOfMoments copy() {
|
||||||
return new DustOfMoments(this);
|
return new DustOfMoments(this);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//TODO: PermanentImpl.getCounters() and CardImpl.getCounters(game) don't return the same value for the same Card
|
class DustOfMomentsEffect extends OneShotEffect {
|
||||||
//TODO: This means I can't use a Card generic for Permanents and Exiled cards and use Card.getCounters(game)
|
|
||||||
//TODO: This is the reason i've copy pasted some logic in DustOfMomentsEffect
|
|
||||||
//TODO: After this issue is fixed/explained i'll refactor the code
|
|
||||||
public abstract static class DustOfMomentsEffect extends OneShotEffect {
|
|
||||||
|
|
||||||
private final Counter counter;
|
private static final FilterPermanentOrSuspendedCard filter = new FilterPermanentOrSuspendedCard();
|
||||||
private final Filter<Permanent> permFilter;
|
private final boolean remove;
|
||||||
private final Filter<Card> exiledFilter;
|
|
||||||
|
|
||||||
public DustOfMomentsEffect() {
|
DustOfMomentsEffect(boolean remove) {
|
||||||
super(Outcome.Benefit);
|
super(Outcome.Benefit);
|
||||||
this.counter = new Counter(CounterType.TIME.getName(), 2);
|
this.remove = remove;
|
||||||
this.permFilter = new FilterPermanent("permanent and each suspended card");
|
}
|
||||||
permFilter.add(CounterType.TIME.getPredicate());
|
|
||||||
|
|
||||||
this.exiledFilter = new FilterCard("permanent and each suspended card");
|
private DustOfMomentsEffect(final DustOfMomentsEffect effect) {
|
||||||
exiledFilter.add(CounterType.TIME.getPredicate());
|
super(effect);
|
||||||
setText();
|
this.remove = effect.remove;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DustOfMomentsEffect(final DustOfMomentsEffect effect) {
|
@Override
|
||||||
super(effect);
|
public DustOfMomentsEffect copy() {
|
||||||
this.counter = effect.counter.copy();
|
return new DustOfMomentsEffect(this);
|
||||||
this.permFilter = effect.permFilter.copy();
|
}
|
||||||
this.exiledFilter = effect.exiledFilter.copy();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(Game game, Ability source) {
|
public boolean apply(Game game, Ability source) {
|
||||||
Player controller = game.getPlayer(source.getControllerId());
|
for (Permanent permanent : game.getBattlefield().getActivePermanents(
|
||||||
MageObject sourceObject = game.getObject(source);
|
remove ? StaticFilters.FILTER_PERMANENT : filter.getPermanentFilter(),
|
||||||
if (controller != null && sourceObject != null) {
|
source.getControllerId(), source, game
|
||||||
updatePermanents(source, game, controller, sourceObject);
|
)) {
|
||||||
updateSuspended(source, game, controller, sourceObject);
|
if (remove) {
|
||||||
return true;
|
permanent.removeCounters(CounterType.TIME.createInstance(2), source, game);
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateSuspended(final Ability source, final Game game, final Player controller, final MageObject sourceObject) {
|
|
||||||
final List<Card> exiledCards = game.getExile().getAllCards(game);
|
|
||||||
execute(source, game, controller, sourceObject, exiledCards);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updatePermanents(final Ability source, final Game game, final Player controller, final MageObject sourceObject) {
|
|
||||||
List<Permanent> permanents = game.getBattlefield().getAllActivePermanents();
|
|
||||||
executeP(source, game, controller, sourceObject, permanents);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void executeP(final Ability source, final Game game, final Player controller, final MageObject sourceObject, final List<Permanent> cards) {
|
|
||||||
if (cards == null || cards.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (Permanent card : cards) {
|
|
||||||
if (permFilter.match(card, game)) {
|
|
||||||
final String counterName = counter.getName();
|
|
||||||
if (shouldRemoveCounters()) {
|
|
||||||
final Counter existingCounterOfSameType = card.getCounters(game).get(counterName);
|
|
||||||
final int countersToRemove = Math.min(existingCounterOfSameType.getCount(), counter.getCount());
|
|
||||||
final Counter modifiedCounter = new Counter(counterName, countersToRemove);
|
|
||||||
card.removeCounters(modifiedCounter, source, game);
|
|
||||||
} else {
|
|
||||||
card.addCounters(counter, source.getControllerId(), source, game);
|
|
||||||
}
|
|
||||||
if (!game.isSimulation()) {
|
|
||||||
game.informPlayers(sourceObject.getName() + ": " +
|
|
||||||
controller.getLogName() + getActionStr() + 's' +
|
|
||||||
counter.getCount() + ' ' + counterName.toLowerCase(Locale.ENGLISH) +
|
|
||||||
" counter on " + card.getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void execute(final Ability source, final Game game, final Player controller, final MageObject sourceObject, final List<Card> cards) {
|
|
||||||
if (cards == null || cards.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (Card card : cards) {
|
|
||||||
if (exiledFilter.match(card, game)) {
|
|
||||||
final String counterName = counter.getName();
|
|
||||||
if (shouldRemoveCounters()) {
|
|
||||||
final Counter existingCounterOfSameType = card.getCounters(game).get(counterName);
|
|
||||||
final int countersToRemove = Math.min(existingCounterOfSameType.getCount(), counter.getCount());
|
|
||||||
final Counter modifiedCounter = new Counter(counterName, countersToRemove);
|
|
||||||
card.removeCounters(modifiedCounter, source, game);
|
|
||||||
} else {
|
|
||||||
card.addCounters(counter, source.getControllerId(), source, game);
|
|
||||||
}
|
|
||||||
if (!game.isSimulation()) {
|
|
||||||
game.informPlayers(sourceObject.getName() + ": " +
|
|
||||||
controller.getLogName() + getActionStr() + "s " +
|
|
||||||
counter.getCount() + ' ' + counterName.toLowerCase(Locale.ENGLISH) +
|
|
||||||
" counter on " + card.getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract boolean shouldRemoveCounters();
|
|
||||||
|
|
||||||
protected abstract String getActionStr();
|
|
||||||
|
|
||||||
private void setText() {
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
sb.append(getActionStr());
|
|
||||||
if (counter.getCount() > 1) {
|
|
||||||
sb.append(Integer.toString(counter.getCount())).append(' ').append(counter.getName().toLowerCase(Locale.ENGLISH)).append(" counters on each ");
|
|
||||||
} else {
|
} else {
|
||||||
sb.append("a ").append(counter.getName().toLowerCase(Locale.ENGLISH)).append(" counter on each ");
|
permanent.addCounters(CounterType.TIME.createInstance(2), source, game);
|
||||||
}
|
}
|
||||||
sb.append(permFilter.getMessage());
|
|
||||||
staticText = sb.toString();
|
|
||||||
}
|
}
|
||||||
|
for (Card card : game.getExile().getCards(filter.getCardFilter(), game)) {
|
||||||
|
if (remove) {
|
||||||
|
card.removeCounters(CounterType.TIME.createInstance(2), source, game);
|
||||||
|
} else {
|
||||||
|
card.addCounters(CounterType.TIME.createInstance(2), source, game);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class AddCountersEffect extends DustOfMomentsEffect {
|
@Override
|
||||||
|
public String getText(Mode mode) {
|
||||||
public AddCountersEffect() {
|
StringBuilder sb = new StringBuilder(remove ? "remove" : "put");
|
||||||
super();
|
sb.append(" two time counters ");
|
||||||
}
|
sb.append(remove ? "from" : "on");
|
||||||
|
sb.append(" each permanent");
|
||||||
public AddCountersEffect(final DustOfMomentsEffect effect) {
|
if (!remove) {
|
||||||
super(effect);
|
sb.append("with a time counter on it");
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean shouldRemoveCounters() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String getActionStr() {
|
|
||||||
return "add";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Effect copy() {
|
|
||||||
return new AddCountersEffect(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class RemoveCountersEffect extends DustOfMomentsEffect {
|
|
||||||
|
|
||||||
public RemoveCountersEffect() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
public RemoveCountersEffect(final DustOfMomentsEffect effect) {
|
|
||||||
super(effect);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean shouldRemoveCounters() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String getActionStr() {
|
|
||||||
return "remove";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Effect copy() {
|
|
||||||
return new RemoveCountersEffect(this);
|
|
||||||
}
|
}
|
||||||
|
sb.append(" and each suspended card");
|
||||||
|
return sb.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,7 @@ public final class Epochrasite extends CardImpl {
|
||||||
this.addAbility(new EntersBattlefieldAbility(
|
this.addAbility(new EntersBattlefieldAbility(
|
||||||
new AddCountersSourceEffect(CounterType.P1P1.createInstance(3)),
|
new AddCountersSourceEffect(CounterType.P1P1.createInstance(3)),
|
||||||
new InvertCondition(CastFromHandSourcePermanentCondition.instance),
|
new InvertCondition(CastFromHandSourcePermanentCondition.instance),
|
||||||
"{this} enters the battlefield with three +1/+1 counters on it if you didn't cast it from your hand", ""),
|
"","with three +1/+1 counters on it if you didn't cast it from your hand"),
|
||||||
new CastFromHandWatcher());
|
new CastFromHandWatcher());
|
||||||
|
|
||||||
// When Epochrasite dies, exile it with three time counters on it and it gains suspend.
|
// When Epochrasite dies, exile it with three time counters on it and it gains suspend.
|
||||||
|
|
|
@ -30,7 +30,7 @@ public final class FesteringMarch extends CardImpl {
|
||||||
this.getSpellAbility().addEffect(new ExileSpellEffect());
|
this.getSpellAbility().addEffect(new ExileSpellEffect());
|
||||||
// with three time counters on it.
|
// with three time counters on it.
|
||||||
Effect effect = new AddCountersSourceEffect(CounterType.TIME.createInstance(), StaticValue.get(3), false, true);
|
Effect effect = new AddCountersSourceEffect(CounterType.TIME.createInstance(), StaticValue.get(3), false, true);
|
||||||
effect.setText("with 3 time counters on it");
|
effect.setText("with three time counters on it");
|
||||||
this.getSpellAbility().addEffect(effect);
|
this.getSpellAbility().addEffect(effect);
|
||||||
|
|
||||||
// Suspend 3-{2}{B}
|
// Suspend 3-{2}{B}
|
||||||
|
|
|
@ -1,27 +1,30 @@
|
||||||
|
|
||||||
package mage.cards.g;
|
package mage.cards.g;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.ObjectColor;
|
import mage.ObjectColor;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.common.DamageTargetEffect;
|
import mage.abilities.effects.common.DamageTargetEffect;
|
||||||
import mage.abilities.effects.common.InfoEffect;
|
import mage.abilities.effects.common.InfoEffect;
|
||||||
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.target.common.TargetAnyTarget;
|
import mage.target.common.TargetAnyTarget;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author dustinconrad
|
* @author dustinconrad
|
||||||
*/
|
*/
|
||||||
public final class Ghostfire extends CardImpl {
|
public final class Ghostfire extends CardImpl {
|
||||||
|
|
||||||
public Ghostfire(UUID ownerId, CardSetInfo setInfo) {
|
public Ghostfire(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{R}");
|
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{R}");
|
||||||
|
|
||||||
// Ghostfire is colorless.
|
// Ghostfire is colorless.
|
||||||
this.color = new ObjectColor();
|
this.color = new ObjectColor();
|
||||||
this.getSpellAbility().addEffect(new InfoEffect("{this} is colorless"));
|
this.addAbility(new SimpleStaticAbility(
|
||||||
|
Zone.ALL, new InfoEffect("{this} is colorless")
|
||||||
|
).setRuleAtTheTop(true));
|
||||||
|
|
||||||
// Ghostfire deals 3 damage to any target.
|
// Ghostfire deals 3 damage to any target.
|
||||||
this.getSpellAbility().addEffect(new DamageTargetEffect(3));
|
this.getSpellAbility().addEffect(new DamageTargetEffect(3));
|
||||||
|
|
|
@ -1,31 +1,30 @@
|
||||||
|
|
||||||
package mage.cards.g;
|
package mage.cards.g;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.DealsDamageAttachedTriggeredAbility;
|
import mage.abilities.common.DealsDamageAttachedTriggeredAbility;
|
||||||
import mage.abilities.dynamicvalue.common.NumericSetToEffectValues;
|
import mage.abilities.dynamicvalue.common.SavedDamageValue;
|
||||||
import mage.abilities.effects.common.AttachEffect;
|
import mage.abilities.effects.common.AttachEffect;
|
||||||
import mage.abilities.effects.common.DamageAttachedEffect;
|
import mage.abilities.effects.common.DamageAttachedEffect;
|
||||||
import mage.abilities.keyword.EnchantAbility;
|
import mage.abilities.keyword.EnchantAbility;
|
||||||
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.Outcome;
|
import mage.constants.Outcome;
|
||||||
|
import mage.constants.SubType;
|
||||||
import mage.constants.Zone;
|
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 HanClinto
|
* @author HanClinto
|
||||||
*/
|
*/
|
||||||
public final class GuiltyConscience extends CardImpl {
|
public final class GuiltyConscience extends CardImpl {
|
||||||
|
|
||||||
public GuiltyConscience(UUID ownerId, CardSetInfo setInfo) {
|
public GuiltyConscience(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{W}");
|
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{W}");
|
||||||
|
|
||||||
this.subtype.add(SubType.AURA);
|
this.subtype.add(SubType.AURA);
|
||||||
|
|
||||||
// Enchant creature
|
// Enchant creature
|
||||||
|
@ -36,7 +35,7 @@ public final class GuiltyConscience extends CardImpl {
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
|
|
||||||
// Whenever enchanted creature deals damage, Guilty Conscience deals that much damage to that creature.
|
// Whenever enchanted creature deals damage, Guilty Conscience deals that much damage to that creature.
|
||||||
this.addAbility(new DealsDamageAttachedTriggeredAbility(Zone.BATTLEFIELD, new DamageAttachedEffect(new NumericSetToEffectValues("that much", "damage")), false));
|
this.addAbility(new DealsDamageAttachedTriggeredAbility(Zone.BATTLEFIELD, new DamageAttachedEffect(SavedDamageValue.MUCH).setText("that much damage to that creature"), false));
|
||||||
}
|
}
|
||||||
|
|
||||||
private GuiltyConscience(final GuiltyConscience card) {
|
private GuiltyConscience(final GuiltyConscience card) {
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
|
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.condition.common.SourceMatchesFilterCondition;
|
import mage.abilities.condition.common.SourceMatchesFilterCondition;
|
||||||
|
@ -16,8 +14,9 @@ import mage.constants.Zone;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
import mage.filter.predicate.permanent.TokenPredicate;
|
import mage.filter.predicate.permanent.TokenPredicate;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class ImperialMask extends CardImpl {
|
public final class ImperialMask extends CardImpl {
|
||||||
|
@ -34,10 +33,10 @@ public final class ImperialMask extends CardImpl {
|
||||||
// When Imperial Mask enters the battlefield, if it's not a token, each of your teammates puts a token that's a copy of Imperial Mask onto the battlefield.
|
// When Imperial Mask enters the battlefield, if it's not a token, each of your teammates puts a token that's a copy of Imperial Mask onto the battlefield.
|
||||||
// No implementation of teammates currently, so no effect needed
|
// No implementation of teammates currently, so no effect needed
|
||||||
this.addAbility(new ConditionalInterveningIfTriggeredAbility(
|
this.addAbility(new ConditionalInterveningIfTriggeredAbility(
|
||||||
new EntersBattlefieldTriggeredAbility(new InfoEffect("each of your teammates puts a token that's a copy of {this} onto the battlefield"), false),
|
new EntersBattlefieldTriggeredAbility(new InfoEffect(""), false),
|
||||||
new SourceMatchesFilterCondition(filter),
|
new SourceMatchesFilterCondition(filter),
|
||||||
"When {this} enters the battlefield, if it's not a token, "
|
"When {this} enters the battlefield, if it's not a token, "
|
||||||
+ "each of your teammates puts a token that's a copy of {this} onto the battlefield"
|
+ "each of your teammates creates a token that's a copy of {this}"
|
||||||
));
|
));
|
||||||
|
|
||||||
// You have hexproof.
|
// You have hexproof.
|
||||||
|
|
|
@ -35,7 +35,7 @@ public final class LlanowarEmpath extends CardImpl {
|
||||||
this.toughness = new MageInt(2);
|
this.toughness = new MageInt(2);
|
||||||
|
|
||||||
// When Llanowar Empath enters the battlefield, scry 2, then reveal the top card of your library. If it's a creature card, put it into your hand.
|
// When Llanowar Empath enters the battlefield, scry 2, then reveal the top card of your library. If it's a creature card, put it into your hand.
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(new ScryEffect(2));
|
Ability ability = new EntersBattlefieldTriggeredAbility(new ScryEffect(2, false));
|
||||||
ability.addEffect(new LlanowarEmpathEffect());
|
ability.addEffect(new LlanowarEmpathEffect());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,6 +86,6 @@ class LostAuramancersAbility extends PutIntoGraveFromBattlefieldSourceTriggeredA
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getRule() {
|
public String getRule() {
|
||||||
return "When {this} dies, if it had no time counters on it, you may search your library for an enchantment card and put it onto the battlefield. If you do, shuffle.";
|
return "When {this} dies, if it had no time counters on it, you may search your library for an enchantment card, put it onto the battlefield, then shuffle.";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,7 @@ public final class MarshalingCry extends CardImpl {
|
||||||
effect.setText("Creatures you control get +1/+1");
|
effect.setText("Creatures you control get +1/+1");
|
||||||
this.getSpellAbility().addEffect(effect);
|
this.getSpellAbility().addEffect(effect);
|
||||||
effect = new GainAbilityControlledEffect(VigilanceAbility.getInstance(), Duration.EndOfTurn);
|
effect = new GainAbilityControlledEffect(VigilanceAbility.getInstance(), Duration.EndOfTurn);
|
||||||
effect.setText("and vigilance until end of turn");
|
effect.setText("and gain vigilance until end of turn");
|
||||||
this.getSpellAbility().addEffect(effect);
|
this.getSpellAbility().addEffect(effect);
|
||||||
|
|
||||||
// Cycling {2}
|
// Cycling {2}
|
||||||
|
|
|
@ -33,7 +33,7 @@ public final class PatriciansScorn extends CardImpl {
|
||||||
// If you've cast another white spell this turn, you may cast this spell without paying its mana cost.
|
// If you've cast another white spell this turn, you may cast this spell without paying its mana cost.
|
||||||
this.addAbility(new AlternativeCostSourceAbility(new CastWhiteSpellThisTurnCondition()), new PatriciansScornWatcher());
|
this.addAbility(new AlternativeCostSourceAbility(new CastWhiteSpellThisTurnCondition()), new PatriciansScornWatcher());
|
||||||
// Destroy all enchantments.
|
// Destroy all enchantments.
|
||||||
this.getSpellAbility().addEffect(new DestroyAllEffect(StaticFilters.FILTER_PERMANENT_ENCHANTMENT));
|
this.getSpellAbility().addEffect(new DestroyAllEffect(StaticFilters.FILTER_PERMANENT_ENCHANTMENTS));
|
||||||
}
|
}
|
||||||
|
|
||||||
private PatriciansScorn(final PatriciansScorn card) {
|
private PatriciansScorn(final PatriciansScorn card) {
|
||||||
|
|
|
@ -31,7 +31,7 @@ public final class RealityStrobe extends CardImpl {
|
||||||
this.getSpellAbility().addEffect(new ExileSpellEffect());
|
this.getSpellAbility().addEffect(new ExileSpellEffect());
|
||||||
// with three time counters on it.
|
// with three time counters on it.
|
||||||
Effect effect = new AddCountersSourceEffect(CounterType.TIME.createInstance(), StaticValue.get(3), false, true);
|
Effect effect = new AddCountersSourceEffect(CounterType.TIME.createInstance(), StaticValue.get(3), false, true);
|
||||||
effect.setText("with 3 time counters on it");
|
effect.setText("with three time counters on it");
|
||||||
this.getSpellAbility().addEffect(effect);
|
this.getSpellAbility().addEffect(effect);
|
||||||
this.getSpellAbility().addTarget(new TargetPermanent());
|
this.getSpellAbility().addTarget(new TargetPermanent());
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ public final class ScoutsWarning extends CardImpl {
|
||||||
this.getSpellAbility().addWatcher(new ScoutsWarningWatcher());
|
this.getSpellAbility().addWatcher(new ScoutsWarningWatcher());
|
||||||
|
|
||||||
// Draw a card.
|
// Draw a card.
|
||||||
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1));
|
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("<br>"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private ScoutsWarning(final ScoutsWarning card) {
|
private ScoutsWarning(final ScoutsWarning card) {
|
||||||
|
|
|
@ -28,7 +28,7 @@ public final class SkizzikSurger extends CardImpl {
|
||||||
// Haste
|
// Haste
|
||||||
this.addAbility(HasteAbility.getInstance());
|
this.addAbility(HasteAbility.getInstance());
|
||||||
// Echo-Sacrifice two lands.
|
// Echo-Sacrifice two lands.
|
||||||
this.addAbility(new EchoAbility(new SacrificeTargetCost(new TargetControlledPermanent(2, 2, new FilterControlledLandPermanent("two lands"), true))));
|
this.addAbility(new EchoAbility(new SacrificeTargetCost(new TargetControlledPermanent(2, 2, new FilterControlledLandPermanent("lands"), true))));
|
||||||
}
|
}
|
||||||
|
|
||||||
private SkizzikSurger(final SkizzikSurger card) {
|
private SkizzikSurger(final SkizzikSurger card) {
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
|
|
||||||
package mage.cards.s;
|
package mage.cards.s;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldAbility;
|
import mage.abilities.common.EntersBattlefieldAbility;
|
||||||
import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
|
||||||
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
||||||
import mage.abilities.keyword.VanishingSacrificeAbility;
|
import mage.abilities.keyword.VanishingSacrificeAbility;
|
||||||
import mage.abilities.keyword.VanishingUpkeepAbility;
|
import mage.abilities.keyword.VanishingUpkeepAbility;
|
||||||
|
@ -19,8 +17,9 @@ import mage.counters.CounterType;
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
import mage.filter.common.FilterCreaturePermanent;
|
||||||
import mage.filter.predicate.mageobject.AnotherPredicate;
|
import mage.filter.predicate.mageobject.AnotherPredicate;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author fireshoes
|
* @author fireshoes
|
||||||
*/
|
*/
|
||||||
public final class SoultetherGolem extends CardImpl {
|
public final class SoultetherGolem extends CardImpl {
|
||||||
|
@ -33,7 +32,7 @@ public final class SoultetherGolem extends CardImpl {
|
||||||
}
|
}
|
||||||
|
|
||||||
public SoultetherGolem(UUID ownerId, CardSetInfo setInfo) {
|
public SoultetherGolem(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{2}");
|
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{2}");
|
||||||
this.subtype.add(SubType.GOLEM);
|
this.subtype.add(SubType.GOLEM);
|
||||||
this.power = new MageInt(3);
|
this.power = new MageInt(3);
|
||||||
this.toughness = new MageInt(3);
|
this.toughness = new MageInt(3);
|
||||||
|
@ -46,7 +45,7 @@ public final class SoultetherGolem extends CardImpl {
|
||||||
this.addAbility(new VanishingSacrificeAbility());
|
this.addAbility(new VanishingSacrificeAbility());
|
||||||
|
|
||||||
// Whenever another creature enters the battlefield under your control, put a time counter on Soultether Golem.
|
// Whenever another creature enters the battlefield under your control, put a time counter on Soultether Golem.
|
||||||
this.addAbility(new EntersBattlefieldAllTriggeredAbility(
|
this.addAbility(new EntersBattlefieldControlledTriggeredAbility(
|
||||||
Zone.BATTLEFIELD,
|
Zone.BATTLEFIELD,
|
||||||
new AddCountersSourceEffect(CounterType.TIME.createInstance(1)),
|
new AddCountersSourceEffect(CounterType.TIME.createInstance(1)),
|
||||||
filter,
|
filter,
|
||||||
|
|
|
@ -23,7 +23,7 @@ import mage.filter.common.FilterCreaturePermanent;
|
||||||
public final class SteamfloggerBoss extends CardImpl {
|
public final class SteamfloggerBoss extends CardImpl {
|
||||||
|
|
||||||
private static final FilterCreaturePermanent filter
|
private static final FilterCreaturePermanent filter
|
||||||
= new FilterCreaturePermanent(SubType.RIGGER, "Rigger creatures");
|
= new FilterCreaturePermanent(SubType.RIGGER, "Riggers");
|
||||||
|
|
||||||
public SteamfloggerBoss(UUID ownerId, CardSetInfo setInfo) {
|
public SteamfloggerBoss(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
|
||||||
|
@ -53,7 +53,7 @@ public final class SteamfloggerBoss extends CardImpl {
|
||||||
Zone.BATTLEFIELD,
|
Zone.BATTLEFIELD,
|
||||||
new InfoEffect(
|
new InfoEffect(
|
||||||
"If a Rigger you control would assemble a Contraption, "
|
"If a Rigger you control would assemble a Contraption, "
|
||||||
+ "it assembles two Contraptions instead. (NOT IMPLEMENTED)"
|
+ "it assembles two Contraptions instead"
|
||||||
)
|
)
|
||||||
));
|
));
|
||||||
|
|
||||||
|
|
|
@ -41,8 +41,7 @@ public final class TilonallisCrown extends CardImpl {
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
|
|
||||||
// When Tilonalli's Crown enters the battlefield, it deals 1 damage to enchanted creature.
|
// When Tilonalli's Crown enters the battlefield, it deals 1 damage to enchanted creature.
|
||||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new DamageAttachedEffect(1, "it")
|
this.addAbility(new EntersBattlefieldTriggeredAbility(new DamageAttachedEffect(1, "it")));
|
||||||
.setText("it deals 1 damage to enchanted creature")));
|
|
||||||
|
|
||||||
// Enchanted creature gets +3/+0 and has trample.
|
// Enchanted creature gets +3/+0 and has trample.
|
||||||
ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(3, 0));
|
ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(3, 0));
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
|
|
||||||
package mage.cards.u;
|
package mage.cards.u;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.common.TurnedFaceUpAllTriggeredAbility;
|
import mage.abilities.common.TurnedFaceUpAllTriggeredAbility;
|
||||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
|
@ -11,25 +9,32 @@ 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.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author fireshoes
|
* @author fireshoes
|
||||||
*/
|
*/
|
||||||
public final class UnblinkingBleb extends CardImpl {
|
public final class UnblinkingBleb extends CardImpl {
|
||||||
|
|
||||||
|
private static final FilterPermanent filter = new FilterPermanent("{this} or another permanent");
|
||||||
|
|
||||||
public UnblinkingBleb(UUID ownerId, CardSetInfo setInfo) {
|
public UnblinkingBleb(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{U}");
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}");
|
||||||
this.subtype.add(SubType.ILLUSION);
|
this.subtype.add(SubType.ILLUSION);
|
||||||
this.power = new MageInt(1);
|
this.power = new MageInt(1);
|
||||||
this.toughness = new MageInt(3);
|
this.toughness = new MageInt(3);
|
||||||
|
|
||||||
// Morph {2}{U}
|
// Morph {2}{U}
|
||||||
this.addAbility(new MorphAbility(this, new ManaCostsImpl("{2}{U}")));
|
this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{U}")));
|
||||||
|
|
||||||
// Whenever Unblinking Bleb or another permanent is turned face up, you may scry 2.
|
// Whenever Unblinking Bleb or another permanent is turned face up, you may scry 2.
|
||||||
this.addAbility(new TurnedFaceUpAllTriggeredAbility(new ScryEffect(2), new FilterPermanent("{this} or another permanent"), true));
|
this.addAbility(new TurnedFaceUpAllTriggeredAbility(
|
||||||
|
Zone.BATTLEFIELD, new ScryEffect(2),
|
||||||
|
filter, true, true
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
private UnblinkingBleb(final UnblinkingBleb card) {
|
private UnblinkingBleb(final UnblinkingBleb card) {
|
||||||
|
@ -40,4 +45,4 @@ public final class UnblinkingBleb extends CardImpl {
|
||||||
public UnblinkingBleb copy() {
|
public UnblinkingBleb copy() {
|
||||||
return new UnblinkingBleb(this);
|
return new UnblinkingBleb(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 = "PLC"; // check all abilities and output cards with wrong abilities texts;
|
private static final String FULL_ABILITIES_CHECK_SET_CODE = "FUT"; // 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
|
||||||
|
|
||||||
|
|
|
@ -72,9 +72,9 @@ public class DamageAttachedEffect extends OneShotEffect {
|
||||||
return staticText;
|
return staticText;
|
||||||
}
|
}
|
||||||
if ("equal to".equals(amount.toString())) {
|
if ("equal to".equals(amount.toString())) {
|
||||||
return this.sourceName + " deals damage " + amount + " that creatures toughness to that creature";
|
return this.sourceName + " deals damage " + amount + " that creatures toughness to enchanted creature";
|
||||||
}
|
}
|
||||||
return this.sourceName + " deals " + amount + " damage to that creature";
|
return this.sourceName + " deals " + amount + " damage to enchanted creature";
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getSourceName() {
|
public String getSourceName() {
|
||||||
|
|
|
@ -17,7 +17,7 @@ import mage.target.common.TargetCreaturePermanent;
|
||||||
public final class FesteringGoblinToken extends TokenImpl {
|
public final class FesteringGoblinToken extends TokenImpl {
|
||||||
|
|
||||||
public FesteringGoblinToken() {
|
public FesteringGoblinToken() {
|
||||||
super("Festering Goblin", "1/1 black Zombie Goblin creature token named Festering Goblin with \"When Festering Goblin dies, target creature gets -1/-1 until end of turn.\"");
|
super("Festering Goblin", "1/1 black Zombie Goblin creature token named Festering Goblin. It has \"When Festering Goblin dies, target creature gets -1/-1 until end of turn.\"");
|
||||||
cardType.add(CardType.CREATURE);
|
cardType.add(CardType.CREATURE);
|
||||||
color.setBlack(true);
|
color.setBlack(true);
|
||||||
subtype.add(SubType.ZOMBIE);
|
subtype.add(SubType.ZOMBIE);
|
||||||
|
|
|
@ -19,7 +19,7 @@ import mage.target.common.TargetCreaturePermanent;
|
||||||
public final class GoldmeadowHarrierToken extends TokenImpl {
|
public final class GoldmeadowHarrierToken extends TokenImpl {
|
||||||
|
|
||||||
public GoldmeadowHarrierToken() {
|
public GoldmeadowHarrierToken() {
|
||||||
super("Goldmeadow Harrier", "1/1 white Kithkin Soldier creature token named Goldmeadow Harrier with \"{W}, {T}: Tap target creature.\"");
|
super("Goldmeadow Harrier", "1/1 white Kithkin Soldier creature token named Goldmeadow Harrier. It has \"{W}, {T}: Tap target creature.\"");
|
||||||
cardType.add(CardType.CREATURE);
|
cardType.add(CardType.CREATURE);
|
||||||
color.setWhite(true);
|
color.setWhite(true);
|
||||||
subtype.add(SubType.KITHKIN);
|
subtype.add(SubType.KITHKIN);
|
||||||
|
|
|
@ -15,7 +15,7 @@ import mage.constants.TargetController;
|
||||||
public final class SparkElementalToken extends TokenImpl {
|
public final class SparkElementalToken extends TokenImpl {
|
||||||
|
|
||||||
public SparkElementalToken() {
|
public SparkElementalToken() {
|
||||||
super("Spark Elemental", "3/1 red Elemental creature token named Spark Elemental with trample, haste, and \"At the beginning of the end step, sacrifice Spark Elemental.\"");
|
super("Spark Elemental", "3/1 red Elemental creature token named Spark Elemental. It has trample, haste, and \"At the beginning of the end step, sacrifice Spark Elemental.\"");
|
||||||
cardType.add(CardType.CREATURE);
|
cardType.add(CardType.CREATURE);
|
||||||
color.setRed(true);
|
color.setRed(true);
|
||||||
subtype.add(SubType.ELEMENTAL);
|
subtype.add(SubType.ELEMENTAL);
|
||||||
|
|
Loading…
Reference in a new issue