res = new ArrayList<>();
+ Permanent permanent = this.getSourcePermanentOrLKI(game);
+ if (permanent == null) {
+ return res;
+ }
+
+ CardIcon levelIcon = new CardIconImpl(
+ CardIconType.ABILITY_CLASS_LEVEL,
+ "Current class level: " + permanent.getClassLevel(),
+ String.valueOf(permanent.getClassLevel())
+ );
+ res.add(levelIcon);
+
+ return res;
+ }
}
diff --git a/Mage/src/main/java/mage/abilities/keyword/EquipAbility.java b/Mage/src/main/java/mage/abilities/keyword/EquipAbility.java
index 7b0dc758f8..1bc91d6cfc 100644
--- a/Mage/src/main/java/mage/abilities/keyword/EquipAbility.java
+++ b/Mage/src/main/java/mage/abilities/keyword/EquipAbility.java
@@ -28,7 +28,7 @@ public class EquipAbility extends ActivatedAbilityImpl {
public EquipAbility(Outcome outcome, Cost cost, Target target) {
super(Zone.BATTLEFIELD, new EquipEffect(outcome), cost);
this.addTarget(target);
- this.timing = TimingRule.SORCERY;
+ this.timing = TimingRule.SORCERY;
}
public EquipAbility(final EquipAbility ability) {
@@ -50,19 +50,23 @@ public class EquipAbility extends ActivatedAbilityImpl {
String targetText = getTargets().get(0) != null ? getTargets().get(0).getFilter().getMessage() : "creature";
String reminderText = " (" + manaCosts.getText() + ": Attach to target " + targetText + ". Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.)";
- StringBuilder sb = new StringBuilder("Equip ");
+ StringBuilder sb = new StringBuilder("Equip");
if (!targetText.equals("creature you control")) {
- sb.append(targetText);
+ sb.append(' ').append(targetText);
+ }
+ String costText = costs.getText();
+ if (costText != null && !costText.isEmpty()) {
+ sb.append("—").append(costText).append('.');
+ } else {
sb.append(' ');
}
- sb.append(costs.getText());
sb.append(manaCosts.getText());
if (costReduceText != null && !costReduceText.isEmpty()) {
- sb.append(' ');
+ sb.append(". ");
sb.append(costReduceText);
}
if (maxActivationsPerTurn == 1) {
- sb.append(" Activate only once each turn.");
+ sb.append(". Activate only once each turn.");
}
sb.append(reminderText);
return sb.toString();
diff --git a/Mage/src/main/java/mage/abilities/keyword/IntimidateAbility.java b/Mage/src/main/java/mage/abilities/keyword/IntimidateAbility.java
index 7b487f3a5d..0b4d247a84 100644
--- a/Mage/src/main/java/mage/abilities/keyword/IntimidateAbility.java
+++ b/Mage/src/main/java/mage/abilities/keyword/IntimidateAbility.java
@@ -31,7 +31,7 @@ public class IntimidateAbility extends EvasionAbility implements MageSingleton {
@Override
public String getRule() {
- return "Intimidate";
+ return "intimidate";
}
@Override
diff --git a/Mage/src/main/java/mage/abilities/keyword/MonstrosityAbility.java b/Mage/src/main/java/mage/abilities/keyword/MonstrosityAbility.java
index 43d4f9b539..8dfd4d7d0c 100644
--- a/Mage/src/main/java/mage/abilities/keyword/MonstrosityAbility.java
+++ b/Mage/src/main/java/mage/abilities/keyword/MonstrosityAbility.java
@@ -1,12 +1,9 @@
-
-
package mage.abilities.keyword;
import mage.abilities.Ability;
import mage.abilities.ActivatedAbilityImpl;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.hint.common.MonstrousHint;
import mage.constants.Outcome;
import mage.constants.Zone;
@@ -19,41 +16,40 @@ import mage.util.CardUtil;
/**
* Monstrosity
- *
+ *
* 701.28. Monstrosity
- *
+ *
* 701.28a “Monstrosity N” means “If this permanent isn't monstrous, put N +1/+1 counters on it
- * and it becomes monstrous.” Monstrous is a condition of that permanent that can be
- * referred to by other abilities.
- *
+ * and it becomes monstrous.” Monstrous is a condition of that permanent that can be
+ * referred to by other abilities.
+ *
* 701.28b If a permanent's ability instructs a player to “monstrosity X,” other abilities of
- * that permanent may also refer to X. The value of X in those abilities is equal to
- * the value of X as that permanent became monstrous.
- *
+ * that permanent may also refer to X. The value of X in those abilities is equal to
+ * the value of X as that permanent became monstrous.
+ *
* * Once a creature becomes monstrous, it can't become monstrous again. If the creature
- * is already monstrous when the monstrosity ability resolves, nothing happens.
- *
+ * is already monstrous when the monstrosity ability resolves, nothing happens.
+ *
* * Monstrous isn't an ability that a creature has. It's just something true about that
- * creature. If the creature stops being a creature or loses its abilities, it will
- * continue to be monstrous.
- *
+ * creature. If the creature stops being a creature or loses its abilities, it will
+ * continue to be monstrous.
+ *
* * An ability that triggers when a creature becomes monstrous won't trigger if that creature
- * isn't on the battlefield when its monstrosity ability resolves.
+ * isn't on the battlefield when its monstrosity ability resolves.
*
* @author LevelX2
*/
public class MonstrosityAbility extends ActivatedAbilityImpl {
- private int monstrosityValue;
+ private final int monstrosityValue;
/**
- *
* @param manaString
* @param monstrosityValue use Integer.MAX_VALUE for monstrosity X.
*/
public MonstrosityAbility(String manaString, int monstrosityValue) {
- super(Zone.BATTLEFIELD, new BecomeMonstrousSourceEffect(monstrosityValue),new ManaCostsImpl(manaString));
+ super(Zone.BATTLEFIELD, new BecomeMonstrousSourceEffect(monstrosityValue), new ManaCostsImpl<>(manaString));
this.monstrosityValue = monstrosityValue;
this.addHint(MonstrousHint.instance);
@@ -72,7 +68,6 @@ public class MonstrosityAbility extends ActivatedAbilityImpl {
public int getMonstrosityValue() {
return monstrosityValue;
}
-
}
@@ -94,28 +89,33 @@ class BecomeMonstrousSourceEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- Permanent permanent = game.getPermanent(source.getSourceId());
- if (permanent != null && !permanent.isMonstrous() && source instanceof MonstrosityAbility) {
- int monstrosityValue = ((MonstrosityAbility) source).getMonstrosityValue();
- // handle monstrosity = X
- if (monstrosityValue == Integer.MAX_VALUE) {
- monstrosityValue = source.getManaCostsToPay().getX();
- }
- new AddCountersSourceEffect(CounterType.P1P1.createInstance(monstrosityValue)).apply(game, source);
- permanent.setMonstrous(true);
- game.fireEvent(GameEvent.getEvent(GameEvent.EventType.BECOMES_MONSTROUS, source.getSourceId(), source, source.getControllerId(), monstrosityValue));
- return true;
+ Permanent permanent = source.getSourcePermanentIfItStillExists(game);
+ if (permanent == null || permanent.isMonstrous()) {
+ return false;
}
- return false;
+ int monstrosityValue = ((MonstrosityAbility) source).getMonstrosityValue();
+ // handle monstrosity = X
+ if (monstrosityValue == Integer.MAX_VALUE) {
+ monstrosityValue = source.getManaCostsToPay().getX();
+ }
+ permanent.addCounters(
+ CounterType.P1P1.createInstance(monstrosityValue),
+ source.getControllerId(), source, game
+ );
+ permanent.setMonstrous(true);
+ game.fireEvent(GameEvent.getEvent(
+ GameEvent.EventType.BECOMES_MONSTROUS, source.getSourceId(),
+ source, source.getControllerId(), monstrosityValue
+ ));
+ return true;
}
private String setText(int monstrosityValue) {
StringBuilder sb = new StringBuilder("Monstrosity ");
- sb.append(monstrosityValue == Integer.MAX_VALUE ? "X":monstrosityValue)
+ sb.append(monstrosityValue == Integer.MAX_VALUE ? "X" : monstrosityValue)
.append(". (If this creature isn't monstrous, put ")
- .append(monstrosityValue == Integer.MAX_VALUE ? "X":CardUtil.numberToText(monstrosityValue))
+ .append(monstrosityValue == Integer.MAX_VALUE ? "X" : CardUtil.numberToText(monstrosityValue))
.append(" +1/+1 counters on it and it becomes monstrous.)").toString();
return sb.toString();
}
-
}
diff --git a/Mage/src/main/java/mage/constants/SubType.java b/Mage/src/main/java/mage/constants/SubType.java
index 961900b695..70374d6f86 100644
--- a/Mage/src/main/java/mage/constants/SubType.java
+++ b/Mage/src/main/java/mage/constants/SubType.java
@@ -467,7 +467,8 @@ public enum SubType {
XENAGOS("Xenagos", SubTypeSet.PlaneswalkerType),
YANGGU("Yanggu", SubTypeSet.PlaneswalkerType),
YANLING("Yanling", SubTypeSet.PlaneswalkerType),
- YODA("Yoda", SubTypeSet.PlaneswalkerType, true); // Star Wars
+ YODA("Yoda", SubTypeSet.PlaneswalkerType, true), // Star Wars,
+ ZARIEL("Zariel", SubTypeSet.PlaneswalkerType);
public static class SubTypePredicate implements Predicate {
diff --git a/Mage/src/main/java/mage/game/Game.java b/Mage/src/main/java/mage/game/Game.java
index d4d83971fc..1e17fcaf0c 100644
--- a/Mage/src/main/java/mage/game/Game.java
+++ b/Mage/src/main/java/mage/game/Game.java
@@ -542,15 +542,71 @@ public interface Game extends MageItem, Serializable {
* @param commanderCardType commander or signature spell
* @return
*/
- default Set getCommanderCardsFromAnyZones(Player player, CommanderCardType commanderCardType) {
- // from command zone
- Set res = getCommanderCardsFromCommandZone(player, commanderCardType);
-
- // from battlefield
- this.getCommandersIds(player, commanderCardType, true).stream()
- .map(this::getPermanent)
+ default Set getCommanderCardsFromAnyZones(Player player, CommanderCardType commanderCardType, Zone... searchZones) {
+ Set needZones = Arrays.stream(searchZones).collect(Collectors.toSet());
+ if (needZones.isEmpty()) {
+ throw new IllegalArgumentException("Empty zones list in searching commanders");
+ }
+ Set needCommandersIds = this.getCommandersIds(player, commanderCardType, true);
+ Set needCommandersCards = needCommandersIds.stream()
+ .map(this::getCard)
.filter(Objects::nonNull)
- .forEach(res::add);
+ .collect(Collectors.toSet());
+ Set res = new HashSet<>();
+
+ // hand
+ if (needZones.contains(Zone.ALL) || needZones.contains(Zone.HAND)) {
+ needCommandersCards.stream()
+ .filter(card -> Zone.HAND.equals(this.getState().getZone(card.getId())))
+ .forEach(res::add);
+ }
+
+ // graveyard
+ if (needZones.contains(Zone.ALL) || needZones.contains(Zone.GRAVEYARD)) {
+ needCommandersCards.stream()
+ .filter(card -> Zone.GRAVEYARD.equals(this.getState().getZone(card.getId())))
+ .forEach(res::add);
+ }
+
+ // library
+ if (needZones.contains(Zone.ALL) || needZones.contains(Zone.LIBRARY)) {
+ needCommandersCards.stream()
+ .filter(card -> Zone.LIBRARY.equals(this.getState().getZone(card.getId())))
+ .forEach(res::add);
+ }
+
+ // battlefield (need permanent card)
+ if (needZones.contains(Zone.ALL) || needZones.contains(Zone.BATTLEFIELD)) {
+ needCommandersIds.stream()
+ .map(this::getPermanent)
+ .filter(Objects::nonNull)
+ .forEach(res::add);
+ }
+
+ // stack
+ if (needZones.contains(Zone.ALL) || needZones.contains(Zone.STACK)) {
+ needCommandersCards.stream()
+ .filter(card -> Zone.STACK.equals(this.getState().getZone(card.getId())))
+ .forEach(res::add);
+ }
+
+ // exiled
+ if (needZones.contains(Zone.ALL) || needZones.contains(Zone.EXILED)) {
+ needCommandersCards.stream()
+ .filter(card -> Zone.EXILED.equals(this.getState().getZone(card.getId())))
+ .forEach(res::add);
+ }
+
+ // command
+ if (needZones.contains(Zone.ALL) || needZones.contains(Zone.COMMAND)) {
+ res.addAll(getCommanderCardsFromCommandZone(player, commanderCardType));
+ }
+
+ // outside must be ignored (example: second side of MDFC commander after cast)
+ if (needZones.contains(Zone.OUTSIDE)) {
+ throw new IllegalArgumentException("Outside zone doesn't supported in searching commanders");
+ }
+
return res;
}
diff --git a/Mage/src/main/java/mage/game/GameImpl.java b/Mage/src/main/java/mage/game/GameImpl.java
index 57031170bd..e6b60b5d74 100644
--- a/Mage/src/main/java/mage/game/GameImpl.java
+++ b/Mage/src/main/java/mage/game/GameImpl.java
@@ -3185,8 +3185,8 @@ public abstract class GameImpl implements Game, Serializable {
@Override
public void cheat(UUID ownerId, List library, List hand, List battlefield, List graveyard, List command) {
// fake test ability for triggers and events
- Ability fakeSourceAbility = new SimpleStaticAbility(Zone.OUTSIDE, new InfoEffect("adding testing cards"));
- fakeSourceAbility.setControllerId(ownerId);
+ Ability fakeSourceAbilityTemplate = new SimpleStaticAbility(Zone.OUTSIDE, new InfoEffect("adding testing cards"));
+ fakeSourceAbilityTemplate.setControllerId(ownerId);
Player player = getPlayer(ownerId);
if (player != null) {
@@ -3221,6 +3221,8 @@ public abstract class GameImpl implements Game, Serializable {
}
for (PermanentCard permanentCard : battlefield) {
+ Ability fakeSourceAbility = fakeSourceAbilityTemplate.copy();
+ fakeSourceAbility.setSourceId(permanentCard.getId());
CardUtil.putCardOntoBattlefieldWithEffects(fakeSourceAbility, this, permanentCard, player);
}
diff --git a/Mage/src/main/java/mage/game/combat/Combat.java b/Mage/src/main/java/mage/game/combat/Combat.java
index 871387e5f8..d29ef524ce 100644
--- a/Mage/src/main/java/mage/game/combat/Combat.java
+++ b/Mage/src/main/java/mage/game/combat/Combat.java
@@ -178,6 +178,7 @@ public class Combat implements Serializable, Copyable {
numberCreaturesDefenderAttackedBy.clear();
creaturesForcedToAttack.clear();
maxAttackers = Integer.MIN_VALUE;
+ attackersTappedByAttack.clear();
}
public String getValue() {
diff --git a/Mage/src/main/java/mage/game/command/emblems/ZarielArchdukeOfAvernusEmblem.java b/Mage/src/main/java/mage/game/command/emblems/ZarielArchdukeOfAvernusEmblem.java
new file mode 100644
index 0000000000..efceb70f38
--- /dev/null
+++ b/Mage/src/main/java/mage/game/command/emblems/ZarielArchdukeOfAvernusEmblem.java
@@ -0,0 +1,60 @@
+package mage.game.command.emblems;
+
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.effects.common.AdditionalCombatPhaseEffect;
+import mage.abilities.effects.common.UntapTargetEffect;
+import mage.constants.TurnPhase;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.command.Emblem;
+import mage.game.events.GameEvent;
+import mage.target.common.TargetControlledCreaturePermanent;
+
+/**
+ * @author TheElk801
+ */
+public final class ZarielArchdukeOfAvernusEmblem extends Emblem {
+
+ // −6: You get an emblem with "At the end of the first combat phase on your turn, untap target creature you control. After this phase, there is an additional combat phase."
+ public ZarielArchdukeOfAvernusEmblem() {
+ this.setName("Emblem Zariel");
+ this.setExpansionSetCodeForImage("AFR");
+ this.getAbilities().add(new ZarielArchdukeOfAvernusEmblemAbility());
+ }
+}
+
+class ZarielArchdukeOfAvernusEmblemAbility extends TriggeredAbilityImpl {
+
+ ZarielArchdukeOfAvernusEmblemAbility() {
+ super(Zone.COMMAND, new UntapTargetEffect());
+ this.addEffect(new AdditionalCombatPhaseEffect());
+ this.addTarget(new TargetControlledCreaturePermanent());
+ }
+
+ private ZarielArchdukeOfAvernusEmblemAbility(final ZarielArchdukeOfAvernusEmblemAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public ZarielArchdukeOfAvernusEmblemAbility copy() {
+ return new ZarielArchdukeOfAvernusEmblemAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.END_COMBAT_STEP_PRE;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ return game.isActivePlayer(getControllerId())
+ && game.getTurn().getPhase(TurnPhase.COMBAT).getCount() == 0;
+ }
+
+ @Override
+ public String getRule() {
+ return "At the end of the first combat phase on your turn, untap target creature you control. " +
+ "After this phase, there is an additional combat phase.";
+ }
+
+}
\ No newline at end of file
diff --git a/Mage/src/main/java/mage/game/permanent/Permanent.java b/Mage/src/main/java/mage/game/permanent/Permanent.java
index afb3725c4b..ded11c011b 100644
--- a/Mage/src/main/java/mage/game/permanent/Permanent.java
+++ b/Mage/src/main/java/mage/game/permanent/Permanent.java
@@ -75,6 +75,12 @@ public interface Permanent extends Card, Controllable {
int getClassLevel();
+ /**
+ * Level up to next level.
+ *
+ * @param classLevel
+ * @return false on wrong settings (e.g. level up to multiple levels)
+ */
boolean setClassLevel(int classLevel);
void setCardNumber(String cid);
diff --git a/Mage/src/main/java/mage/game/permanent/PermanentCard.java b/Mage/src/main/java/mage/game/permanent/PermanentCard.java
index 6ce8e1062b..ffa2cb18c4 100644
--- a/Mage/src/main/java/mage/game/permanent/PermanentCard.java
+++ b/Mage/src/main/java/mage/game/permanent/PermanentCard.java
@@ -220,4 +220,9 @@ public class PermanentCard extends PermanentImpl {
public Card getMainCard() {
return card.getMainCard();
}
+
+ @Override
+ public String toString() {
+ return card.toString();
+ }
}
diff --git a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java
index 355c92e488..b903450cc1 100644
--- a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java
+++ b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java
@@ -1528,6 +1528,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
@Override
public boolean setClassLevel(int classLevel) {
+ // can level up to next (+1) level only
if (this.classLevel == classLevel - 1) {
this.classLevel = classLevel;
return true;
diff --git a/Mage/src/main/java/mage/game/permanent/token/EldraziHorrorToken.java b/Mage/src/main/java/mage/game/permanent/token/EldraziHorrorToken.java
index 95f042f15b..4c541c96b3 100644
--- a/Mage/src/main/java/mage/game/permanent/token/EldraziHorrorToken.java
+++ b/Mage/src/main/java/mage/game/permanent/token/EldraziHorrorToken.java
@@ -21,7 +21,7 @@ public final class EldraziHorrorToken extends TokenImpl {
}
public EldraziHorrorToken() {
- super("Eldrazi Horror", "3/2 colorless Eldrazi Horror creature");
+ super("Eldrazi Horror", "3/2 colorless Eldrazi Horror creature token");
cardType.add(CardType.CREATURE);
subtype.add(SubType.ELDRAZI);
subtype.add(SubType.HORROR);
diff --git a/Mage/src/main/java/mage/game/permanent/token/GrovetenderDruidsPlantToken.java b/Mage/src/main/java/mage/game/permanent/token/GrovetenderDruidsPlantToken.java
index 424cf239d9..2209491466 100644
--- a/Mage/src/main/java/mage/game/permanent/token/GrovetenderDruidsPlantToken.java
+++ b/Mage/src/main/java/mage/game/permanent/token/GrovetenderDruidsPlantToken.java
@@ -12,7 +12,7 @@ import mage.MageInt;
public final class GrovetenderDruidsPlantToken extends TokenImpl {
public GrovetenderDruidsPlantToken() {
- super("Plant", "1/1 green Plant creature");
+ super("Plant", "1/1 green Plant creature token");
cardType.add(CardType.CREATURE);
color.setGreen(true);
subtype.add(SubType.PLANT);
diff --git a/Mage/src/main/java/mage/game/stack/StackAbility.java b/Mage/src/main/java/mage/game/stack/StackAbility.java
index 61a3969b13..3a6585c0bd 100644
--- a/Mage/src/main/java/mage/game/stack/StackAbility.java
+++ b/Mage/src/main/java/mage/game/stack/StackAbility.java
@@ -692,6 +692,11 @@ public class StackAbility extends StackObjectImpl implements Ability {
return this.ability.getIcons();
}
+ @Override
+ public List getIcons(Game game) {
+ return this.ability.getIcons(game);
+ }
+
@Override
public Ability addIcon(CardIcon cardIcon) {
throw new IllegalArgumentException("Stack ability is not supports icon adding");
diff --git a/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java b/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java
index 452c0cca07..c335c43a0f 100644
--- a/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java
+++ b/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java
@@ -81,7 +81,11 @@ public class CopyTokenFunction implements Function {
for (Ability ability0 : sourceObj.getAbilities()) {
Ability ability = ability0.copy();
- ability.newOriginalId(); // The token is independant from the copy from object so it need a new original Id, otherwise there are problems to check for created continuous effects to check if the source (the Token) has still this ability
+
+ // The token is independant from the copy from object so it need a new original Id,
+ // otherwise there are problems to check for created continuous effects to check if
+ // the source (the Token) has still this ability
+ ability.newOriginalId();
target.addAbility(ability);
}
diff --git a/Mage/src/main/java/mage/watchers/common/ManaSpentToCastWatcher.java b/Mage/src/main/java/mage/watchers/common/ManaSpentToCastWatcher.java
index 67c13a3567..7295a7e462 100644
--- a/Mage/src/main/java/mage/watchers/common/ManaSpentToCastWatcher.java
+++ b/Mage/src/main/java/mage/watchers/common/ManaSpentToCastWatcher.java
@@ -1,6 +1,7 @@
package mage.watchers.common;
import mage.Mana;
+import mage.abilities.Ability;
import mage.constants.WatcherScope;
import mage.constants.Zone;
import mage.game.Game;
@@ -51,8 +52,14 @@ public class ManaSpentToCastWatcher extends Watcher {
return manaMap.getOrDefault(sourceId, null);
}
- public int getAndResetLastXValue(UUID sourceId) {
- return xValueMap.getOrDefault(sourceId, 0);
+ public int getAndResetLastXValue(Ability source) {
+ if (xValueMap.containsKey(source.getSourceId())) {
+ // cast normal way
+ return xValueMap.get(source.getSourceId());
+ } else {
+ // put to battlefield without cast (example: copied spell must keep announced X)
+ return source.getManaCostsToPay().getX();
+ }
}
@Override
diff --git a/Mage/src/test/java/mage/cards/decks/importer/samples/testdeck.json b/Mage/src/test/java/mage/cards/decks/importer/samples/testdeck.json
index 70e99295b8..34c54f991c 100644
--- a/Mage/src/test/java/mage/cards/decks/importer/samples/testdeck.json
+++ b/Mage/src/test/java/mage/cards/decks/importer/samples/testdeck.json
@@ -1008,7 +1008,7 @@
"manaCost": "{1}{U}",
"name": "Chart a Course",
"number": "48",
- "originalText": "Draw two cards. Then discard a card unless you attacked with a creature this turn.",
+ "originalText": "Draw two cards. Then discard a card unless you attacked this turn.",
"originalType": "Sorcery",
"printings": [
"JMP",