[NCC] various text fixes

This commit is contained in:
Evan Kranzler 2022-09-22 22:29:39 -04:00
parent fd16f2a16b
commit b0ebf4ad5b
16 changed files with 61 additions and 49 deletions

View file

@ -6,12 +6,8 @@ import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@ -21,9 +17,7 @@ import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.counters.Counter;
import mage.counters.CounterType;
import mage.counters.Counters;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
@ -43,17 +37,17 @@ public class AgentsToolkit extends CardImpl {
// Agents Toolkit enters the battlefield with a +1/+1 counter, a flying counter, a deathtouch counter, and a shield counter on it.
Ability counterETBAbility = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(1)).setText("with a +1/+1 counter"));
counterETBAbility.addEffect(new AddCountersSourceEffect(CounterType.FLYING.createInstance(1)).setText("a flying counter").concatBy(", "));
counterETBAbility.addEffect(new AddCountersSourceEffect(CounterType.DEATHTOUCH.createInstance(1)).setText("a deathtouch counter").concatBy(", "));
counterETBAbility.addEffect(new AddCountersSourceEffect(CounterType.SHIELD.createInstance(1)).setText("and a shield counter on it").concatBy(", "));
counterETBAbility.addEffect(new AddCountersSourceEffect(CounterType.FLYING.createInstance(1)).setText("a flying counter").concatBy(","));
counterETBAbility.addEffect(new AddCountersSourceEffect(CounterType.DEATHTOUCH.createInstance(1)).setText("a deathtouch counter").concatBy(","));
counterETBAbility.addEffect(new AddCountersSourceEffect(CounterType.SHIELD.createInstance(1)).setText("and a shield counter on it").concatBy(","));
this.addAbility(counterETBAbility);
// Whenever a creature enters the battlefield under your control,
// you may move a counter from Agents Toolkit onto that creature.
this.addAbility(new EntersBattlefieldControlledTriggeredAbility(
new AgentToolkitMoveCounterEffect(),
StaticFilters.FILTER_PERMANENT_CREATURE)
);
StaticFilters.FILTER_PERMANENT_A_CREATURE
));
// {2}, Sacrifice Agents Toolkit: Draw a card.
Ability drawAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new GenericManaCost(2));
@ -75,7 +69,7 @@ class AgentToolkitMoveCounterEffect extends OneShotEffect {
public AgentToolkitMoveCounterEffect() {
super(Outcome.Benefit);
this.staticText = "you may move a counter from Agent's Toolkit onto that creature";
this.staticText = "you may move a counter from {this} onto that creature";
}
private AgentToolkitMoveCounterEffect(final AgentToolkitMoveCounterEffect effect) {

View file

@ -13,7 +13,9 @@ import mage.constants.*;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.*;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.filter.predicate.mageobject.BasePowerPredicate;
import mage.filter.predicate.mageobject.BaseToughnessPredicate;
import java.util.UUID;
@ -22,7 +24,7 @@ import java.util.UUID;
*/
public class BessSoulNourisher extends CardImpl {
static final FilterCreaturePermanent filter = new FilterCreaturePermanent("one or more other creatures with base power and toughness 1/1");
static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other creatures with base power and toughness 1/1");
static {
filter.add(AnotherPredicate.instance);
@ -49,12 +51,12 @@ public class BessSoulNourisher extends CardImpl {
// Whenever Bess attacks, each other creature you control with base power and toughness 1/1 gets
// +X/+X until end of turn, where X is the number of +1/+1 counters on Bess.
DynamicValue xValue = new CountersSourceCount(CounterType.P1P1);
this.addAbility(new AttacksTriggeredAbility(
new BoostControlledEffect(xValue, xValue, Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURE, true),
false,
"whenever Bess attacks, each other creature you control with base power and toughness 1/1 " +
"gets +X/+X until end of turn, where X is the number of +1/+1 counters on Bess")
);
this.addAbility(new AttacksTriggeredAbility(new BoostControlledEffect(
xValue, xValue, Duration.EndOfTurn,
StaticFilters.FILTER_PERMANENT_CREATURE, true
).setText("each other creature you control with base power and toughness 1/1 " +
"gets +X/+X until end of turn, where X is the number of +1/+1 counters on {this}"),
false));
}
private BessSoulNourisher(final BessSoulNourisher card) {

View file

@ -53,7 +53,7 @@ public final class CabarettiConfluence extends CardImpl {
// Creatures target player controls gets +1/+1 and gain first strike until end of turn.
this.getSpellAbility().addMode(new Mode(new BoostAllEffect(
1, 1, Duration.EndOfTurn, filter, false
).setText("creatures target player controls gets +1/+1")).addEffect(new GainAbilityAllEffect(
).setText("creatures target player controls get +1/+1")).addEffect(new GainAbilityAllEffect(
FirstStrikeAbility.getInstance(), Duration.EndOfTurn, filter
).setText("and gain first strike until end of turn")));
}

View file

@ -18,8 +18,6 @@ import mage.filter.predicate.card.FaceDownPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.targetpointer.FixedTarget;
import mage.util.CardUtil;
import java.util.UUID;
@ -28,7 +26,8 @@ import java.util.UUID;
*/
public class CrypticPursuit extends CardImpl {
private static final FilterPermanent filterFaceDownPermanent = new FilterControlledCreaturePermanent("a face-down creature");
private static final FilterPermanent filterFaceDownPermanent = new FilterControlledCreaturePermanent("a face-down creature you control");
static {
filterFaceDownPermanent.add(FaceDownPredicate.instance);
}
@ -70,7 +69,7 @@ class CrypticPursuitExileAndPlayEffect extends OneShotEffect {
CrypticPursuitExileAndPlayEffect() {
super(Outcome.Benefit);
this.staticText = "exile it if it's an instant or sorcery card. " +
"You may cast that card until the end of your next turn.";
"You may cast that card until the end of your next turn.";
}
@Override
@ -104,4 +103,4 @@ class CrypticPursuitExileAndPlayEffect extends OneShotEffect {
public Effect copy() {
return new CrypticPursuitExileAndPlayEffect(this);
}
}
}

View file

@ -70,7 +70,7 @@ public class MariTheKillingQuill extends CardImpl {
Ability dealsDamageAbility = new DealsCombatDamageToAPlayerTriggeredAbility(new MariTheKillingQuillDealsDamageEffect(), false, true);
Effect drawAndTreasureEffect = new GainAbilityControlledEffect(dealsDamageAbility, Duration.WhileOnBattlefield, filter);
drawAndTreasureEffect.setText(
"\"Whenever this creature deals combat damage to a player, you may remove a hit counter from a card taht player owns in exile. " +
"\"Whenever this creature deals combat damage to a player, you may remove a hit counter from a card that player owns in exile. " +
"If you do, draw a card and create two Treasure tokens.\"");
drawAndTreasureEffect.concatBy("and");

View file

@ -63,7 +63,7 @@ class MasterOfCeremoniesChoiceEffect extends OneShotEffect {
super(Outcome.Benefit);
this.staticText = "each opponent chooses money, friends, or secrets. " +
"For each player who chose money, you and that player each create a Treasure token. " +
"For each player who chose friends, you and that player each create a 1/1 green and white Citizen creature token. " +
"For each player who chose friends, you and that player each create a 1/1 green and white Citizen creature token. " +
"For each player who chose secrets, you and that player each draw a card.";
}

View file

@ -63,8 +63,8 @@ class NextOfKinDiesEffect extends OneShotEffect {
NextOfKinDiesEffect() {
super(Outcome.Benefit);
this.staticText = "you may put a creature card you own with lesser mana value from your hand or from the command zone onto the battlefield." +
"If you do, return Next of Kin to the battlefield attached to that creature at the beginning of the next end step.";
this.staticText = "you may put a creature card you own with lesser mana value from your hand or from the command zone onto the battlefield. " +
"If you do, return {this} to the battlefield attached to that creature at the beginning of the next end step.";
}
private NextOfKinDiesEffect(final NextOfKinDiesEffect effect) {

View file

@ -17,7 +17,6 @@ import mage.game.events.GameEvent;
import mage.game.stack.Spell;
import mage.players.Player;
import mage.target.common.TargetOpponent;
import mage.target.targetpointer.FixedTarget;
import java.util.UUID;
@ -60,7 +59,7 @@ class ParnesseTheSubtleBrushCopySpellOpponentEffect extends OneShotEffect {
ParnesseTheSubtleBrushCopySpellOpponentEffect() {
super(Outcome.Detriment);
this.staticText = "up to one target opponent may also copy that spell. " +
"They may choose new targets for that copy";
"They may choose new targets for that copy";
}
ParnesseTheSubtleBrushCopySpellOpponentEffect(final ParnesseTheSubtleBrushCopySpellOpponentEffect effect) {
@ -88,8 +87,9 @@ class ParnesseTheSubtleBrushCopySpellOpponentEffect extends OneShotEffect {
class ParnesseTheSubtleBrushCopySpellTriggeredAbility extends TriggeredAbilityImpl {
ParnesseTheSubtleBrushCopySpellTriggeredAbility() {
super(Zone.BATTLEFIELD, new ParnesseTheSubtleBrushCopySpellOpponentEffect(), true);
super(Zone.BATTLEFIELD, new ParnesseTheSubtleBrushCopySpellOpponentEffect(), false);
this.getTargets().add(new TargetOpponent(0, 1, false));
setTriggerPhrase("Whenever you copy a spell, ");
}
private ParnesseTheSubtleBrushCopySpellTriggeredAbility(final ParnesseTheSubtleBrushCopySpellTriggeredAbility ability) {

View file

@ -58,7 +58,7 @@ public final class PerrieThePulverizer extends CardImpl {
.setText("target creature you control gains trample"));
ability.addEffect(new BoostTargetEffect(
PerrieThePulverizerValue.instance, PerrieThePulverizerValue.instance, Duration.EndOfTurn
).setText("and gets +X/+X, where X is the number of different kinds of counters among permanents you control"));
).setText("and gets +X/+X until end of turn, where X is the number of different kinds of counters among permanents you control"));
ability.addTarget(new TargetControlledCreaturePermanent());
this.addAbility(ability);
}

View file

@ -28,7 +28,7 @@ import java.util.UUID;
*/
public class PhabineBosssConfidant extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("Creature tokens you control");
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("Creature tokens");
static {
filter.add(TokenPredicate.TRUE);
}

View file

@ -1,7 +1,10 @@
package mage.cards.r;
import mage.abilities.Mode;
import mage.abilities.effects.common.*;
import mage.abilities.effects.common.DamageAllEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
import mage.abilities.effects.common.PutCardFromOneOfTwoZonesOntoBattlefieldEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -17,7 +20,7 @@ import java.util.UUID;
*/
public class RiveteersConfluence extends CardImpl {
private static final FilterPermanent damageFilter = new FilterCreatureOrPlaneswalkerPermanent();
private static final FilterPermanent damageFilter = new FilterCreatureOrPlaneswalkerPermanent("creature and planeswalker you dont control");
static {
damageFilter.add(TargetController.NOT_YOU.getControllerPredicate());

View file

@ -7,7 +7,6 @@ import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.common.TreasureSpentToCastCondition;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CreateTokenTargetEffect;
@ -16,15 +15,18 @@ import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.abilities.keyword.HasteAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.token.TreasureToken;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
import mage.target.common.TargetOpponent;
import mage.watchers.common.CreatedTokenWatcher;
import mage.watchers.common.ManaPaidSourceWatcher;
import java.util.Optional;
import java.util.UUID;
@ -54,10 +56,7 @@ public class VaziKeenNegotiator extends CardImpl {
// if mana from a Treasure was spent to cast it or activate it,
// put a +1/+1 counter on target creature,
// then draw a card.
Ability castAbility = new VaziKeenNegotiatorOpponentCastsOrActivatesTriggeredAbility();
castAbility.addTarget(new TargetOpponent());
castAbility.addEffect(new DrawCardSourceControllerEffect(1));
this.addAbility(castAbility);
this.addAbility(new VaziKeenNegotiatorOpponentCastsOrActivatesTriggeredAbility());
}
private VaziKeenNegotiator(final VaziKeenNegotiator card) {
@ -74,6 +73,8 @@ class VaziKeenNegotiatorOpponentCastsOrActivatesTriggeredAbility extends Trigger
VaziKeenNegotiatorOpponentCastsOrActivatesTriggeredAbility() {
super(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.P1P1.createInstance()));
addTarget(new TargetCreaturePermanent());
addEffect(new DrawCardSourceControllerEffect(1).concatBy(", then"));
setTriggerPhrase("Whenever an opponent casts a spell or activates an ability, if mana from a Treasure was spent to cast it or activate it, ");
}

View file

@ -60,7 +60,7 @@ public class VerifyCardDataTest {
private static final Logger logger = Logger.getLogger(VerifyCardDataTest.class);
private static final String FULL_ABILITIES_CHECK_SET_CODE = "DMC"; // check all abilities and output cards with wrong abilities texts;
private static final String FULL_ABILITIES_CHECK_SET_CODE = "NCC"; // 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 ONLY_TEXT = false; // use when checking text locally, suppresses unnecessary checks and output messages

View file

@ -36,6 +36,7 @@ public class SpellCastControllerTriggeredAbility extends TriggeredAbilityImpl {
public SpellCastControllerTriggeredAbility(Effect effect, FilterSpell filter, boolean optional, Zone fromZone) {
this(effect, filter, optional, false);
this.fromZone = fromZone;
makeTriggerPhrase();
}
public SpellCastControllerTriggeredAbility(Effect effect, FilterSpell filter, boolean optional, String rule) {
@ -56,7 +57,7 @@ public class SpellCastControllerTriggeredAbility extends TriggeredAbilityImpl {
this.filter = filter;
this.rememberSource = rememberSource;
this.rememberSourceAsCard = rememberSourceAsCard;
setTriggerPhrase("Whenever you cast " + filter.getMessage() + (fromZone != Zone.ALL ? "from your " + fromZone.toString().toLowerCase() : "") + ", ");
makeTriggerPhrase();
}
public SpellCastControllerTriggeredAbility(final SpellCastControllerTriggeredAbility ability) {
@ -100,4 +101,8 @@ public class SpellCastControllerTriggeredAbility extends TriggeredAbilityImpl {
public SpellCastControllerTriggeredAbility copy() {
return new SpellCastControllerTriggeredAbility(this);
}
private void makeTriggerPhrase() {
setTriggerPhrase("Whenever you cast " + filter.getMessage() + (fromZone != Zone.ALL ? " from your " + fromZone.toString().toLowerCase() : "") + ", ");
}
}

View file

@ -25,7 +25,7 @@ public class AddCounterChoiceSourceEffect extends OneShotEffect {
private final List<CounterType> counterTypes;
public AddCounterChoiceSourceEffect(CounterType ... counterTypes) {
public AddCounterChoiceSourceEffect(CounterType... counterTypes) {
super(Outcome.Benefit);
this.counterTypes = Arrays.stream(counterTypes).collect(Collectors.toList());
this.createStaticText();
@ -48,7 +48,7 @@ public class AddCounterChoiceSourceEffect extends OneShotEffect {
break;
default:
List<String> strings = this.counterTypes.stream().map(CounterType::toString).collect(Collectors.toList());
this.staticText = CardUtil.concatWithOr(strings);
this.staticText = "with your choice of a " + CardUtil.concatWithOr(strings) + " counter on it";
break;
}
}

View file

@ -24,6 +24,7 @@ public class CasualtyAbility extends StaticAbility implements OptionalAdditional
private static final String keywordText = "Casualty";
private final String promptString;
private final String rule;
protected OptionalAdditionalCost additionalCost;
@ -39,9 +40,10 @@ public class CasualtyAbility extends StaticAbility implements OptionalAdditional
super(Zone.STACK, null);
String reminderText = "As you cast this spell, you may sacrifice a creature with power " +
number + " or greater. When you do, copy this spell.";
this.promptString = "Sacrifice a creature with power " + number + " or greater?";
this.additionalCost = new OptionalAdditionalCostImpl(keywordText, reminderText, new SacrificeTargetCost(makeFilter(number)));
this.additionalCost.setRepeatable(false);
this.promptString = "Sacrifice a creature with power " + number + " or greater?";
this.rule = additionalCost.getName() + ' ' + number + ' ' + additionalCost.getReminderText();
this.setRuleAtTheTop(true);
}
@ -49,6 +51,7 @@ public class CasualtyAbility extends StaticAbility implements OptionalAdditional
super(ability);
this.additionalCost = ability.additionalCost;
this.promptString = ability.promptString;
this.rule = ability.rule;
}
public void resetCasualty() {
@ -92,4 +95,9 @@ public class CasualtyAbility extends StaticAbility implements OptionalAdditional
public String getCastMessageSuffix() {
return additionalCost == null ? "" : additionalCost.getCastSuffixMessage(0);
}
@Override
public String getRule() {
return rule;
}
}