diff --git a/Mage.Sets/src/mage/cards/a/AltarOfBhaal.java b/Mage.Sets/src/mage/cards/a/AltarOfBhaal.java
index 35edd0db7b2..377da435a53 100644
--- a/Mage.Sets/src/mage/cards/a/AltarOfBhaal.java
+++ b/Mage.Sets/src/mage/cards/a/AltarOfBhaal.java
@@ -30,7 +30,7 @@ public final class AltarOfBhaal extends AdventureCard {
new ReturnFromGraveyardToBattlefieldTargetEffect(), new ManaCostsImpl<>("{2}{B}")
);
ability.addCost(new TapSourceCost());
- ability.addCost(new ExileTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_CREATURE)));
+ ability.addCost(new ExileTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_A_CREATURE)));
ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/a/ArmsOfHadar.java b/Mage.Sets/src/mage/cards/a/ArmsOfHadar.java
index 7584d6fbadf..64c51cc3feb 100644
--- a/Mage.Sets/src/mage/cards/a/ArmsOfHadar.java
+++ b/Mage.Sets/src/mage/cards/a/ArmsOfHadar.java
@@ -1,11 +1,11 @@
package mage.cards.a;
-import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.abilities.effects.common.continuous.BoostAllEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.Duration;
import mage.constants.TargetController;
-import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent;
import mage.target.TargetPlayer;
@@ -16,7 +16,7 @@ import java.util.UUID;
*/
public final class ArmsOfHadar extends CardImpl {
- private static final FilterPermanent filter = new FilterCreaturePermanent("creatures target player controls");
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures target player controls");
static {
filter.add(TargetController.SOURCE_TARGETS.getControllerPredicate());
@@ -26,7 +26,9 @@ public final class ArmsOfHadar extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{B}");
// Creatures target player controls get -2/-2 until end of turn.
- this.getSpellAbility().addEffect(new BoostTargetEffect(-2, -2));
+ this.getSpellAbility().addEffect(new BoostAllEffect(
+ -2, -2, Duration.EndOfTurn, filter, false
+ ));
this.getSpellAbility().addTarget(new TargetPlayer());
}
diff --git a/Mage.Sets/src/mage/cards/b/BaldursGate.java b/Mage.Sets/src/mage/cards/b/BaldursGate.java
index f7b59b27915..d9136a248d6 100644
--- a/Mage.Sets/src/mage/cards/b/BaldursGate.java
+++ b/Mage.Sets/src/mage/cards/b/BaldursGate.java
@@ -47,7 +47,8 @@ public final class BaldursGate extends CardImpl {
// {2}, {T}: Add X mana of any one color, where X is the number of other Gates you control.
Ability ability = new DynamicManaAbility(
- Mana.AnyMana(1), xValue, new GenericManaCost(2), null, true
+ Mana.AnyMana(1), xValue, new GenericManaCost(2), "Add X mana of any one color, " +
+ "where X is the number of other Gates you control.", true
);
ability.addCost(new TapSourceCost());
this.addAbility(ability.addHint(hint));
diff --git a/Mage.Sets/src/mage/cards/d/DungeoneersPack.java b/Mage.Sets/src/mage/cards/d/DungeoneersPack.java
index 5c3dde31781..55fcca1916b 100644
--- a/Mage.Sets/src/mage/cards/d/DungeoneersPack.java
+++ b/Mage.Sets/src/mage/cards/d/DungeoneersPack.java
@@ -32,7 +32,7 @@ public final class DungeoneersPack extends CardImpl {
Ability ability = new ActivateAsSorceryActivatedAbility(new TakeTheInitiativeEffect(), new GenericManaCost(2));
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeSourceCost());
- ability.addEffect(new GainLifeEffect(3).concatBy(", you"));
+ ability.addEffect(new GainLifeEffect(3).setText("gain 3 life"));
ability.addEffect(new DrawCardSourceControllerEffect(1).concatBy(","));
ability.addEffect(new CreateTokenEffect(new TreasureToken()).concatBy(", and"));
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/f/FlamingFist.java b/Mage.Sets/src/mage/cards/f/FlamingFist.java
index 7288ca0b36e..c377c72640e 100644
--- a/Mage.Sets/src/mage/cards/f/FlamingFist.java
+++ b/Mage.Sets/src/mage/cards/f/FlamingFist.java
@@ -30,7 +30,7 @@ public final class FlamingFist extends CardImpl {
this.addAbility(new SimpleStaticAbility(new GainAbilityAllEffect(
new AttacksTriggeredAbility(new GainAbilitySourceEffect(
DoubleStrikeAbility.getInstance(), Duration.EndOfTurn
- ).setText("it gains double strike until end of turn")),
+ ).setText("it gains double strike until end of turn")).setTriggerPhrase("Whenever this creature attacks, "),
Duration.WhileOnBattlefield, StaticFilters.FILTER_CREATURES_OWNED_COMMANDER
)));
}
diff --git a/Mage.Sets/src/mage/cards/f/FlamingFistOfficer.java b/Mage.Sets/src/mage/cards/f/FlamingFistOfficer.java
index f0eff66bd6e..b99b070c29b 100644
--- a/Mage.Sets/src/mage/cards/f/FlamingFistOfficer.java
+++ b/Mage.Sets/src/mage/cards/f/FlamingFistOfficer.java
@@ -8,7 +8,9 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.counters.CounterType;
-import mage.filter.StaticFilters;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.mageobject.AnotherPredicate;
import java.util.UUID;
@@ -17,6 +19,13 @@ import java.util.UUID;
*/
public final class FlamingFistOfficer extends CardImpl {
+ private static final FilterPermanent filter
+ = new FilterControlledCreaturePermanent("another creature you control");
+
+ static {
+ filter.add(AnotherPredicate.instance);
+ }
+
public FlamingFistOfficer(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}");
@@ -27,8 +36,7 @@ public final class FlamingFistOfficer extends CardImpl {
// Whenever another creature you control leaves the battlefield, put a +1/+1 counter on Flaming Fist Officer.
this.addAbility(new LeavesBattlefieldAllTriggeredAbility(
- new AddCountersSourceEffect(CounterType.P1P1.createInstance()),
- StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE
+ new AddCountersSourceEffect(CounterType.P1P1.createInstance()), filter
));
}
diff --git a/Mage.Sets/src/mage/cards/f/FrayingLine.java b/Mage.Sets/src/mage/cards/f/FrayingLine.java
index ec9f66253a0..692f227c4b8 100644
--- a/Mage.Sets/src/mage/cards/f/FrayingLine.java
+++ b/Mage.Sets/src/mage/cards/f/FrayingLine.java
@@ -45,7 +45,7 @@ public final class FrayingLine extends CardImpl {
// At the beginning of each player's upkeep, that player may pay {2}. If they do, they put a rope counter on a creature they control. Otherwise, exile Fraying Line and each creature without a rope counter on it, then remove all rope counters from all creatures.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(
- new FrayingLineEffect(), TargetController.ACTIVE, true
+ new FrayingLineEffect(), TargetController.ACTIVE, false
));
}
diff --git a/Mage.Sets/src/mage/cards/g/GateColossus.java b/Mage.Sets/src/mage/cards/g/GateColossus.java
index a09cdfe9a37..1737658205c 100644
--- a/Mage.Sets/src/mage/cards/g/GateColossus.java
+++ b/Mage.Sets/src/mage/cards/g/GateColossus.java
@@ -2,7 +2,7 @@ package mage.cards.g;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
+import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.dynamicvalue.common.GateYouControlCount;
import mage.abilities.effects.common.PutOnLibrarySourceEffect;
@@ -41,7 +41,7 @@ public final class GateColossus extends CardImpl {
this.addAbility(new DauntAbility());
// Whenever a Gate enters the battlefield under your control, you may put Gate Colossus from your graveyard on top of your library.
- this.addAbility(new EntersBattlefieldAllTriggeredAbility(
+ this.addAbility(new EntersBattlefieldControlledTriggeredAbility(
Zone.GRAVEYARD,
new PutOnLibrarySourceEffect(
true, "put {this} from your graveyard on top of your library"
diff --git a/Mage.Sets/src/mage/cards/g/GiantAnkheg.java b/Mage.Sets/src/mage/cards/g/GiantAnkheg.java
index 4bdd2029fd2..e779ac93598 100644
--- a/Mage.Sets/src/mage/cards/g/GiantAnkheg.java
+++ b/Mage.Sets/src/mage/cards/g/GiantAnkheg.java
@@ -43,7 +43,7 @@ public final class GiantAnkheg extends CardImpl {
ability.addEffect(new GainAbilityControlledEffect(
new WardAbility(new GenericManaCost(2), false), Duration.WhileOnBattlefield,
StaticFilters.FILTER_PERMANENT_CREATURES, true
- ));
+ ).setText("and ward {2}"));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/g/GorionWiseMentor.java b/Mage.Sets/src/mage/cards/g/GorionWiseMentor.java
index 2a2b1871a8d..b4ac277f9b5 100644
--- a/Mage.Sets/src/mage/cards/g/GorionWiseMentor.java
+++ b/Mage.Sets/src/mage/cards/g/GorionWiseMentor.java
@@ -40,7 +40,7 @@ public final class GorionWiseMentor extends CardImpl {
// Whenever you cast an Adventure spell, you may copy it. You may choose new targets for the copy.
this.addAbility(new SpellCastControllerTriggeredAbility(
new CopyTargetSpellEffect(true).withSpellName("it"),
- filter, false, true
+ filter, true, true
));
}
diff --git a/Mage.Sets/src/mage/cards/g/GraySlaad.java b/Mage.Sets/src/mage/cards/g/GraySlaad.java
index 1b8a37ca542..beb85c625c2 100644
--- a/Mage.Sets/src/mage/cards/g/GraySlaad.java
+++ b/Mage.Sets/src/mage/cards/g/GraySlaad.java
@@ -43,6 +43,7 @@ public final class GraySlaad extends AdventureCard {
ability.addEffect(new ConditionalContinuousEffect(new GainAbilitySourceEffect(
DeathtouchAbility.getInstance(), Duration.WhileOnBattlefield
), condition, "and deathtouch"));
+ this.addAbility(ability);
// Entropic Decay
// Mill four cards.
diff --git a/Mage.Sets/src/mage/cards/g/GuardianBeast.java b/Mage.Sets/src/mage/cards/g/GuardianBeast.java
index 6cf9aeb058f..7d2943de535 100644
--- a/Mage.Sets/src/mage/cards/g/GuardianBeast.java
+++ b/Mage.Sets/src/mage/cards/g/GuardianBeast.java
@@ -17,8 +17,6 @@ import mage.constants.SubType;
import mage.filter.FilterObject;
import mage.filter.FilterStackObject;
import mage.filter.StaticFilters;
-import mage.filter.common.FilterControlledArtifactPermanent;
-import mage.filter.predicate.Predicates;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
@@ -33,12 +31,10 @@ import java.util.UUID;
public final class GuardianBeast extends CardImpl {
private static final FilterObject filterAura = new FilterStackObject("auras");
- private static final FilterControlledArtifactPermanent filter = new FilterControlledArtifactPermanent("Noncreature artifacts");
static {
filterAura.add(CardType.ENCHANTMENT.getPredicate());
filterAura.add(SubType.AURA.getPredicate());
- filter.add(Predicates.not(CardType.CREATURE.getPredicate()));
}
public GuardianBeast(UUID ownerId, CardSetInfo setInfo) {
@@ -51,7 +47,8 @@ public final class GuardianBeast extends CardImpl {
// This effect doesn't remove Auras already attached to those artifacts.
Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect(
new GainAbilityControlledEffect(
- IndestructibleAbility.getInstance(), Duration.WhileOnBattlefield, filter
+ IndestructibleAbility.getInstance(), Duration.WhileOnBattlefield,
+ StaticFilters.FILTER_ARTIFACT_NON_CREATURE
), SourceTappedCondition.UNTAPPED, "As long as {this} is untapped, " +
"noncreature artifacts you control can't be enchanted, they're indestructible"
));
@@ -113,7 +110,7 @@ class GuardianBeastConditionalEffect extends ContinuousRuleModifyingEffectImpl {
|| ((event.getType() == GameEvent.EventType.ATTACH
|| event.getType() == GameEvent.EventType.TARGET)
&& spell != null && spell.isEnchantment(game) && spell.hasSubtype(SubType.AURA, game))) {
- for (Permanent perm : game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_ARTIFACTS_NON_CREATURE, source.getControllerId(), game)) {
+ for (Permanent perm : game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_ARTIFACT_NON_CREATURE, source.getControllerId(), game)) {
if (perm != null && Objects.equals(perm.getId(), targetPermanent.getId()) && !perm.isCreature(game)) {
return true;
}
diff --git a/Mage.Sets/src/mage/cards/i/InspiringLeader.java b/Mage.Sets/src/mage/cards/i/InspiringLeader.java
index e970a68eab6..0b9da92b4ea 100644
--- a/Mage.Sets/src/mage/cards/i/InspiringLeader.java
+++ b/Mage.Sets/src/mage/cards/i/InspiringLeader.java
@@ -30,7 +30,7 @@ public final class InspiringLeader extends CardImpl {
2, 2, Duration.WhileOnBattlefield,
StaticFilters.FILTER_CREATURE_TOKENS
)), Duration.WhileOnBattlefield, StaticFilters.FILTER_CREATURES_OWNED_COMMANDER
- )));
+ ).withForceQuotes()));
}
private InspiringLeader(final InspiringLeader card) {
diff --git a/Mage.Sets/src/mage/cards/j/JavelinOfLightning.java b/Mage.Sets/src/mage/cards/j/JavelinOfLightning.java
index 9bfd3b0de08..c939738da92 100644
--- a/Mage.Sets/src/mage/cards/j/JavelinOfLightning.java
+++ b/Mage.Sets/src/mage/cards/j/JavelinOfLightning.java
@@ -41,7 +41,7 @@ public final class JavelinOfLightning extends CardImpl {
"as long as it's your turn, equipped creature gets +2/+0"));
ability.addEffect(new ConditionalContinuousEffect(new GainAbilityAttachedEffect(
FirstStrikeAbility.getInstance(), AttachmentType.EQUIPMENT
- ), MyTurnCondition.instance, "and first strike"));
+ ), MyTurnCondition.instance, "and has first strike"));
this.addAbility(ability.addHint(MyTurnHint.instance));
// Equip {4}
diff --git a/Mage.Sets/src/mage/cards/k/KenkuArtificer.java b/Mage.Sets/src/mage/cards/k/KenkuArtificer.java
index e0d56efe388..9a62611f655 100644
--- a/Mage.Sets/src/mage/cards/k/KenkuArtificer.java
+++ b/Mage.Sets/src/mage/cards/k/KenkuArtificer.java
@@ -50,7 +50,7 @@ public final class KenkuArtificer extends CardImpl {
.withAbility(FlyingAbility.getInstance()),
false, false, Duration.EndOfTurn
).setText("That artifact becomes a 0/0 Homunculus artifact creature with flying"));
- ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_ARTIFACTS_NON_CREATURE));
+ ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_ARTIFACT_NON_CREATURE));
this.addAbility(ability.withFlavorWord("Homunculus Servant"));
}
diff --git a/Mage.Sets/src/mage/cards/m/MahadiEmporiumMaster.java b/Mage.Sets/src/mage/cards/m/MahadiEmporiumMaster.java
index 4b782fa5aba..2517e05b471 100644
--- a/Mage.Sets/src/mage/cards/m/MahadiEmporiumMaster.java
+++ b/Mage.Sets/src/mage/cards/m/MahadiEmporiumMaster.java
@@ -34,7 +34,7 @@ public final class MahadiEmporiumMaster extends CardImpl {
this.addAbility(new BeginningOfEndStepTriggeredAbility(
new CreateTokenEffect(
new TreasureToken(), CreaturesDiedThisTurnCount.instance
- ), TargetController.YOU, false
+ ).setText("create a Treasure token for each creature that died this turn"), TargetController.YOU, false
).addHint(CreaturesDiedThisTurnHint.instance), new CreaturesDiedWatcher());
}
diff --git a/Mage.Sets/src/mage/cards/m/MoonshaePixie.java b/Mage.Sets/src/mage/cards/m/MoonshaePixie.java
index 5f2cc9b0556..77f02135983 100644
--- a/Mage.Sets/src/mage/cards/m/MoonshaePixie.java
+++ b/Mage.Sets/src/mage/cards/m/MoonshaePixie.java
@@ -15,10 +15,11 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.WatcherScope;
+import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.events.DamagedEvent;
import mage.game.events.GameEvent;
-import mage.target.common.TargetCreaturePermanent;
+import mage.target.TargetPermanent;
import mage.watchers.Watcher;
import java.util.HashSet;
@@ -51,7 +52,9 @@ public final class MoonshaePixie extends AdventureCard {
// Pixie Dust
// Up to three target creatures gain flying until end of turn.
this.getSpellCard().getSpellAbility().addEffect(new GainAbilityTargetEffect(FlyingAbility.getInstance()));
- this.getSpellCard().getSpellAbility().addTarget(new TargetCreaturePermanent(0, 3));
+ this.getSpellCard().getSpellAbility().addTarget(new TargetPermanent(
+ 0, 3, StaticFilters.FILTER_PERMANENT_CREATURES
+ ));
}
private MoonshaePixie(final MoonshaePixie card) {
diff --git a/Mage.Sets/src/mage/cards/m/MyrkulsInvoker.java b/Mage.Sets/src/mage/cards/m/MyrkulsInvoker.java
index 4e405562db7..31e177bd67f 100644
--- a/Mage.Sets/src/mage/cards/m/MyrkulsInvoker.java
+++ b/Mage.Sets/src/mage/cards/m/MyrkulsInvoker.java
@@ -38,7 +38,7 @@ public final class MyrkulsInvoker extends CardImpl {
ability.addEffect(new GainAbilityControlledEffect(
new MenaceAbility(false), Duration.EndOfTurn,
StaticFilters.FILTER_CONTROLLED_CREATURE
- ).setText("and gain menace until end of turn " +
+ ).setText("and gain menace until end of turn. " +
"(A creature with menace can't be blocked except by two or more creatures.)"));
this.addAbility(ability.withFlavorWord("Psychic Blades"));
}
diff --git a/Mage.Sets/src/mage/cards/m/MysteryKey.java b/Mage.Sets/src/mage/cards/m/MysteryKey.java
index ed7b00207a3..70dcc7f2e25 100644
--- a/Mage.Sets/src/mage/cards/m/MysteryKey.java
+++ b/Mage.Sets/src/mage/cards/m/MysteryKey.java
@@ -28,7 +28,7 @@ public final class MysteryKey extends CardImpl {
new DrawCardSourceControllerEffect(3),
new SacrificeSourceCost(), null, false
), "equipped", false
- ));
+ ).setTriggerPhrase("When equipped creature deals combat damage to a player, "));
// Equip {1}
this.addAbility(new EquipAbility(1));
diff --git a/Mage.Sets/src/mage/cards/n/NemesisPhoenix.java b/Mage.Sets/src/mage/cards/n/NemesisPhoenix.java
index 0dc22b02558..dbbcefb6b69 100644
--- a/Mage.Sets/src/mage/cards/n/NemesisPhoenix.java
+++ b/Mage.Sets/src/mage/cards/n/NemesisPhoenix.java
@@ -37,7 +37,8 @@ public final class NemesisPhoenix extends CardImpl {
// {2}{R}: Return Nemesis Phoenix from your graveyard to the battlefield tapped and attacking. Activate only during the declare attackers step and only if you're attacking two or more opponents.
this.addAbility(new ActivateIfConditionActivatedAbility(
Zone.GRAVEYARD,
- new ReturnToBattlefieldUnderOwnerControlSourceEffect(true, true, -1),
+ new ReturnToBattlefieldUnderOwnerControlSourceEffect(true, true, -1)
+ .setText("return {this} from your graveyard to the battlefield tapped and attacking"),
new ManaCostsImpl<>("{2}{R}"), NemesisPhoenixCondition.instance
));
}
diff --git a/Mage.Sets/src/mage/cards/o/OjiTheExquisiteBlade.java b/Mage.Sets/src/mage/cards/o/OjiTheExquisiteBlade.java
index 33e8b51af6b..7eaab4c52d5 100644
--- a/Mage.Sets/src/mage/cards/o/OjiTheExquisiteBlade.java
+++ b/Mage.Sets/src/mage/cards/o/OjiTheExquisiteBlade.java
@@ -33,7 +33,7 @@ public final class OjiTheExquisiteBlade extends CardImpl {
// When Oji, the Exquisite Blade enters the battlefield, you gain 2 life and scry 2.
Ability ability = new EntersBattlefieldTriggeredAbility(new GainLifeEffect(2));
- ability.addEffect(new ScryEffect(2, false));
+ ability.addEffect(new ScryEffect(2, false).concatBy("and"));
this.addAbility(ability);
// Whenever you cast your second spell each turn, exile up to one target creature you control, then return it to the battlefield under its owner's control.
diff --git a/Mage.Sets/src/mage/cards/r/RasaadYnBashir.java b/Mage.Sets/src/mage/cards/r/RasaadYnBashir.java
index 4de3acbda82..817cc9fbb6a 100644
--- a/Mage.Sets/src/mage/cards/r/RasaadYnBashir.java
+++ b/Mage.Sets/src/mage/cards/r/RasaadYnBashir.java
@@ -39,7 +39,7 @@ public final class RasaadYnBashir extends CardImpl {
// Each creature you control assigns combat damage equal to its toughness rather than its power.
this.addAbility(new SimpleStaticAbility(new CombatDamageByToughnessEffect(
- StaticFilters.FILTER_PERMANENT_CREATURE, false
+ StaticFilters.FILTER_PERMANENT_CREATURE, true
)));
// Whenever Rasaad yn Bashir attacks, if you have the initiative, double the toughness of each creature you control until end of turn.
diff --git a/Mage.Sets/src/mage/cards/r/RecruitmentDrive.java b/Mage.Sets/src/mage/cards/r/RecruitmentDrive.java
index 49c8bc5b1dc..6afc9ab4e79 100644
--- a/Mage.Sets/src/mage/cards/r/RecruitmentDrive.java
+++ b/Mage.Sets/src/mage/cards/r/RecruitmentDrive.java
@@ -5,8 +5,8 @@ import mage.abilities.effects.common.RollDieWithResultTableEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.game.permanent.token.KnightToken;
import mage.game.permanent.token.SoldierToken;
+import mage.game.permanent.token.WaylayToken;
import java.util.UUID;
@@ -25,10 +25,10 @@ public final class RecruitmentDrive extends CardImpl {
effect.addTableEntry(1, 9, new CreateTokenEffect(new SoldierToken(), 2));
// 10-19 | Create two 2/2 white Knight creature tokens.
- effect.addTableEntry(10, 19, new CreateTokenEffect(new KnightToken(), 2));
+ effect.addTableEntry(10, 19, new CreateTokenEffect(new WaylayToken(), 2));
// 20 | Create three 2/2 white Knight creature tokens.
- effect.addTableEntry(20, 20, new CreateTokenEffect(new KnightToken(), 3));
+ effect.addTableEntry(20, 20, new CreateTokenEffect(new WaylayToken(), 3));
this.getSpellAbility().addEffect(effect);
}
diff --git a/Mage.Sets/src/mage/cards/s/SharpshooterElf.java b/Mage.Sets/src/mage/cards/s/SharpshooterElf.java
index 6fe2a6120aa..67f5e88b821 100644
--- a/Mage.Sets/src/mage/cards/s/SharpshooterElf.java
+++ b/Mage.Sets/src/mage/cards/s/SharpshooterElf.java
@@ -59,6 +59,7 @@ public final class SharpshooterElf extends CardImpl {
new DamageTargetEffect(xValue, "it"), true
);
ability.addTarget(new TargetPermanent(filter));
+ this.addAbility(ability);
}
private SharpshooterElf(final SharpshooterElf card) {
diff --git a/Mage.Sets/src/mage/cards/s/SkanosDragonheart.java b/Mage.Sets/src/mage/cards/s/SkanosDragonheart.java
index 0762ed97e1e..a1f7fe5d5d8 100644
--- a/Mage.Sets/src/mage/cards/s/SkanosDragonheart.java
+++ b/Mage.Sets/src/mage/cards/s/SkanosDragonheart.java
@@ -46,7 +46,8 @@ public final class SkanosDragonheart extends CardImpl {
// Whenever Skanos Dragonheart attacks, it gets +X/+X until end of turn, where X is the greatest power among Dragon cards in your graveyard or other Dragons you control.
this.addAbility(new AttacksTriggeredAbility(new BoostSourceEffect(
- SkanosDragonheartValue.instance, SkanosDragonheartValue.instance, Duration.EndOfTurn
+ SkanosDragonheartValue.instance, SkanosDragonheartValue.instance,
+ Duration.EndOfTurn, true, "it"
)).addHint(hint));
// Choose a Background
diff --git a/Mage.Sets/src/mage/cards/s/StreetUrchin.java b/Mage.Sets/src/mage/cards/s/StreetUrchin.java
index ee09ecb99d5..cd6ad01a1f2 100644
--- a/Mage.Sets/src/mage/cards/s/StreetUrchin.java
+++ b/Mage.Sets/src/mage/cards/s/StreetUrchin.java
@@ -14,6 +14,7 @@ import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.StaticFilters;
+import mage.target.common.TargetAnyTarget;
import java.util.UUID;
@@ -33,6 +34,7 @@ public final class StreetUrchin extends CardImpl {
new DamageTargetEffect(1, "this creature"), new GenericManaCost(1)
);
ability.addCost(new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_ARTIFACT_OR_OTHER_CREATURE));
+ ability.addTarget(new TargetAnyTarget());
this.addAbility(new SimpleStaticAbility(new GainAbilityAllEffect(
ability, Duration.WhileOnBattlefield,
StaticFilters.FILTER_CREATURES_OWNED_COMMANDER
diff --git a/Mage.Sets/src/mage/cards/t/Thunderwave.java b/Mage.Sets/src/mage/cards/t/Thunderwave.java
index d3f210b11b0..ca17ef0cdda 100644
--- a/Mage.Sets/src/mage/cards/t/Thunderwave.java
+++ b/Mage.Sets/src/mage/cards/t/Thunderwave.java
@@ -36,6 +36,8 @@ public final class Thunderwave extends CardImpl {
// 20 | Thunderwave deals 6 damage to each creature your opponents control.
effect.addTableEntry(20, 20, new DamageAllEffect(6, StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE));
+
+ this.getSpellAbility().addEffect(effect);
}
private Thunderwave(final Thunderwave card) {
diff --git a/Mage.Sets/src/mage/cards/w/WarehouseThief.java b/Mage.Sets/src/mage/cards/w/WarehouseThief.java
index 190ea6e71c6..e25ee6f0183 100644
--- a/Mage.Sets/src/mage/cards/w/WarehouseThief.java
+++ b/Mage.Sets/src/mage/cards/w/WarehouseThief.java
@@ -10,6 +10,7 @@ import mage.abilities.effects.common.ExileTopXMayPlayUntilEndOfTurnEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
@@ -40,7 +41,7 @@ public final class WarehouseThief extends CardImpl {
// {2}, {T}, Sacrifice an artifact or creature: Exile the top card of your library. Until the end of your next turn, you may play that card.
Ability ability = new SimpleActivatedAbility(
- new ExileTopXMayPlayUntilEndOfTurnEffect(1), new GenericManaCost(2)
+ new ExileTopXMayPlayUntilEndOfTurnEffect(1, false, Duration.UntilEndOfYourNextTurn), new GenericManaCost(2)
);
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeTargetCost(filter));
diff --git a/Mage.Sets/src/mage/cards/y/YouLookUponTheTarrasque.java b/Mage.Sets/src/mage/cards/y/YouLookUponTheTarrasque.java
index 3bcc1c633c4..e74b0146881 100644
--- a/Mage.Sets/src/mage/cards/y/YouLookUponTheTarrasque.java
+++ b/Mage.Sets/src/mage/cards/y/YouLookUponTheTarrasque.java
@@ -3,7 +3,7 @@ package mage.cards.y;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.effects.RequirementEffect;
-import mage.abilities.effects.common.PreventAllNonCombatDamageToAllEffect;
+import mage.abilities.effects.common.PreventAllDamageToAllEffect;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.IndestructibleAbility;
@@ -11,7 +11,10 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
+import mage.constants.TargetController;
+import mage.filter.FilterPlayer;
import mage.filter.StaticFilters;
+import mage.filter.common.FilterPermanentOrPlayer;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.common.TargetCreaturePermanent;
@@ -23,14 +26,21 @@ import java.util.UUID;
*/
public final class YouLookUponTheTarrasque extends CardImpl {
+ private static final FilterPermanentOrPlayer filter = new FilterPermanentOrPlayer(
+ "you and creatures you control",
+ StaticFilters.FILTER_CONTROLLED_CREATURES, new FilterPlayer()
+ );
+
+ static {
+ filter.getPlayerFilter().add(TargetController.YOU.getPlayerPredicate());
+ }
+
public YouLookUponTheTarrasque(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{G}");
// Choose one —
// • Run and Hide — Prevent all combat damage that would be dealt to you and creatures you control this turn.
- this.getSpellAbility().addEffect(new PreventAllNonCombatDamageToAllEffect(
- Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURES, true
- ));
+ this.getSpellAbility().addEffect(new PreventAllDamageToAllEffect(Duration.EndOfTurn, filter, true));
this.getSpellAbility().withFirstModeFlavorWord("Run and Hide");
// • Gather Your Courage — Target creature gets +5/+5 and gains indestructible until end of turn. All creatures your opponents control able to block that creature this turn do so.
diff --git a/Mage.Sets/src/mage/cards/y/YouveBeenCaughtStealing.java b/Mage.Sets/src/mage/cards/y/YouveBeenCaughtStealing.java
index bd7297dd418..5f5fe68339c 100644
--- a/Mage.Sets/src/mage/cards/y/YouveBeenCaughtStealing.java
+++ b/Mage.Sets/src/mage/cards/y/YouveBeenCaughtStealing.java
@@ -33,7 +33,7 @@ public final class YouveBeenCaughtStealing extends CardImpl {
// • Bribe the Guards — You create a Treasure token for each opponent who was dealt damage this turn.
this.getSpellAbility().addMode(new Mode(new CreateTokenEffect(
new TreasureToken(), YouveBeenCaughtStealingValue.instance
- )).withFlavorWord("Bribe the Guards"));
+ ).setText("you create a Treasure token for each opponent who was dealt damage this turn")).withFlavorWord("Bribe the Guards"));
}
private YouveBeenCaughtStealing(final YouveBeenCaughtStealing card) {
diff --git a/Mage.Sets/src/mage/cards/z/ZevlorElturelExile.java b/Mage.Sets/src/mage/cards/z/ZevlorElturelExile.java
index a72e2b21fb7..abb6665577c 100644
--- a/Mage.Sets/src/mage/cards/z/ZevlorElturelExile.java
+++ b/Mage.Sets/src/mage/cards/z/ZevlorElturelExile.java
@@ -123,7 +123,7 @@ class ZevlorElturelExileTriggeredAbility extends DelayedTriggeredAbility {
@Override
public String getRule() {
- return "When you next cast an instant or sorcery spell that targets only a single opponent or a single permanent an opponent controls this turn, for each other opponent, choose that player or a permanent they control, copy that spell, and the copy targets the chosen permanent.";
+ return "When you next cast an instant or sorcery spell that targets only a single opponent or a single permanent an opponent controls this turn, for each other opponent, choose that player or a permanent they control, copy that spell, and the copy targets the chosen player or permanent.";
}
}
diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java
index 70cd21e0a0e..a296656d482 100644
--- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java
+++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java
@@ -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 = "ELD"; // check all abilities and output cards with wrong abilities texts;
+ private static final String FULL_ABILITIES_CHECK_SET_CODE = "CLB"; // 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
@@ -83,7 +83,7 @@ public class VerifyCardDataTest {
private static final List evergreenKeywords = Arrays.asList(
"flying", "lifelink", "menace", "trample", "haste", "first strike", "hexproof", "fear",
"deathtouch", "double strike", "indestructible", "reach", "flash", "defender", "vigilance",
- "plainswalk", "islandwalk", "swampwalk", "mountainwalk", "forestwalk"
+ "plainswalk", "islandwalk", "swampwalk", "mountainwalk", "forestwalk", "myriad"
);
static {
diff --git a/Mage/src/main/java/mage/abilities/effects/common/PreventAllDamageToAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/PreventAllDamageToAllEffect.java
index c7b95c41beb..e67820c7531 100644
--- a/Mage/src/main/java/mage/abilities/effects/common/PreventAllDamageToAllEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/common/PreventAllDamageToAllEffect.java
@@ -1,5 +1,6 @@
package mage.abilities.effects.common;
+import mage.MageItem;
import mage.abilities.Ability;
import mage.abilities.effects.PreventionEffectImpl;
import mage.constants.Duration;
@@ -10,10 +11,9 @@ import mage.filter.predicate.other.PlayerIdPredicate;
import mage.filter.predicate.permanent.PermanentIdPredicate;
import mage.game.Game;
import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
import java.util.UUID;
-import mage.MageItem;
-import mage.game.events.GameEvent.EventType;
/**
* @author BetaSteward_at_googlemail.com
@@ -41,7 +41,8 @@ public class PreventAllDamageToAllEffect extends PreventionEffectImpl {
+ (onlyCombat ? "combat " : "")
+ "damage that would be dealt to "
+ filter.getMessage()
- + (duration.toString().isEmpty() ? "" : ' ' + duration.toString());
+ + (duration.toString().isEmpty() ? "" : ' ')
+ + (duration == Duration.EndOfTurn ? "this turn" : duration.toString());
}
public PreventAllDamageToAllEffect(final PreventAllDamageToAllEffect effect) {
@@ -85,12 +86,12 @@ public class PreventAllDamageToAllEffect extends PreventionEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (super.applies(event, source, game)) {
- MageItem object ;
- if(EventType.DAMAGE_PLAYER.equals(event.getType())) {
- object = game.getPlayer(event.getTargetId());
+ MageItem object;
+ if (EventType.DAMAGE_PLAYER.equals(event.getType())) {
+ object = game.getPlayer(event.getTargetId());
} else {
object = game.getObject(event.getTargetId());
- }
+ }
if (object != null) {
return filter.match(object, source.getControllerId(), source, game);
}
diff --git a/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java
index 41595adeb20..5a2992845ff 100644
--- a/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java
@@ -68,7 +68,10 @@ public class UntapTargetEffect extends OneShotEffect {
if (target.getMaxNumberOfTargets() > 1 || target.getNumberOfTargets() == 0) {
sb.append(CardUtil.numberToText(target.getMaxNumberOfTargets()));
sb.append(haveTargetWord ? " " : " target ");
- sb.append(target.getTargetName()).append('s');
+ sb.append(target.getTargetName());
+ if (!target.getTargetName().endsWith("s")) {
+ sb.append('s');
+ }
} else {
sb.append(haveTargetWord ? "" : "target ");
sb.append(target.getTargetName());
diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityAllEffect.java
index c15339bbf43..a7733b22ab7 100644
--- a/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityAllEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityAllEffect.java
@@ -7,10 +7,14 @@ import mage.abilities.TriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.mana.ActivatedManaAbilityImpl;
-import mage.constants.*;
+import mage.constants.Duration;
+import mage.constants.Layer;
+import mage.constants.Outcome;
+import mage.constants.SubLayer;
import mage.filter.FilterPermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
+import mage.util.CardUtil;
import java.util.Iterator;
import java.util.Locale;
@@ -136,7 +140,7 @@ public class GainAbilityAllEffect extends ContinuousEffectImpl {
boolean quotes = forceQuotes
|| ability instanceof SimpleActivatedAbility
- ||ability instanceof ActivatedManaAbilityImpl
+ || ability instanceof ActivatedManaAbilityImpl
|| ability instanceof TriggeredAbility;
boolean each = filter.getMessage().toLowerCase(Locale.ENGLISH).startsWith("each");
if (excludeSource && !each) {
@@ -150,10 +154,10 @@ public class GainAbilityAllEffect extends ContinuousEffectImpl {
}
if (quotes) {
sb.append('"');
- }
- sb.append(ability.getRule());
- if (quotes) {
+ sb.append(CardUtil.getTextWithFirstCharUpperCase(ability.getRule()));
sb.append('"');
+ } else {
+ sb.append(ability.getRule());
}
if (!duration.toString().isEmpty()) {
sb.append(' ').append(duration.toString());
diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityTargetEffect.java
index a11fdc53250..1e6c99f7c28 100644
--- a/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityTargetEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityTargetEffect.java
@@ -9,6 +9,7 @@ import mage.constants.*;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.Target;
+import mage.util.CardUtil;
import java.util.*;
@@ -218,7 +219,7 @@ public class GainAbilityTargetEffect extends ContinuousEffectImpl {
if (target.getNumberOfTargets() < target.getMaxNumberOfTargets()) {
sb.append("up to ");
}
- sb.append(target.getMaxNumberOfTargets()).append(" target ").append(target.getTargetName()).append(" gain ");
+ sb.append(CardUtil.numberToText(target.getMaxNumberOfTargets())).append(" target ").append(target.getTargetName()).append(" gain ");
} else {
if (!target.getTargetName().toLowerCase(Locale.ENGLISH).startsWith("another")) {
sb.append("target ");
diff --git a/Mage/src/main/java/mage/abilities/keyword/MyriadAbility.java b/Mage/src/main/java/mage/abilities/keyword/MyriadAbility.java
index 0aaa7018e28..10fdd3bab2e 100644
--- a/Mage/src/main/java/mage/abilities/keyword/MyriadAbility.java
+++ b/Mage/src/main/java/mage/abilities/keyword/MyriadAbility.java
@@ -23,7 +23,7 @@ public class MyriadAbility extends AttacksTriggeredAbility {
public MyriadAbility() {
super(new MyriadEffect(), false,
- "Myriad (Whenever this creature attacks, for each opponent other than the defending player, "
+ "myriad (Whenever this creature attacks, for each opponent other than the defending player, "
+ "put a token that's a copy of this creature onto the battlefield tapped and attacking "
+ "that player or a planeswalker they control. Exile those tokens at the end of combat.)",
SetTargetPointer.PLAYER
diff --git a/Mage/src/main/java/mage/filter/StaticFilters.java b/Mage/src/main/java/mage/filter/StaticFilters.java
index 7ee78e3f69b..05f87b46219 100644
--- a/Mage/src/main/java/mage/filter/StaticFilters.java
+++ b/Mage/src/main/java/mage/filter/StaticFilters.java
@@ -301,11 +301,11 @@ public final class StaticFilters {
FILTER_PERMANENTS_ARTIFACT_CREATURE.setLockedFilter(true);
}
- public static final FilterControlledArtifactPermanent FILTER_ARTIFACTS_NON_CREATURE = new FilterControlledArtifactPermanent("Noncreature artifacts");
+ public static final FilterControlledArtifactPermanent FILTER_ARTIFACT_NON_CREATURE = new FilterControlledArtifactPermanent("noncreature artifact");
static {
- FILTER_ARTIFACTS_NON_CREATURE.add(Predicates.not(CardType.CREATURE.getPredicate()));
- FILTER_ARTIFACTS_NON_CREATURE.setLockedFilter(true);
+ FILTER_ARTIFACT_NON_CREATURE.add(Predicates.not(CardType.CREATURE.getPredicate()));
+ FILTER_ARTIFACT_NON_CREATURE.setLockedFilter(true);
}
public static final FilterPermanent FILTER_PERMANENT_ARTIFACT_OR_CREATURE = new FilterPermanent("artifact or creature");