diff --git a/Mage.Sets/src/mage/cards/c/CometStellarPup.java b/Mage.Sets/src/mage/cards/c/CometStellarPup.java
new file mode 100644
index 00000000000..e4e864ab3f8
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/CometStellarPup.java
@@ -0,0 +1,189 @@
+package mage.cards.c;
+
+import mage.MageObjectReference;
+import mage.abilities.Ability;
+import mage.abilities.LoyaltyAbility;
+import mage.abilities.dynamicvalue.common.CountersSourceCount;
+import mage.abilities.effects.ContinuousEffectImpl;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.abilities.effects.common.counter.RemoveCounterSourceEffect;
+import mage.abilities.keyword.HasteAbility;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.*;
+import mage.counters.CounterType;
+import mage.filter.FilterCard;
+import mage.filter.predicate.mageobject.ManaValuePredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.game.permanent.token.SquirrelToken;
+import mage.game.permanent.token.Token;
+import mage.players.Player;
+import mage.target.TargetCard;
+import mage.target.common.TargetCardInYourGraveyard;
+import mage.target.common.TargetCreatureOrPlayer;
+import mage.target.targetpointer.FixedTarget;
+import mage.target.targetpointer.FixedTargets;
+
+import java.util.UUID;
+
+/**
+ * @author Susucr
+ */
+public final class CometStellarPup extends CardImpl {
+
+ public CometStellarPup(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{R}{W}");
+
+ this.supertype.add(SuperType.LEGENDARY);
+ this.subtype.add(SubType.COMET);
+ this.setStartingLoyalty(5);
+
+ // 0: Roll a six-sided die.
+ // 1 or 2 -- [+2] , then create two 1/1 green Squirrel creature tokens. They gain haste until end of turn.
+ // 3 -- [-1], then return a card with mana value 2 or less from your graveyard to your hand.
+ // 4 or 5 -- Comet, Stellar Pup deals damage equal to the number of loyalty counters on him to a creature or player, then [-2].
+ // 6 -- [+1], and you may activate Comet, Stellar Pup's loyalty ability two more times this turn.
+ this.addAbility(new LoyaltyAbility(new CometStellarPupAbility(), 0));
+ }
+
+ private CometStellarPup(final CometStellarPup card) {
+ super(card);
+ }
+
+ @Override
+ public CometStellarPup copy() {
+ return new CometStellarPup(this);
+ }
+}
+
+class CometStellarPupAbility extends OneShotEffect {
+
+ private static final FilterCard filterCard =
+ new FilterCard("card with mana value 2 or less from your graveyard");
+
+ static {
+ filterCard.add(new ManaValuePredicate(ComparisonType.OR_LESS, 2));
+ }
+
+ CometStellarPupAbility() {
+ super(Outcome.Benefit);
+ staticText = "Roll a six-sided die.
"
+ + "1 or 2 — [+2] , then create two 1/1 green Squirrel creature tokens. They gain haste until end of turn.
"
+ + "3 — [-1], then return a card with mana value 2 or less from your graveyard to your hand.
"
+ + "4 or 5 — {this} deals damage equal to the number of loyalty counters on him to a creature or player, then [-2].
"
+ + "6 — [+1], and you may activate Comet, Stellar Pup's loyalty ability two more times this turn.";
+ }
+
+ private CometStellarPupAbility(final CometStellarPupAbility effect) {
+ super(effect);
+ }
+
+ @Override
+ public CometStellarPupAbility copy() {
+ return new CometStellarPupAbility(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getControllerId());
+ if (player == null) {
+ return false;
+ }
+ int result = player.rollDice(outcome, source, game, 6);
+ if (result == 1 || result == 2) {
+ // [+2]
+ new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(2))
+ .apply(game, source);
+
+ // Create two 1/1 green Squirrel creature tokens.
+ Token token = new SquirrelToken();
+ token.putOntoBattlefield(2, game, source);
+
+ // They gain haste until end of turn.
+ game.addEffect(new GainAbilityTargetEffect(
+ HasteAbility.getInstance(), Duration.EndOfTurn
+ ).setTargetPointer(new FixedTargets(token, game)), source);
+ } else if (result == 3) {
+ // [-1]
+ new RemoveCounterSourceEffect(CounterType.LOYALTY.createInstance(1))
+ .apply(game, source);
+
+ // return a card with mana value 2 or less from your graveyard to your hand.
+ TargetCard target = new TargetCardInYourGraveyard(filterCard);
+ target.withNotTarget(true);
+ if (!target.canChoose(source.getControllerId(), source, game)) {
+ return true;
+ }
+ player.choose(outcome, target, source, game);
+ Card card = game.getCard(target.getFirstTarget());
+ if (card != null) {
+ player.moveCards(card, Zone.HAND, source, game);
+ }
+ } else if (result == 4 || result == 5) {
+ // Comet, Stellar Pup deals damage equal to the number of loyalty counters on him to a creature or player
+ TargetCreatureOrPlayer target = new TargetCreatureOrPlayer();
+ target.withNotTarget(true);
+ if (!target.canChoose(source.getControllerId(), source, game)) {
+ return true;
+ }
+ player.choose(Outcome.Damage, target, source, game);
+ new DamageTargetEffect(new CountersSourceCount(CounterType.LOYALTY))
+ .setTargetPointer(new FixedTarget(target.getFirstTarget()))
+ .apply(game, source);
+
+ // [−2]
+ new RemoveCounterSourceEffect(CounterType.LOYALTY.createInstance(2))
+ .apply(game, source);
+ } else if (result == 6) {
+ //[+1]
+ new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(1))
+ .apply(game, source);
+
+ // You may activate Comet, Stellar Pup’s loyalty ability two more times this turn.
+ Permanent comet = source.getSourcePermanentIfItStillExists(game);
+ if (comet != null) {
+ game.addEffect(
+ new CometStellarPupContinuousEffect(new MageObjectReference(comet, game)),
+ source
+ );
+ }
+ }
+ return true;
+ }
+}
+
+class CometStellarPupContinuousEffect extends ContinuousEffectImpl {
+
+ private final MageObjectReference cometMOR;
+
+ CometStellarPupContinuousEffect(MageObjectReference cometMOR) {
+ super(Duration.EndOfTurn, Layer.RulesEffects, SubLayer.NA, Outcome.Benefit);
+ this.cometMOR = cometMOR;
+ }
+
+ private CometStellarPupContinuousEffect(final CometStellarPupContinuousEffect effect) {
+ super(effect);
+ this.cometMOR = effect.cometMOR;
+ }
+
+ @Override
+ public CometStellarPupContinuousEffect copy() {
+ return new CometStellarPupContinuousEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent comet = cometMOR.getPermanent(game);
+ if (comet != null) {
+ comet.incrementLoyaltyActivationsAvailable();
+ comet.incrementLoyaltyActivationsAvailable();
+ return true;
+ }
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/Unfinity.java b/Mage.Sets/src/mage/sets/Unfinity.java
index a0cc65c3072..de9dca48d73 100644
--- a/Mage.Sets/src/mage/sets/Unfinity.java
+++ b/Mage.Sets/src/mage/sets/Unfinity.java
@@ -29,6 +29,7 @@ public final class Unfinity extends ExpansionSet {
cards.add(new SetCardInfo("Circuits Act", 103, Rarity.COMMON, mage.cards.c.CircuitsAct.class));
cards.add(new SetCardInfo("Clown Car", 186, Rarity.RARE, mage.cards.c.ClownCar.class));
cards.add(new SetCardInfo("Clowning Around", 6, Rarity.COMMON, mage.cards.c.ClowningAround.class));
+ cards.add(new SetCardInfo("Comet, Stellar Pup", 166, Rarity.MYTHIC, mage.cards.c.CometStellarPup.class));
cards.add(new SetCardInfo("Dissatisfied Customer", 72, Rarity.COMMON, mage.cards.d.DissatisfiedCustomer.class));
cards.add(new SetCardInfo("Embiggen", 137, Rarity.COMMON, mage.cards.e.Embiggen.class));
cards.add(new SetCardInfo("Forest", 239, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.UST_FULL_ART_BASIC, true)));//there are multipiles so use the true boolean here for useVariousArt
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/unf/CometStellarPupTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/unf/CometStellarPupTest.java
new file mode 100644
index 00000000000..3a8fc1dcf39
--- /dev/null
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/unf/CometStellarPupTest.java
@@ -0,0 +1,240 @@
+package org.mage.test.cards.single.unf;
+
+import mage.constants.PhaseStep;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import org.junit.Test;
+import org.mage.test.serverside.base.CardTestPlayerBase;
+
+/**
+ * @author Susucr
+ */
+public class CometStellarPupTest extends CardTestPlayerBase {
+
+ /**
+ * Comet, Stellar Pup
+ * {2}{R}{W}
+ * Legendary Planeswalker — Comet
+ *
+ * 0: Roll a six-sided die.
+ * 1 or 2 — [+2], then create two 1/1 green Squirrel creature tokens. They gain haste until end of turn.
+ * 3 — [−1], then return a card with mana value 2 or less from your graveyard to your hand.
+ * 4 or 5 — Comet, Stellar Pup deals damage equal to the number of loyalty counters on him to a creature or player, then [−2].
+ * 6 — [+1], and you may activate Comet, Stellar Pup’s loyalty ability two more times this turn.
+ *
+ * Loyalty: 5
+ */
+ private final static String comet = "Comet, Stellar Pup";
+
+ private final static String cometAbility = "0: Roll a six-sided die."
+ + "
1 or 2 — [+2] , then create two 1/1 green Squirrel creature tokens. They gain haste until end of turn."
+ + "
3 — [-1], then return a card with mana value 2 or less from your graveyard to your hand."
+ + "
4 or 5 — {this} deals damage equal to the number of loyalty counters on him to a creature or player, then [-2]."
+ + "
6 — [+1], and you may activate Comet, Stellar Pup's loyalty ability two more times this turn.";
+
+ @Test
+ public void testRoll1() {
+ setStrictChooseMode(true);
+
+ addCard(Zone.BATTLEFIELD, playerA, comet);
+
+ setDieRollResult(playerA, 1);
+ activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility);
+ checkPlayableAbility("can't activate more", 1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility, false);
+
+ setStopAt(1, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ assertPermanentCount(playerA, "Squirrel Token", 2);
+ assertCounterCount(playerA, comet, CounterType.LOYALTY, 5 + 2);
+ }
+
+ @Test
+ public void testRoll2() {
+ setStrictChooseMode(true);
+
+ addCard(Zone.BATTLEFIELD, playerA, comet);
+
+ setDieRollResult(playerA, 2);
+ activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility);
+ checkPlayableAbility("can't activate more", 1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility, false);
+
+ attack(1, playerA, "Squirrel Token", playerB);
+ attack(1, playerA, "Squirrel Token", playerB);
+
+ setStopAt(1, PhaseStep.END_COMBAT);
+ execute();
+
+ assertPermanentCount(playerA, "Squirrel Token", 2);
+ assertLife(playerB, 20 - 2);
+ assertCounterCount(playerA, comet, CounterType.LOYALTY, 5 + 2);
+ }
+
+ @Test
+ public void testRoll3() {
+ setStrictChooseMode(true);
+
+ addCard(Zone.BATTLEFIELD, playerA, comet);
+ addCard(Zone.GRAVEYARD, playerA, "Memnite");
+
+ setDieRollResult(playerA, 3);
+ setChoice(playerA, "Memnite");
+ activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility);
+ checkPlayableAbility("can't activate more", 1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility, false);
+
+ setStopAt(1, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ assertPermanentCount(playerA, "Squirrel Token", 0);
+ assertHandCount(playerA, "Memnite", 1);
+ assertLife(playerB, 20);
+ assertCounterCount(playerA, comet, CounterType.LOYALTY, 5 - 1);
+ }
+
+ // TODO: Currently it is not possible to choose a player of a TargetCreatureOrPlayer
+ // the 4 roll is tested in testRoll6 on a permanent.
+ //@Test
+ public void testRoll4() {
+ setStrictChooseMode(true);
+
+ addCard(Zone.BATTLEFIELD, playerA, comet);
+
+ setDieRollResult(playerA, 4);
+ setChoice(playerA, "PlayerB");
+ activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility);
+ checkPlayableAbility("can't activate more", 1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility, false);
+
+ setStopAt(1, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ assertPermanentCount(playerA, "Squirrel Token", 0);
+ assertLife(playerB, 20 - 5);
+ assertCounterCount(playerA, comet, CounterType.LOYALTY, 5 - 2);
+ }
+
+ @Test
+ public void testRoll5() {
+ setStrictChooseMode(true);
+
+ addCard(Zone.BATTLEFIELD, playerA, comet);
+ addCard(Zone.BATTLEFIELD, playerB, "Ancient Brontodon"); // 9/9
+
+ setDieRollResult(playerA, 5);
+ setChoice(playerA, "Ancient Brontodon");
+ activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility);
+ checkPlayableAbility("can't activate more", 1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility, false);
+
+ setStopAt(1, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ assertPermanentCount(playerA, "Squirrel Token", 0);
+ assertLife(playerB, 20);
+ assertDamageReceived(playerB, "Ancient Brontodon", 5);
+ assertCounterCount(playerA, comet, CounterType.LOYALTY, 5 - 2);
+ }
+
+ @Test
+ public void testRoll6() {
+ setStrictChooseMode(true);
+
+ addCard(Zone.BATTLEFIELD, playerA, comet);
+ addCard(Zone.BATTLEFIELD, playerB, "Ghalta, Primal Hunger"); // 12/12
+
+ setDieRollResult(playerA, 6);
+ activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility);
+ waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
+ checkPlayableAbility("can activate more", 1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility, true);
+ checkPermanentCounters("6 loyalty", 1, PhaseStep.PRECOMBAT_MAIN, playerA, comet, CounterType.LOYALTY, 6);
+
+ setDieRollResult(playerA, 6);
+ activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility);
+ waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
+ checkPlayableAbility("can activate more", 1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility, true);
+ checkPermanentCounters("7 loyalty", 1, PhaseStep.PRECOMBAT_MAIN, playerA, comet, CounterType.LOYALTY, 7);
+
+ setDieRollResult(playerA, 1);
+ activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility);
+ waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
+ checkPlayableAbility("can activate more", 1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility, true);
+ checkPermanentCounters("9 loyalty", 1, PhaseStep.PRECOMBAT_MAIN, playerA, comet, CounterType.LOYALTY, 9);
+
+ setDieRollResult(playerA, 2);
+ activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility);
+ waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
+ checkPlayableAbility("can activate more", 1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility, true);
+ checkPermanentCounters("9 loyalty", 1, PhaseStep.PRECOMBAT_MAIN, playerA, comet, CounterType.LOYALTY, 11);
+
+ setDieRollResult(playerA, 4);
+ setChoice(playerA, "Ghalta, Primal Hunger");
+ activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility);
+ waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
+ checkPlayableAbility("can't activate more", 1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility, false);
+
+ setStopAt(1, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ assertPermanentCount(playerA, "Squirrel Token", 4);
+ assertDamageReceived(playerB, "Ghalta, Primal Hunger", 11);
+ assertCounterCount(playerA, comet, CounterType.LOYALTY, 9);
+ }
+
+ @Test
+ public void testRoll6WithCarthTheLion() {
+ setStrictChooseMode(true);
+
+ addCard(Zone.BATTLEFIELD, playerA, comet);
+ // Planeswalkers' loyalty abilities you activate cost an additional [+1] to activate.
+ addCard(Zone.BATTLEFIELD, playerA, "Carth the Lion");
+
+ setDieRollResult(playerA, 6);
+ activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility);
+ waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
+ checkPlayableAbility("can activate more", 1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility, true);
+ checkPermanentCounters("7 loyalty", 1, PhaseStep.PRECOMBAT_MAIN, playerA, comet, CounterType.LOYALTY, 7);
+
+ setDieRollResult(playerA, 1);
+ activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility);
+ waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
+ checkPlayableAbility("can activate more", 1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility, true);
+ checkPermanentCounters("10 loyalty", 1, PhaseStep.PRECOMBAT_MAIN, playerA, comet, CounterType.LOYALTY, 10);
+
+ setDieRollResult(playerA, 2);
+ activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility);
+ waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
+ checkPlayableAbility("can activate more", 1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility, false);
+
+ setStopAt(1, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ assertPermanentCount(playerA, "Squirrel Token", 4);
+ assertCounterCount(playerA, comet, CounterType.LOYALTY, 13);
+ }
+
+ @Test
+ public void testRoll6AgainstEidolonOfObstruction() {
+ setStrictChooseMode(true);
+
+ addCard(Zone.BATTLEFIELD, playerA, comet);
+ addCard(Zone.BATTLEFIELD, playerA, "Plains", 2);
+ // Loyalty abilities of planeswalkers your opponents control cost {1} more to activate.
+ addCard(Zone.BATTLEFIELD, playerB, "Eidolon of Obstruction");
+
+ setDieRollResult(playerA, 6);
+ activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility);
+ waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
+ checkPlayableAbility("can activate more", 1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility, true);
+ checkPermanentCounters("7 loyalty", 1, PhaseStep.PRECOMBAT_MAIN, playerA, comet, CounterType.LOYALTY, 6);
+
+ setDieRollResult(playerA, 1);
+ activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility);
+ waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
+ checkPlayableAbility("can activate more", 1, PhaseStep.PRECOMBAT_MAIN, playerA, cometAbility, false); // no mana to pay the tax one more time.
+
+ setStopAt(1, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ assertPermanentCount(playerA, "Squirrel Token", 2);
+ assertTappedCount("Plains", true, 2);
+ assertCounterCount(playerA, comet, CounterType.LOYALTY, 8);
+ }
+}
diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java
index 8fd88c75bb4..f1823b56a3b 100644
--- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java
+++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java
@@ -2196,11 +2196,15 @@ public class TestPlayer implements Player {
List usedTargets = new ArrayList<>();
+ // TODO: Allow to choose a player with TargetPermanentOrPlayer
if ((target.getOriginalTarget() instanceof TargetPermanent)
- || (target.getOriginalTarget() instanceof TargetPermanentOrPlayer)) { // player target not implemted yet
+ || (target.getOriginalTarget() instanceof TargetCreatureOrPlayer) // player target not implemented yet
+ || (target.getOriginalTarget() instanceof TargetPermanentOrPlayer)) { // player target not implemented yet
FilterPermanent filterPermanent;
if (target.getOriginalTarget() instanceof TargetPermanentOrPlayer) {
filterPermanent = ((TargetPermanentOrPlayer) target.getOriginalTarget()).getFilterPermanent();
+ } else if (target.getOriginalTarget() instanceof TargetCreatureOrPlayer) {
+ filterPermanent = ((TargetCreatureOrPlayer) target.getOriginalTarget()).getFilterCreature();
} else {
filterPermanent = ((TargetPermanent) target.getOriginalTarget()).getFilter();
}
@@ -2379,7 +2383,7 @@ public class TestPlayer implements Player {
}
private void checkTargetDefinitionMarksSupport(Target needTarget, String targetDefinition, String canSupportChars) {
- // fail on wrong chars in definition ` ` ` ` ` ` ` ``````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````
+ // fail on wrong chars in definition
// ^ - multiple targets
// [] - special option like [no copy]
// = - target type like targetPlayer=PlayerA
diff --git a/Mage/src/main/java/mage/constants/SubType.java b/Mage/src/main/java/mage/constants/SubType.java
index e5f520c1d79..f9fef4d0ce6 100644
--- a/Mage/src/main/java/mage/constants/SubType.java
+++ b/Mage/src/main/java/mage/constants/SubType.java
@@ -437,6 +437,7 @@ public enum SubType {
BOLAS("Bolas", SubTypeSet.PlaneswalkerType),
CALIX("Calix", SubTypeSet.PlaneswalkerType),
CHANDRA("Chandra", SubTypeSet.PlaneswalkerType),
+ COMET("Comet", SubTypeSet.PlaneswalkerType),
DACK("Dack", SubTypeSet.PlaneswalkerType),
DAKKON("Dakkon", SubTypeSet.PlaneswalkerType),
DARETTI("Daretti", SubTypeSet.PlaneswalkerType),
diff --git a/Mage/src/main/java/mage/target/common/TargetCreatureOrPlayer.java b/Mage/src/main/java/mage/target/common/TargetCreatureOrPlayer.java
index 98b187c6605..f977286b797 100644
--- a/Mage/src/main/java/mage/target/common/TargetCreatureOrPlayer.java
+++ b/Mage/src/main/java/mage/target/common/TargetCreatureOrPlayer.java
@@ -5,6 +5,7 @@ import mage.abilities.Ability;
import mage.constants.Zone;
import mage.filter.Filter;
import mage.filter.common.FilterCreatureOrPlayer;
+import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
@@ -217,4 +218,7 @@ public class TargetCreatureOrPlayer extends TargetImpl {
return new TargetCreatureOrPlayer(this);
}
+ public FilterCreaturePermanent getFilterCreature() {
+ return filter.getCreatureFilter().copy();
+ }
}