diff --git a/Mage.Sets/src/mage/sets/avacynrestored/CommandersAuthority.java b/Mage.Sets/src/mage/sets/avacynrestored/CommandersAuthority.java
index 7ec41d11da..a408d0b7fe 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/CommandersAuthority.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/CommandersAuthority.java
@@ -28,8 +28,6 @@
package mage.sets.avacynrestored;
import java.util.UUID;
-
-import mage.constants.*;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
@@ -38,6 +36,13 @@ import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.cards.CardImpl;
+import mage.constants.AttachmentType;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.game.permanent.token.HumanToken;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/DemonicRising.java b/Mage.Sets/src/mage/sets/avacynrestored/DemonicRising.java
index b3f1f6ee60..c320fa3284 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/DemonicRising.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/DemonicRising.java
@@ -29,7 +29,6 @@ package mage.sets.avacynrestored;
import mage.constants.CardType;
import mage.constants.Rarity;
-import mage.MageInt;
import mage.ObjectColor;
import mage.abilities.TriggeredAbility;
import mage.abilities.common.BeginningOfYourEndStepTriggeredAbility;
@@ -38,7 +37,7 @@ import mage.abilities.decorator.ConditionalTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.DemonToken;
import java.util.UUID;
@@ -53,7 +52,6 @@ public class DemonicRising extends CardImpl {
super(ownerId, 94, "Demonic Rising", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}{B}");
this.expansionSetCode = "AVR";
-
// At the beginning of your end step, if you control exactly one creature, put a 5/5 black Demon creature token with flying onto the battlefield.
TriggeredAbility ability = new BeginningOfYourEndStepTriggeredAbility(new CreateTokenEffect(new DemonToken()), false);
this.addAbility(new ConditionalTriggeredAbility(ability, OneControlledCreatureCondition.getInstance(), ruleText));
@@ -68,15 +66,3 @@ public class DemonicRising extends CardImpl {
return new DemonicRising(this);
}
}
-
-class DemonToken extends Token {
- public DemonToken() {
- super("Demon", "a 5/5 black Demon creature token with flying");
- cardType.add(CardType.CREATURE);
- color.setBlack(true);
- subtype.add("Demon");
- power = new MageInt(5);
- toughness = new MageInt(5);
- addAbility(FlyingAbility.getInstance());
- }
-}
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/VoiceOfTheProvinces.java b/Mage.Sets/src/mage/sets/avacynrestored/VoiceOfTheProvinces.java
index 552e5d59c4..4cb50e37fe 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/VoiceOfTheProvinces.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/VoiceOfTheProvinces.java
@@ -36,7 +36,7 @@ import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.HumanToken;
/**
*
@@ -66,15 +66,3 @@ public class VoiceOfTheProvinces extends CardImpl {
return new VoiceOfTheProvinces(this);
}
}
-
-class HumanToken extends Token {
- public HumanToken() {
- super("Human", "1/1 white Human creature token");
- cardType.add(CardType.CREATURE);
- color.setWhite(true);
-
- subtype.add("Human");
- power = new MageInt(1);
- toughness = new MageInt(1);
- }
-}
diff --git a/Mage.Sets/src/mage/sets/commander2013/SpringjackPasture.java b/Mage.Sets/src/mage/sets/commander2013/SpringjackPasture.java
index 8fafdc13ef..d4873e2dd1 100644
--- a/Mage.Sets/src/mage/sets/commander2013/SpringjackPasture.java
+++ b/Mage.Sets/src/mage/sets/commander2013/SpringjackPasture.java
@@ -50,7 +50,7 @@ import mage.constants.Zone;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.game.Game;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.GoatToken;
import mage.players.Player;
/**
@@ -136,17 +136,3 @@ class SpringjackPastureEffect extends OneShotEffect {
return new SpringjackPastureEffect(this);
}
}
-
-class GoatToken extends Token {
-
- public GoatToken() {
- super("Goat", "0/1 white Goat creature token");
- setOriginalExpansionSetCode("EVE");
- cardType.add(CardType.CREATURE);
- color.setWhite(true);
-
- subtype.add("Goat");
- power = new MageInt(0);
- toughness = new MageInt(1);
- }
-}
diff --git a/Mage.Sets/src/mage/sets/commander2014/ObNixilisOfTheBlackOath.java b/Mage.Sets/src/mage/sets/commander2014/ObNixilisOfTheBlackOath.java
index 79cb66aa24..2593433d2e 100644
--- a/Mage.Sets/src/mage/sets/commander2014/ObNixilisOfTheBlackOath.java
+++ b/Mage.Sets/src/mage/sets/commander2014/ObNixilisOfTheBlackOath.java
@@ -28,7 +28,6 @@
package mage.sets.commander2014;
import java.util.UUID;
-import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
import mage.abilities.common.CanBeYourCommanderAbility;
@@ -55,7 +54,7 @@ import mage.constants.Zone;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.command.Emblem;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.DemonToken;
import mage.players.Player;
import mage.target.common.TargetControlledCreaturePermanent;
@@ -77,13 +76,13 @@ public class ObNixilisOfTheBlackOath extends CardImpl {
this.addAbility(new LoyaltyAbility(new ObNixilisOfTheBlackOathEffect1(), 2));
// -2: Put a 5/5 black Demon creature token with flying onto the battlefield. You lose 2 life.
- LoyaltyAbility loyaltyAbility = new LoyaltyAbility(new CreateTokenEffect(new ObNixilisDemonToken()), -2);
+ LoyaltyAbility loyaltyAbility = new LoyaltyAbility(new CreateTokenEffect(new DemonToken()), -2);
loyaltyAbility.addEffect(new LoseLifeSourceControllerEffect(2));
this.addAbility(loyaltyAbility);
// -8: You get an emblem with "{1}{B}, Sacrifice a creature: You gain X life and draw X cards, where X is the sacrificed creature's power."
this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new ObNixilisOfTheBlackOathEmblem()), -8));
-
+
// Ob Nixilis of the Black Oath can be your commander.
this.addAbility(CanBeYourCommanderAbility.getInstance());
}
@@ -134,23 +133,6 @@ class ObNixilisOfTheBlackOathEffect1 extends OneShotEffect {
}
-class ObNixilisDemonToken extends Token {
-
- ObNixilisDemonToken() {
- super("Demon", "5/5 black Demon creature token with flying");
- setTokenType(1);
- setOriginalExpansionSetCode("C14");
- cardType.add(CardType.CREATURE);
- subtype.add("Demon");
-
- color.setBlack(true);
- power = new MageInt(5);
- toughness = new MageInt(5);
-
- addAbility(FlyingAbility.getInstance());
- }
-}
-
class ObNixilisOfTheBlackOathEmblem extends Emblem {
// You get an emblem with "{1}{B}, Sacrifice a creature: You gain X life and draw X cards, where X is the sacrificed creature's power."
public ObNixilisOfTheBlackOathEmblem() {
diff --git a/Mage.Sets/src/mage/sets/darkascension/GatherTheTownsfolk.java b/Mage.Sets/src/mage/sets/darkascension/GatherTheTownsfolk.java
index d734501cf7..15553884e1 100644
--- a/Mage.Sets/src/mage/sets/darkascension/GatherTheTownsfolk.java
+++ b/Mage.Sets/src/mage/sets/darkascension/GatherTheTownsfolk.java
@@ -30,13 +30,12 @@ package mage.sets.darkascension;
import java.util.UUID;
import mage.constants.CardType;
import mage.constants.Rarity;
-import mage.MageInt;
import mage.ObjectColor;
import mage.abilities.condition.common.FatefulHourCondition;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.cards.CardImpl;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.HumanToken;
/**
*
@@ -64,17 +63,3 @@ public class GatherTheTownsfolk extends CardImpl {
return new GatherTheTownsfolk(this);
}
}
-
-class HumanToken extends Token {
-
- public HumanToken() {
- super("Human", "1/1 white Human creature token");
- cardType.add(CardType.CREATURE);
- color.setWhite(true);
-
- subtype.add("Human");
- power = new MageInt(1);
- toughness = new MageInt(1);
- }
-
-}
diff --git a/Mage.Sets/src/mage/sets/darkascension/IncreasingDevotion.java b/Mage.Sets/src/mage/sets/darkascension/IncreasingDevotion.java
index e5405b471e..12f7f2fcd0 100644
--- a/Mage.Sets/src/mage/sets/darkascension/IncreasingDevotion.java
+++ b/Mage.Sets/src/mage/sets/darkascension/IncreasingDevotion.java
@@ -28,14 +28,18 @@
package mage.sets.darkascension;
import java.util.UUID;
-
-import mage.constants.*;
import mage.abilities.Ability;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.FlashbackAbility;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TimingRule;
+import mage.constants.Zone;
import mage.game.Game;
+import mage.game.permanent.token.HumanToken;
import mage.game.stack.Spell;
/**
@@ -48,7 +52,6 @@ public class IncreasingDevotion extends CardImpl {
super(ownerId, 11, "Increasing Devotion", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{W}{W}");
this.expansionSetCode = "DKA";
-
// Put five 1/1 white Human creature tokens onto the battlefield. If Increasing Devotion was cast from a graveyard, put ten of those tokens onto the battlefield instead.
this.getSpellAbility().addEffect(new IncreasingDevotionEffect());
diff --git a/Mage.Sets/src/mage/sets/darkascension/ThrabenDoomsayer.java b/Mage.Sets/src/mage/sets/darkascension/ThrabenDoomsayer.java
index 7977e58f2d..0b0946ed83 100644
--- a/Mage.Sets/src/mage/sets/darkascension/ThrabenDoomsayer.java
+++ b/Mage.Sets/src/mage/sets/darkascension/ThrabenDoomsayer.java
@@ -41,6 +41,7 @@ import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Rarity;
import mage.constants.Zone;
+import mage.game.permanent.token.HumanToken;
/**
*
diff --git a/Mage.Sets/src/mage/sets/dragonsoftarkir/SecureTheWastes.java b/Mage.Sets/src/mage/sets/dragonsoftarkir/SecureTheWastes.java
index 0f3666570a..102d77a2e7 100644
--- a/Mage.Sets/src/mage/sets/dragonsoftarkir/SecureTheWastes.java
+++ b/Mage.Sets/src/mage/sets/dragonsoftarkir/SecureTheWastes.java
@@ -28,13 +28,12 @@
package mage.sets.dragonsoftarkir;
import java.util.UUID;
-import mage.MageInt;
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.WarriorToken;
/**
*
@@ -47,7 +46,7 @@ public class SecureTheWastes extends CardImpl {
this.expansionSetCode = "DTK";
// Put X 1/1 white Warrior creature tokens onto the battlefield.
- this.getSpellAbility().addEffect(new CreateTokenEffect(new SecureTheWastesToken(), new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new CreateTokenEffect(new WarriorToken(), new ManacostVariableValue()));
}
public SecureTheWastes(final SecureTheWastes card) {
@@ -59,17 +58,3 @@ public class SecureTheWastes extends CardImpl {
return new SecureTheWastes(this);
}
}
-
-class SecureTheWastesToken extends Token {
-
- SecureTheWastesToken() {
- super("Warrior", "1/1 white Warrior creature token");
- this.setOriginalExpansionSetCode("DTK");
- cardType.add(CardType.CREATURE);
- subtype.add("Warrior");
-
- color.setWhite(true);
- power = new MageInt(1);
- toughness = new MageInt(1);
- }
-}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/eventide/SpringjackShepherd.java b/Mage.Sets/src/mage/sets/eventide/SpringjackShepherd.java
index 460d913355..481269f78f 100644
--- a/Mage.Sets/src/mage/sets/eventide/SpringjackShepherd.java
+++ b/Mage.Sets/src/mage/sets/eventide/SpringjackShepherd.java
@@ -1,116 +1,104 @@
-/*
- * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are those of the
- * authors and should not be interpreted as representing official policies, either expressed
- * or implied, of BetaSteward_at_googlemail.com.
- */
-package mage.sets.eventide;
-
-import java.util.UUID;
-import mage.MageInt;
-import mage.ObjectColor;
-import mage.abilities.Ability;
-import mage.abilities.common.EntersBattlefieldTriggeredAbility;
-import mage.abilities.dynamicvalue.DynamicValue;
-import mage.abilities.effects.Effect;
-import mage.abilities.effects.common.CreateTokenEffect;
-import mage.cards.CardImpl;
-import mage.constants.CardType;
-import mage.constants.Rarity;
-import mage.filter.FilterPermanent;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
-import mage.game.permanent.token.Token;
-
-/**
- *
- * @author jeffwadsworth
- *
- */
-public class SpringjackShepherd extends CardImpl {
-
- public SpringjackShepherd(UUID ownerId) {
- super(ownerId, 15, "Springjack Shepherd", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{W}");
- this.expansionSetCode = "EVE";
- this.subtype.add("Kithkin");
- this.subtype.add("Wizard");
-
- this.power = new MageInt(1);
- this.toughness = new MageInt(2);
-
- // Chroma - When Springjack Shepherd enters the battlefield, put a 0/1 white Goat creature token onto the battlefield for each white mana symbol in the mana costs of permanents you control.
- Effect effect = new CreateTokenEffect(new GoatToken(), new ChromaSpringjackShepherdCount());
- effect.setText("Chroma - When Springjack Shepherd enters the battlefield, put a 0/1 white Goat creature token onto the battlefield for each white mana symbol in the mana costs of permanents you control.");
- this.addAbility(new EntersBattlefieldTriggeredAbility(effect, false, true));
-
- }
-
- public SpringjackShepherd(final SpringjackShepherd card) {
- super(card);
- }
-
- @Override
- public SpringjackShepherd copy() {
- return new SpringjackShepherd(this);
- }
-}
-
-class ChromaSpringjackShepherdCount implements DynamicValue {
-
- @Override
- public int calculate(Game game, Ability sourceAbility, Effect effect) {
- int chroma = 0;
- for (Permanent permanent : game.getBattlefield().getAllActivePermanents(new FilterPermanent(), sourceAbility.getControllerId(), game)) {
- chroma += permanent.getManaCost().getMana().getWhite();
- }
- return chroma;
- }
-
- @Override
- public DynamicValue copy() {
- return new ChromaSpringjackShepherdCount();
- }
-
- @Override
- public String toString() {
- return "1";
- }
-
- @Override
- public String getMessage() {
- return "";
- }
-}
-
-class GoatToken extends Token {
-
- public GoatToken() {
- super("Goat", "a 0/1 white Goat creature token");
- cardType.add(CardType.CREATURE);
- color.setWhite(true);
- subtype.add("Goat");
- power = new MageInt(0);
- toughness = new MageInt(1);
- }
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.eventide;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.ObjectColor;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.FilterPermanent;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.game.permanent.token.GoatToken;
+
+/**
+ *
+ * @author jeffwadsworth
+ *
+ */
+public class SpringjackShepherd extends CardImpl {
+
+ public SpringjackShepherd(UUID ownerId) {
+ super(ownerId, 15, "Springjack Shepherd", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{W}");
+ this.expansionSetCode = "EVE";
+ this.subtype.add("Kithkin");
+ this.subtype.add("Wizard");
+
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(2);
+
+ // Chroma - When Springjack Shepherd enters the battlefield, put a 0/1 white Goat creature token onto the battlefield for each white mana symbol in the mana costs of permanents you control.
+ Effect effect = new CreateTokenEffect(new GoatToken(), new ChromaSpringjackShepherdCount());
+ effect.setText("Chroma - When Springjack Shepherd enters the battlefield, put a 0/1 white Goat creature token onto the battlefield for each white mana symbol in the mana costs of permanents you control.");
+ this.addAbility(new EntersBattlefieldTriggeredAbility(effect, false, true));
+
+ }
+
+ public SpringjackShepherd(final SpringjackShepherd card) {
+ super(card);
+ }
+
+ @Override
+ public SpringjackShepherd copy() {
+ return new SpringjackShepherd(this);
+ }
+}
+
+class ChromaSpringjackShepherdCount implements DynamicValue {
+
+ @Override
+ public int calculate(Game game, Ability sourceAbility, Effect effect) {
+ int chroma = 0;
+ for (Permanent permanent : game.getBattlefield().getAllActivePermanents(new FilterPermanent(), sourceAbility.getControllerId(), game)) {
+ chroma += permanent.getManaCost().getMana().getWhite();
+ }
+ return chroma;
+ }
+
+ @Override
+ public DynamicValue copy() {
+ return new ChromaSpringjackShepherdCount();
+ }
+
+ @Override
+ public String toString() {
+ return "1";
+ }
+
+ @Override
+ public String getMessage() {
+ return "";
+ }
}
diff --git a/Mage.Sets/src/mage/sets/exodus/DauthiCutthroat.java b/Mage.Sets/src/mage/sets/exodus/DauthiCutthroat.java
new file mode 100644
index 0000000000..031474abcb
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/exodus/DauthiCutthroat.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.exodus;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.abilities.keyword.ShadowAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.AbilityPredicate;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class DauthiCutthroat extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with shadow");
+
+ static {
+ filter.add(new AbilityPredicate(ShadowAbility.class));
+ }
+
+ public DauthiCutthroat(UUID ownerId) {
+ super(ownerId, 57, "Dauthi Cutthroat", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{B}");
+ this.expansionSetCode = "EXO";
+ this.subtype.add("Dauthi");
+ this.subtype.add("Minion");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Shadow
+ this.addAbility(ShadowAbility.getInstance());
+ // {1}{B}, {tap}: Destroy target creature with shadow.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl("{1}{B}"));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetCreaturePermanent(filter));
+ this.addAbility(ability);
+ }
+
+ public DauthiCutthroat(final DauthiCutthroat card) {
+ super(card);
+ }
+
+ @Override
+ public DauthiCutthroat copy() {
+ return new DauthiCutthroat(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/futuresight/CutthroatIlDal.java b/Mage.Sets/src/mage/sets/futuresight/CutthroatIlDal.java
new file mode 100644
index 0000000000..b74a7724e2
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/futuresight/CutthroatIlDal.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.futuresight;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.condition.common.HellbentCondition;
+import mage.abilities.decorator.ConditionalContinuousEffect;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.ShadowAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class CutthroatIlDal extends CardImpl {
+
+ public CutthroatIlDal(UUID ownerId) {
+ super(ownerId, 64, "Cutthroat il-Dal", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{B}");
+ this.expansionSetCode = "FUT";
+ this.subtype.add("Human");
+ this.subtype.add("Rogue");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(1);
+
+ // Hellbent - Cutthroat il-Dal has shadow as long as you have no cards in hand.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect(
+ new GainAbilitySourceEffect(ShadowAbility.getInstance(), Duration.WhileOnBattlefield), HellbentCondition.getInstance(),
+ "Hellbent - {this} has shadow as long as you have no cards in hand"))); }
+
+ public CutthroatIlDal(final CutthroatIlDal card) {
+ super(card);
+ }
+
+ @Override
+ public CutthroatIlDal copy() {
+ return new CutthroatIlDal(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/futuresight/InfiltratorIlKor.java b/Mage.Sets/src/mage/sets/futuresight/InfiltratorIlKor.java
new file mode 100644
index 0000000000..0b402309a6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/futuresight/InfiltratorIlKor.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.futuresight;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.keyword.ShadowAbility;
+import mage.abilities.keyword.SuspendAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class InfiltratorIlKor extends CardImpl {
+
+ public InfiltratorIlKor(UUID ownerId) {
+ super(ownerId, 37, "Infiltrator il-Kor", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{4}{U}");
+ this.expansionSetCode = "FUT";
+ this.subtype.add("Kor");
+ this.subtype.add("Rogue");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(1);
+
+ // Shadow
+ this.addAbility(ShadowAbility.getInstance());
+ // Suspend 2-{1}{U}
+ this.addAbility(new SuspendAbility(2, new ManaCostsImpl("{1}{U}"), this));
+ }
+
+ public InfiltratorIlKor(final InfiltratorIlKor card) {
+ super(card);
+ }
+
+ @Override
+ public InfiltratorIlKor copy() {
+ return new InfiltratorIlKor(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/innistrad/SkirsdagHighPriest.java b/Mage.Sets/src/mage/sets/innistrad/SkirsdagHighPriest.java
index 08e333a7ef..16fef1058f 100644
--- a/Mage.Sets/src/mage/sets/innistrad/SkirsdagHighPriest.java
+++ b/Mage.Sets/src/mage/sets/innistrad/SkirsdagHighPriest.java
@@ -44,7 +44,7 @@ import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.permanent.TappedPredicate;
import mage.game.Game;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.DemonToken;
import mage.target.common.TargetControlledCreaturePermanent;
/**
@@ -111,18 +111,3 @@ class SkirsdagHighPriestCost extends CostImpl {
return paid;
}
}
-
-class DemonToken extends Token {
-
- DemonToken() {
- super("Demon", "5/5 black Demon creature token with flying");
- cardType.add(CardType.CREATURE);
- subtype.add("Demon");
-
- color.setBlack(true);
- power = new MageInt(5);
- toughness = new MageInt(5);
-
- addAbility(FlyingAbility.getInstance());
- }
-}
diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/HeraldOfAnafenza.java b/Mage.Sets/src/mage/sets/khansoftarkir/HeraldOfAnafenza.java
index d1383261c6..09e806e8ba 100644
--- a/Mage.Sets/src/mage/sets/khansoftarkir/HeraldOfAnafenza.java
+++ b/Mage.Sets/src/mage/sets/khansoftarkir/HeraldOfAnafenza.java
@@ -40,7 +40,7 @@ import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.WarriorToken;
import mage.game.stack.StackAbility;
/**
@@ -79,7 +79,7 @@ public class HeraldOfAnafenza extends CardImpl {
class HeraldOfAnafenzaTriggeredAbility extends TriggeredAbilityImpl {
public HeraldOfAnafenzaTriggeredAbility() {
- super(Zone.BATTLEFIELD, new CreateTokenEffect(new HeraldOfAnafenzaWarriorToken()), false);
+ super(Zone.BATTLEFIELD, new CreateTokenEffect(new WarriorToken()), false);
}
public HeraldOfAnafenzaTriggeredAbility(final HeraldOfAnafenzaTriggeredAbility ability) {
@@ -90,7 +90,7 @@ class HeraldOfAnafenzaTriggeredAbility extends TriggeredAbilityImpl {
public HeraldOfAnafenzaTriggeredAbility copy() {
return new HeraldOfAnafenzaTriggeredAbility(this);
}
-
+
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ACTIVATED_ABILITY;
@@ -112,18 +112,3 @@ class HeraldOfAnafenzaTriggeredAbility extends TriggeredAbilityImpl {
return "Whenever you activate {this}'s outlast ability, " + super.getRule();
}
}
-
-class HeraldOfAnafenzaWarriorToken extends Token {
-
- public HeraldOfAnafenzaWarriorToken() {
- super("Warrior", "1/1 white Warrior creature token");
- this.setOriginalExpansionSetCode("KTK");
- this.setTokenType(1);
- cardType.add(CardType.CREATURE);
- subtype.add("Warrior");
-
- color.setWhite(true);
- power = new MageInt(1);
- toughness = new MageInt(1);
- }
-}
diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/MarduCharm.java b/Mage.Sets/src/mage/sets/khansoftarkir/MarduCharm.java
index 44b4423042..2153f4e42d 100644
--- a/Mage.Sets/src/mage/sets/khansoftarkir/MarduCharm.java
+++ b/Mage.Sets/src/mage/sets/khansoftarkir/MarduCharm.java
@@ -28,7 +28,6 @@
package mage.sets.khansoftarkir;
import java.util.UUID;
-import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.effects.ContinuousEffect;
@@ -48,7 +47,7 @@ import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.CardTypePredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.WarriorToken;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
import mage.target.common.TargetOpponent;
@@ -61,12 +60,12 @@ import mage.target.targetpointer.FixedTarget;
public class MarduCharm extends CardImpl {
private static final FilterCard filter = new FilterCard("a noncreature, nonland card");
-
+
static {
filter.add(Predicates.not(new CardTypePredicate(CardType.CREATURE)));
filter.add(Predicates.not(new CardTypePredicate(CardType.LAND)));
}
-
+
public MarduCharm(UUID ownerId) {
super(ownerId, 186, "Mardu Charm", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{R}{W}{B}");
this.expansionSetCode = "KTK";
@@ -76,18 +75,18 @@ public class MarduCharm extends CardImpl {
// * Mardu Charm deals 4 damage to target creature.
this.getSpellAbility().addEffect(new DamageTargetEffect(4));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
-
+
// * Put two 1/1 white Warrior creature tokens onto the battlefield. They gain first strike until end of turn.
Mode mode = new Mode();
mode.getEffects().add(new MarduCharmCreateTokenEffect());
this.getSpellAbility().addMode(mode);
-
+
// * Target opponent reveals his or her hand. You choose a noncreature, nonland card from it. That player discards that card.
mode = new Mode();
mode.getEffects().add(new DiscardCardYouChooseTargetEffect(filter));
mode.getTargets().add(new TargetOpponent());
this.getSpellAbility().addMode(mode);
-
+
}
public MarduCharm(final MarduCharm card) {
@@ -101,26 +100,26 @@ public class MarduCharm extends CardImpl {
}
class MarduCharmCreateTokenEffect extends OneShotEffect {
-
+
public MarduCharmCreateTokenEffect() {
super(Outcome.PutCreatureInPlay);
this.staticText = "Put two 1/1 white Warrior creature tokens onto the battlefield. They gain first strike until end of turn";
}
-
+
public MarduCharmCreateTokenEffect(final MarduCharmCreateTokenEffect effect) {
super(effect);
}
-
+
@Override
public MarduCharmCreateTokenEffect copy() {
return new MarduCharmCreateTokenEffect(this);
}
-
+
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
- CreateTokenEffect effect = new CreateTokenEffect(new MarduCharmWarriorToken(), 2);
+ CreateTokenEffect effect = new CreateTokenEffect(new WarriorToken(), 2);
effect.apply(game, source);
for (UUID tokenId :effect.getLastAddedTokenIds()) {
Permanent token = game.getPermanent(tokenId);
@@ -135,16 +134,3 @@ class MarduCharmCreateTokenEffect extends OneShotEffect {
return false;
}
}
-class MarduCharmWarriorToken extends Token {
-
- public MarduCharmWarriorToken() {
- super("Warrior", "1/1 white Warrior creature token");
- this.setOriginalExpansionSetCode("KTK");
- this.setTokenType(2);
- cardType.add(CardType.CREATURE);
- color.setWhite(true);
- subtype.add("Warrior");
- power = new MageInt(1);
- toughness = new MageInt(1);
- }
-}
diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/MarduHordechief.java b/Mage.Sets/src/mage/sets/khansoftarkir/MarduHordechief.java
index 4452b0dd55..5338301b66 100644
--- a/Mage.Sets/src/mage/sets/khansoftarkir/MarduHordechief.java
+++ b/Mage.Sets/src/mage/sets/khansoftarkir/MarduHordechief.java
@@ -36,7 +36,7 @@ import mage.abilities.effects.common.CreateTokenEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.WarriorToken;
import mage.watchers.common.PlayerAttackedWatcher;
/**
@@ -55,7 +55,7 @@ public class MarduHordechief extends CardImpl {
this.toughness = new MageInt(3);
// Raid - When Mardu Hordechief enters the battlefield, if you attacked with a creature this turn, put a 1/1 white Warrior creature token onto the battlefield
- this.addAbility(new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new MarduHordechiefToken())), RaidCondition.getInstance(),
+ this.addAbility(new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new WarriorToken())), RaidCondition.getInstance(),
"Raid - When {this} enters the battlefield, if you attacked with a creature this turn, put a 1/1 white Warrior creature token onto the battlefield."),
new PlayerAttackedWatcher());
}
@@ -69,17 +69,3 @@ public class MarduHordechief extends CardImpl {
return new MarduHordechief(this);
}
}
-
-class MarduHordechiefToken extends Token {
-
- MarduHordechiefToken() {
- super("Warrior", "1/1 white Warrior creature token");
- this.setOriginalExpansionSetCode("KTK");
- cardType.add(CardType.CREATURE);
- subtype.add("Warrior");
-
- color.setWhite(true);
- power = new MageInt(1);
- toughness = new MageInt(1);
- }
-}
diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/TakeUpArms.java b/Mage.Sets/src/mage/sets/khansoftarkir/TakeUpArms.java
index 2d448508bb..6aaf4499ca 100644
--- a/Mage.Sets/src/mage/sets/khansoftarkir/TakeUpArms.java
+++ b/Mage.Sets/src/mage/sets/khansoftarkir/TakeUpArms.java
@@ -28,12 +28,11 @@
package mage.sets.khansoftarkir;
import java.util.UUID;
-import mage.MageInt;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.WarriorToken;
/**
*
@@ -47,7 +46,7 @@ public class TakeUpArms extends CardImpl {
// Put three 1/1 white Warrior creature tokens onto the battlefield.
- this.getSpellAbility().addEffect(new CreateTokenEffect(new TakeUpArmsToken(), 3));
+ this.getSpellAbility().addEffect(new CreateTokenEffect(new WarriorToken(), 3));
}
public TakeUpArms(final TakeUpArms card) {
@@ -59,17 +58,3 @@ public class TakeUpArms extends CardImpl {
return new TakeUpArms(this);
}
}
-
-class TakeUpArmsToken extends Token {
-
- TakeUpArmsToken() {
- super("Warrior", "1/1 white Warrior creature token");
- this.setOriginalExpansionSetCode("KTK");
- cardType.add(CardType.CREATURE);
- subtype.add("Warrior");
-
- color.setWhite(true);
- power = new MageInt(1);
- toughness = new MageInt(1);
- }
-}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/legions/BroodSliver.java b/Mage.Sets/src/mage/sets/legions/BroodSliver.java
index 48e856b3b7..86ea9e7ec7 100644
--- a/Mage.Sets/src/mage/sets/legions/BroodSliver.java
+++ b/Mage.Sets/src/mage/sets/legions/BroodSliver.java
@@ -37,7 +37,7 @@ import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.SetTargetPointer;
import mage.filter.common.FilterCreaturePermanent;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.SliverToken;
/**
*
@@ -53,12 +53,11 @@ public class BroodSliver extends CardImpl {
this.power = new MageInt(3);
this.toughness = new MageInt(3);
- // Whenever a Sliver deals combat damage to a player, its controller may put a 1/1 colorless Sliver creature token onto the battlefield.
+ // Whenever a Sliver deals combat damage to a player, its controller may put a 1/1 colorless Sliver creature token onto the battlefield.
Effect effect = new CreateTokenTargetEffect(new SliverToken());
effect.setText("its controller may put a 1/1 colorless Sliver creature token onto the battlefield");
- this.addAbility(new DealsDamageToAPlayerAllTriggeredAbility(effect,
- new FilterCreaturePermanent("Sliver", "a Sliver"),
- true, SetTargetPointer.PLAYER, true));
+ this.addAbility(new DealsDamageToAPlayerAllTriggeredAbility(effect,
+ new FilterCreaturePermanent("Sliver", "a Sliver"), true, SetTargetPointer.PLAYER, true));
}
public BroodSliver(final BroodSliver card) {
@@ -70,14 +69,3 @@ public class BroodSliver extends CardImpl {
return new BroodSliver(this);
}
}
-
-class SliverToken extends Token {
-
- public SliverToken() {
- super("Sliver", "1/1 colorless Sliver creature token");
- cardType.add(CardType.CREATURE);
- subtype.add("Sliver");
- power = new MageInt(1);
- toughness = new MageInt(1);
- }
-}
diff --git a/Mage.Sets/src/mage/sets/lorwyn/BoggartMob.java b/Mage.Sets/src/mage/sets/lorwyn/BoggartMob.java
index 0bfee0cd16..e80f8e9d8f 100644
--- a/Mage.Sets/src/mage/sets/lorwyn/BoggartMob.java
+++ b/Mage.Sets/src/mage/sets/lorwyn/BoggartMob.java
@@ -38,14 +38,14 @@ import mage.constants.Rarity;
import mage.constants.SetTargetPointer;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.GoblinRogueToken;
/**
*
* @author fireshoes
*/
public class BoggartMob extends CardImpl {
-
+
private static final FilterControlledPermanent filter = new FilterControlledPermanent("a Goblin you control");
static {
@@ -62,10 +62,10 @@ public class BoggartMob extends CardImpl {
// Champion a Goblin
this.addAbility(new ChampionAbility(this, "Goblin"));
-
+
// Whenever a Goblin you control deals combat damage to a player, you may put a 1/1 black Goblin Rogue creature token onto the battlefield.
this.addAbility(new DealsDamageToAPlayerAllTriggeredAbility(
- new CreateTokenEffect(new BlackGoblinRogueToken()),
+ new CreateTokenEffect(new GoblinRogueToken()),
filter, true, SetTargetPointer.NONE, true));
}
@@ -78,15 +78,3 @@ public class BoggartMob extends CardImpl {
return new BoggartMob(this);
}
}
-
-class BlackGoblinRogueToken extends Token {
- BlackGoblinRogueToken() {
- super("Goblin Rogue", "1/1 black Goblin Rogue creature token");
- cardType.add(CardType.CREATURE);
- color.setBlack(true);
- subtype.add("Goblin");
- subtype.add("Rogue");
- power = new MageInt(1);
- toughness = new MageInt(1);
- }
-}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/magic2013/AjaniCallerOfThePride.java b/Mage.Sets/src/mage/sets/magic2013/AjaniCallerOfThePride.java
index 9c4305c3be..2575cf4bc8 100644
--- a/Mage.Sets/src/mage/sets/magic2013/AjaniCallerOfThePride.java
+++ b/Mage.Sets/src/mage/sets/magic2013/AjaniCallerOfThePride.java
@@ -46,7 +46,7 @@ import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Rarity;
import mage.counters.CounterType;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.CatToken;
import mage.target.common.TargetCreaturePermanent;
/**
@@ -91,15 +91,3 @@ public class AjaniCallerOfThePride extends CardImpl {
return new AjaniCallerOfThePride(this);
}
}
-
-class CatToken extends Token {
-
- public CatToken() {
- super("Cat", "2/2 white Cat creature tokens");
- cardType.add(CardType.CREATURE);
- color.setWhite(true);
- subtype.add("Cat");
- power = new MageInt(2);
- toughness = new MageInt(2);
- }
-}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/magic2013/TradingPost.java b/Mage.Sets/src/mage/sets/magic2013/TradingPost.java
index 2b933e21b2..f6370a6d28 100644
--- a/Mage.Sets/src/mage/sets/magic2013/TradingPost.java
+++ b/Mage.Sets/src/mage/sets/magic2013/TradingPost.java
@@ -49,7 +49,7 @@ import mage.constants.Zone;
import mage.filter.common.FilterArtifactCard;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.CardTypePredicate;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.GoatToken;
import mage.target.common.TargetCardInGraveyard;
import mage.target.common.TargetCardInHand;
import mage.target.common.TargetControlledPermanent;
@@ -59,10 +59,10 @@ import mage.target.common.TargetControlledPermanent;
* @author jeffwadsworth
*/
public class TradingPost extends CardImpl {
-
+
final static FilterControlledPermanent filter = new FilterControlledPermanent("creature");
final static FilterControlledPermanent filter2 = new FilterControlledPermanent("artifact");
-
+
static {
filter.add(new CardTypePredicate(CardType.CREATURE));
filter2.add(new CardTypePredicate(CardType.ARTIFACT));
@@ -77,26 +77,26 @@ public class TradingPost extends CardImpl {
ability1.addCost(new TapSourceCost());
ability1.addCost(new DiscardTargetCost(new TargetCardInHand()));
this.addAbility(ability1);
-
+
// {1}, {tap}, Pay 1 life: Put a 0/1 white Goat creature token onto the battlefield.
Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new GoatToken()), new GenericManaCost(1));
ability2.addCost(new TapSourceCost());
ability2.addCost(new PayLifeCost(1));
this.addAbility(ability2);
-
+
// {1}, {tap}, Sacrifice a creature: Return target artifact card from your graveyard to your hand.
Ability ability3 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnFromGraveyardToHandTargetEffect(), new GenericManaCost(1));
ability3.addTarget(new TargetCardInGraveyard(new FilterArtifactCard("artifact card in your graveyard")));
ability3.addCost(new TapSourceCost());
ability3.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter)));
this.addAbility(ability3);
-
+
// {1}, {tap}, Sacrifice an artifact: Draw a card.
Ability ability4 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new GenericManaCost(1));
ability4.addCost(new TapSourceCost());
ability4.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter2)));
this.addAbility(ability4);
-
+
}
public TradingPost(final TradingPost card) {
@@ -108,15 +108,3 @@ public class TradingPost extends CardImpl {
return new TradingPost(this);
}
}
-
-class GoatToken extends Token {
- public GoatToken() {
- super("Goat", "a 0/1 white Goat creature token");
- cardType.add(CardType.CREATURE);
- color.setWhite(true);
-
- subtype.add("Goat");
- power = new MageInt(0);
- toughness = new MageInt(1);
- }
-}
diff --git a/Mage.Sets/src/mage/sets/magic2014/AjanisChosen.java b/Mage.Sets/src/mage/sets/magic2014/AjanisChosen.java
index 62e2921c40..1728e7f1f4 100644
--- a/Mage.Sets/src/mage/sets/magic2014/AjanisChosen.java
+++ b/Mage.Sets/src/mage/sets/magic2014/AjanisChosen.java
@@ -43,6 +43,7 @@ import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.CardTypePredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
+import mage.game.permanent.token.CatToken;
import mage.game.permanent.token.Token;
import mage.players.Player;
@@ -56,7 +57,7 @@ public class AjanisChosen extends CardImpl {
static {
filter.add(new CardTypePredicate(CardType.ENCHANTMENT));
}
-
+
public AjanisChosen(UUID ownerId) {
super(ownerId, 2, "Ajani's Chosen", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{W}{W}");
this.expansionSetCode = "M14";
@@ -123,16 +124,3 @@ class AjanisChosenEffect extends OneShotEffect {
}
}
-
-
-class CatToken extends Token {
- public CatToken() {
- super("Cat", "2/2 white Cat creature token");
- cardType.add(CardType.CREATURE);
- color.setWhite(true);
-
- subtype.add("Cat");
- power = new MageInt(2);
- toughness = new MageInt(2);
- }
-}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/magic2014/HiveStirrings.java b/Mage.Sets/src/mage/sets/magic2014/HiveStirrings.java
index 2d378cc516..9f9a6a6f02 100644
--- a/Mage.Sets/src/mage/sets/magic2014/HiveStirrings.java
+++ b/Mage.Sets/src/mage/sets/magic2014/HiveStirrings.java
@@ -28,12 +28,11 @@
package mage.sets.magic2014;
import java.util.UUID;
-import mage.MageInt;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.SliverToken;
/**
*
@@ -45,10 +44,8 @@ public class HiveStirrings extends CardImpl {
super(ownerId, 21, "Hive Stirrings", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{W}");
this.expansionSetCode = "M14";
-
// Put two 1/1 colorless Sliver creature tokens onto the battlefield.
this.getSpellAbility().addEffect(new CreateTokenEffect(new SliverToken(), 2));
-
}
public HiveStirrings(final HiveStirrings card) {
@@ -60,13 +57,3 @@ public class HiveStirrings extends CardImpl {
return new HiveStirrings(this);
}
}
-
-class SliverToken extends Token {
- SliverToken() {
- super("Sliver", "a 1/1 colorless Sliver creature token");
- cardType.add(CardType.CREATURE);
- subtype.add("Sliver");
- power = new MageInt(1);
- toughness = new MageInt(1);
- }
-}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/magic2015/SliverHive.java b/Mage.Sets/src/mage/sets/magic2015/SliverHive.java
index f5c40cb43e..cfba0c9449 100644
--- a/Mage.Sets/src/mage/sets/magic2015/SliverHive.java
+++ b/Mage.Sets/src/mage/sets/magic2015/SliverHive.java
@@ -51,7 +51,7 @@ import mage.filter.FilterSpell;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.game.Game;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.SliverToken;
/**
*
@@ -134,15 +134,3 @@ class SliverHiveManaCondition extends CreatureCastManaCondition {
return false;
}
}
-
-class SliverToken extends Token {
-
- SliverToken() {
- super("Sliver", "1/1 colorless Sliver creature token");
- setOriginalExpansionSetCode("M15");
- cardType.add(CardType.CREATURE);
- subtype.add("Sliver");
- power = new MageInt(1);
- toughness = new MageInt(1);
- }
-}
diff --git a/Mage.Sets/src/mage/sets/magicorigins/PriestOfTheBloodRite.java b/Mage.Sets/src/mage/sets/magicorigins/PriestOfTheBloodRite.java
index 6eed42819e..ad78041315 100644
--- a/Mage.Sets/src/mage/sets/magicorigins/PriestOfTheBloodRite.java
+++ b/Mage.Sets/src/mage/sets/magicorigins/PriestOfTheBloodRite.java
@@ -38,7 +38,7 @@ import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.TargetController;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.DemonToken;
/**
*
@@ -70,19 +70,3 @@ public class PriestOfTheBloodRite extends CardImpl {
return new PriestOfTheBloodRite(this);
}
}
-
-class DemonToken extends Token {
-
- DemonToken() {
- super("Demon", "5/5 black Demon creature token with flying");
- cardType.add(CardType.CREATURE);
- subtype.add("Demon");
- setOriginalExpansionSetCode("ORI");
-
- color.setBlack(true);
- power = new MageInt(5);
- toughness = new MageInt(5);
-
- addAbility(FlyingAbility.getInstance());
- }
-}
diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/WhiteSunsZenith.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/WhiteSunsZenith.java
index ca6630a0c4..4ff0f36206 100644
--- a/Mage.Sets/src/mage/sets/mirrodinbesieged/WhiteSunsZenith.java
+++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/WhiteSunsZenith.java
@@ -29,7 +29,6 @@
package mage.sets.mirrodinbesieged;
import java.util.UUID;
-import mage.MageInt;
import mage.ObjectColor;
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
import mage.abilities.effects.common.CreateTokenEffect;
@@ -37,7 +36,7 @@ import mage.abilities.effects.common.ShuffleSpellEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.CatToken;
/**
*
@@ -62,16 +61,3 @@ public class WhiteSunsZenith extends CardImpl {
return new WhiteSunsZenith(this);
}
}
-
-class CatToken extends Token {
- public CatToken() {
- super("Cat", "2/2 white Cat creature token");
- setOriginalExpansionSetCode("SOM");
- cardType.add(CardType.CREATURE);
- color.setWhite(true);
-
- subtype.add("Cat");
- power = new MageInt(2);
- toughness = new MageInt(2);
- }
-}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/modernmasters/MarshFlitter.java b/Mage.Sets/src/mage/sets/modernmasters/MarshFlitter.java
index 56a97459bb..65428a838b 100644
--- a/Mage.Sets/src/mage/sets/modernmasters/MarshFlitter.java
+++ b/Mage.Sets/src/mage/sets/modernmasters/MarshFlitter.java
@@ -44,7 +44,7 @@ import mage.constants.Rarity;
import mage.constants.Zone;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.GoblinRogueToken;
import mage.target.common.TargetControlledPermanent;
/**
@@ -70,7 +70,7 @@ public class MarshFlitter extends CardImpl {
// Flying
this.addAbility(FlyingAbility.getInstance());
// When Marsh Flitter enters the battlefield, put two 1/1 black Goblin Rogue creature tokens onto the battlefield.
- this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new BlackGoblinRogueToken(), 2), false));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new GoblinRogueToken(), 2), false));
// Sacrifice a Goblin: Marsh Flitter has base power and toughness 3/3 until end of turn.
Effect effect = new SetPowerToughnessSourceEffect(3, 3, Duration.EndOfTurn);
effect.setText("{this} has base power and toughness 3/3 until end of turn");
@@ -88,15 +88,3 @@ public class MarshFlitter extends CardImpl {
return new MarshFlitter(this);
}
}
-
-class BlackGoblinRogueToken extends Token {
- BlackGoblinRogueToken() {
- super("Goblin Rogue", "1/1 black Goblin Rogue creature tokens");
- cardType.add(CardType.CREATURE);
- color.setBlack(true);
- subtype.add("Goblin");
- subtype.add("Rogue");
- power = new MageInt(1);
- toughness = new MageInt(1);
- }
-}
diff --git a/Mage.Sets/src/mage/sets/modernmasters/WarrenWeirding.java b/Mage.Sets/src/mage/sets/modernmasters/WarrenWeirding.java
index 8a294fd70a..b3f6d2144f 100644
--- a/Mage.Sets/src/mage/sets/modernmasters/WarrenWeirding.java
+++ b/Mage.Sets/src/mage/sets/modernmasters/WarrenWeirding.java
@@ -47,6 +47,7 @@ import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
+import mage.game.permanent.token.GoblinRogueToken;
import mage.game.permanent.token.Token;
import mage.players.Player;
import mage.target.TargetPlayer;
@@ -83,9 +84,11 @@ public class WarrenWeirding extends CardImpl {
class WarrenWeirdingEffect extends OneShotEffect {
private static final FilterCreaturePermanent filterGoblin = new FilterCreaturePermanent();
+
static {
filterGoblin.add(new SubtypePredicate("Goblin"));
}
+
WarrenWeirdingEffect ( ) {
super(Outcome.Sacrifice);
staticText = "Target player sacrifices a creature. If a Goblin is sacrificed this way, that player puts two 1/1 black Goblin Rogue creature tokens onto the battlefield, and those tokens gain haste until end of turn";
@@ -113,7 +116,7 @@ class WarrenWeirdingEffect extends OneShotEffect {
permanent.sacrifice(source.getSourceId(), game);
if (filterGoblin.match(permanent, game)) {
for (int i = 0; i < 2; i++) {
- Token token = new WarrenWeirdingBlackGoblinRogueToken();
+ Token token = new GoblinRogueToken();
Effect effect = new CreateTokenTargetEffect(token);
effect.setTargetPointer(new FixedTarget(player.getId()));
if (effect.apply(game, source)) {
@@ -138,15 +141,3 @@ class WarrenWeirdingEffect extends OneShotEffect {
}
}
-
-class WarrenWeirdingBlackGoblinRogueToken extends Token {
- WarrenWeirdingBlackGoblinRogueToken() {
- super("Goblin Rogue", "1/1 black Goblin Rogue creature tokens, and those tokens gain haste until end of turn");
- cardType.add(CardType.CREATURE);
- color.setBlack(true);
- subtype.add("Goblin");
- subtype.add("Rogue");
- power.setValue(1);
- toughness.setValue(1);
- }
-}
diff --git a/Mage.Sets/src/mage/sets/morningtide/Bitterblossom.java b/Mage.Sets/src/mage/sets/morningtide/Bitterblossom.java
index 783584d8e8..2a19532c5d 100644
--- a/Mage.Sets/src/mage/sets/morningtide/Bitterblossom.java
+++ b/Mage.Sets/src/mage/sets/morningtide/Bitterblossom.java
@@ -1,82 +1,66 @@
-/*
- * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are those of the
- * authors and should not be interpreted as representing official policies, either expressed
- * or implied, of BetaSteward_at_googlemail.com.
- */
-package mage.sets.morningtide;
-
-import java.util.UUID;
-import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
-import mage.abilities.effects.common.CreateTokenEffect;
-import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
-import mage.abilities.keyword.FlyingAbility;
-import mage.cards.CardImpl;
-import mage.constants.CardType;
-import mage.constants.Rarity;
-import mage.constants.TargetController;
-import mage.game.permanent.token.Token;
-
-/**
- *
- * @author Loki
- */
-public class Bitterblossom extends CardImpl {
-
- public Bitterblossom(UUID ownerId) {
- super(ownerId, 58, "Bitterblossom", Rarity.RARE, new CardType[]{CardType.TRIBAL, CardType.ENCHANTMENT}, "{1}{B}");
- this.expansionSetCode = "MOR";
- this.subtype.add("Faerie");
-
- // At the beginning of your upkeep, you lose 1 life and put a 1/1 black Faerie Rogue creature token with flying onto the battlefield.
- Ability ability = new BeginningOfUpkeepTriggeredAbility(new LoseLifeSourceControllerEffect(1), TargetController.YOU, false);
- ability.addEffect(new CreateTokenEffect(new FaerieToken(), 1));
- this.addAbility(ability);
- }
-
- public Bitterblossom(final Bitterblossom card) {
- super(card);
- }
-
- @Override
- public Bitterblossom copy() {
- return new Bitterblossom(this);
- }
-}
-
-class FaerieToken extends Token {
-
- FaerieToken() {
- super("Faerie Rogue", "1/1 black Faerie Rogue creature token with flying");
- cardType.add(CardType.CREATURE);
- color.setBlack(true);
- subtype.add("Faerie");
- subtype.add("Rogue");
- power = new MageInt(1);
- toughness = new MageInt(1);
- this.addAbility(FlyingAbility.getInstance());
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.morningtide;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.game.permanent.token.FaerieRogueToken;
+
+/**
+ *
+ * @author Loki
+ */
+public class Bitterblossom extends CardImpl {
+
+ public Bitterblossom(UUID ownerId) {
+ super(ownerId, 58, "Bitterblossom", Rarity.RARE, new CardType[]{CardType.TRIBAL, CardType.ENCHANTMENT}, "{1}{B}");
+ this.expansionSetCode = "MOR";
+ this.subtype.add("Faerie");
+
+ // At the beginning of your upkeep, you lose 1 life and put a 1/1 black Faerie Rogue creature token with flying onto the battlefield.
+ Ability ability = new BeginningOfUpkeepTriggeredAbility(new LoseLifeSourceControllerEffect(1), TargetController.YOU, false);
+ ability.addEffect(new CreateTokenEffect(new FaerieRogueToken(), 1));
+ this.addAbility(ability);
+ }
+
+ public Bitterblossom(final Bitterblossom card) {
+ super(card);
+ }
+
+ @Override
+ public Bitterblossom copy() {
+ return new Bitterblossom(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/morningtide/NotoriousThrong.java b/Mage.Sets/src/mage/sets/morningtide/NotoriousThrong.java
new file mode 100644
index 0000000000..d943672f4a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/morningtide/NotoriousThrong.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.morningtide;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.condition.common.ProwlCondition;
+import mage.abilities.decorator.ConditionalOneShotEffect;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.turn.AddExtraTurnControllerEffect;
+import mage.abilities.keyword.ProwlAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.game.Game;
+import mage.game.permanent.token.FaerieRogueToken;
+import mage.players.Player;
+import mage.watchers.common.AmountOfDamageAPlayerReceivedThisTurnWatcher;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class NotoriousThrong extends CardImpl {
+
+ public NotoriousThrong(UUID ownerId) {
+ super(ownerId, 45, "Notorious Throng", Rarity.RARE, new CardType[]{CardType.TRIBAL, CardType.SORCERY}, "{3}{U}");
+ this.expansionSetCode = "MOR";
+ this.subtype.add("Rogue");
+
+ // Prowl {5}{U}
+ this.addAbility(new ProwlAbility(this, "{5}{U}"));
+ // Put X 1/1 black Faerie Rogue creature tokens with flying onto the battlefield, where X is the damage dealt to your opponents this turn.
+ this.getSpellAbility().addEffect(new NotoriousThrongEffect());
+ this.getSpellAbility().addWatcher(new AmountOfDamageAPlayerReceivedThisTurnWatcher());
+ // If Notorious Throng's prowl cost was paid, take an extra turn after this one.
+ Effect effect = new ConditionalOneShotEffect(new AddExtraTurnControllerEffect(), ProwlCondition.getInstance());
+ effect.setText("If {this}'s prowl cost was paid, take an extra turn after this one.");
+ this.getSpellAbility().addEffect(effect);
+ }
+
+ public NotoriousThrong(final NotoriousThrong card) {
+ super(card);
+ }
+
+ @Override
+ public NotoriousThrong copy() {
+ return new NotoriousThrong(this);
+ }
+}
+
+class NotoriousThrongEffect extends OneShotEffect {
+
+ public NotoriousThrongEffect() {
+ super(Outcome.PutCreatureInPlay);
+ staticText = "Put X 1/1 black Faerie Rogue creature tokens with flying onto the battlefield, where X is the damage dealt to your opponents this turn";
+ }
+
+ public NotoriousThrongEffect(NotoriousThrongEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public NotoriousThrongEffect copy() {
+ return new NotoriousThrongEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ AmountOfDamageAPlayerReceivedThisTurnWatcher watcher = (AmountOfDamageAPlayerReceivedThisTurnWatcher) game.getState().getWatchers().get("AmountOfDamageReceivedThisTurn");
+ if(controller != null && watcher != null) {
+ int numTokens = 0;
+ for(UUID opponentId: game.getOpponents(controller.getId())) {
+ numTokens += watcher.getAmountOfDamageReceivedThisTurn(opponentId);
+ }
+ if(numTokens > 0) {
+ new CreateTokenEffect(new FaerieRogueToken(), numTokens).apply(game, source);
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/morningtide/VioletPall.java b/Mage.Sets/src/mage/sets/morningtide/VioletPall.java
index 7b760e28e4..b76090f5c2 100644
--- a/Mage.Sets/src/mage/sets/morningtide/VioletPall.java
+++ b/Mage.Sets/src/mage/sets/morningtide/VioletPall.java
@@ -28,18 +28,16 @@
package mage.sets.morningtide;
import java.util.UUID;
-import mage.MageInt;
-import mage.constants.CardType;
-import mage.constants.Rarity;
import mage.ObjectColor;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DestroyTargetEffect;
-import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.ColorPredicate;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.FaerieRogueToken;
import mage.target.common.TargetCreaturePermanent;
/**
@@ -61,7 +59,7 @@ public class VioletPall extends CardImpl {
this.getSpellAbility().addEffect(new DestroyTargetEffect());
this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter));
- this.getSpellAbility().addEffect(new CreateTokenEffect(new VioletPallFaerieToken(), 1));
+ this.getSpellAbility().addEffect(new CreateTokenEffect(new FaerieRogueToken(), 1));
}
public VioletPall(final VioletPall card) {
@@ -73,17 +71,3 @@ public class VioletPall extends CardImpl {
return new VioletPall(this);
}
}
-
-class VioletPallFaerieToken extends Token {
-
- VioletPallFaerieToken() {
- super("Faerie Rogue", "1/1 black Faerie Rogue creature token with flying");
- cardType.add(CardType.CREATURE);
- color.setBlack(true);
- subtype.add("Faerie");
- subtype.add("Rogue");
- power = new MageInt(1);
- toughness = new MageInt(1);
- this.addAbility(FlyingAbility.getInstance());
- }
-}
diff --git a/Mage.Sets/src/mage/sets/morningtide/WeirdingShaman.java b/Mage.Sets/src/mage/sets/morningtide/WeirdingShaman.java
index 8bc8b3e8eb..063142396e 100644
--- a/Mage.Sets/src/mage/sets/morningtide/WeirdingShaman.java
+++ b/Mage.Sets/src/mage/sets/morningtide/WeirdingShaman.java
@@ -41,7 +41,7 @@ import mage.cards.CardImpl;
import mage.constants.Zone;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.GoblinRogueToken;
import mage.target.common.TargetControlledPermanent;
/**
@@ -64,7 +64,7 @@ public class WeirdingShaman extends CardImpl {
this.power = new MageInt(2);
this.toughness = new MageInt(1);
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new goblinRogueToken(), 2), new ManaCostsImpl("{3}{B}"));
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new GoblinRogueToken(), 2), new ManaCostsImpl("{3}{B}"));
ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter)));
this.addAbility(ability);
}
@@ -78,15 +78,3 @@ public class WeirdingShaman extends CardImpl {
return new WeirdingShaman(this);
}
}
-
-class goblinRogueToken extends Token {
- goblinRogueToken() {
- super("Goblin", "1/1 black Goblin Rogue creature tokens");
- cardType.add(CardType.CREATURE);
- color.setBlack(true);
- subtype.add("Goblin");
- subtype.add("Rogue");
- power = new MageInt(1);
- toughness = new MageInt(1);
- }
-}
diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/KembaKhaRegent.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/KembaKhaRegent.java
index 91e4e6d767..acbfb13f31 100644
--- a/Mage.Sets/src/mage/sets/scarsofmirrodin/KembaKhaRegent.java
+++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/KembaKhaRegent.java
@@ -38,7 +38,7 @@ import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.dynamicvalue.common.EquipmentAttachedCount;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.cards.CardImpl;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.CatToken;
/**
*
@@ -69,16 +69,3 @@ public class KembaKhaRegent extends CardImpl {
return new KembaKhaRegent(this);
}
}
-
-class CatToken extends Token {
-
- public CatToken() {
- super("Cat", "a 2/2 white Cat creature token");
- cardType.add(CardType.CREATURE);
- color.setWhite(true);
-
- subtype.add("Cat");
- power = new MageInt(2);
- toughness = new MageInt(2);
- }
-}
diff --git a/Mage.Sets/src/mage/sets/stronghold/SliverQueen.java b/Mage.Sets/src/mage/sets/stronghold/SliverQueen.java
index a7d7b7c727..c5218656fc 100644
--- a/Mage.Sets/src/mage/sets/stronghold/SliverQueen.java
+++ b/Mage.Sets/src/mage/sets/stronghold/SliverQueen.java
@@ -36,7 +36,7 @@ import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.Zone;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.SliverToken;
/**
*
@@ -66,14 +66,3 @@ public class SliverQueen extends CardImpl {
return new SliverQueen(this);
}
}
-
-class SliverToken extends Token {
-
- public SliverToken() {
- super("Sliver", "1/1 colorless Sliver creature token");
- cardType.add(CardType.CREATURE);
- subtype.add("Sliver");
- power = new MageInt(1);
- toughness = new MageInt(1);
- }
-}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/tempest/CircleOfProtectionShadow.java b/Mage.Sets/src/mage/sets/tempest/CircleOfProtectionShadow.java
new file mode 100644
index 0000000000..195c8378d3
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/tempest/CircleOfProtectionShadow.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.tempest;
+
+import java.util.UUID;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.PreventNextDamageFromChosenSourceToYouEffect;
+import mage.abilities.keyword.ShadowAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.AbilityPredicate;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class CircleOfProtectionShadow extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a creature of your choice with shadow");
+
+ static {
+ filter.add(new AbilityPredicate(ShadowAbility.class));
+ }
+
+ public CircleOfProtectionShadow(UUID ownerId) {
+ super(ownerId, 224, "Circle of Protection: Shadow", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}");
+ this.expansionSetCode = "TMP";
+
+ // {1}: The next time a creature of your choice with shadow would deal damage to you this turn, prevent that damage.
+ Effect effect = new PreventNextDamageFromChosenSourceToYouEffect(Duration.EndOfTurn, filter);
+ effect.setText("The next time a creature of your choice with shadow would deal damage to you this turn, prevent that damage");
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("1")));
+ }
+
+ public CircleOfProtectionShadow(final CircleOfProtectionShadow card) {
+ super(card);
+ }
+
+ @Override
+ public CircleOfProtectionShadow copy() {
+ return new CircleOfProtectionShadow(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/tempest/DauthiGhoul.java b/Mage.Sets/src/mage/sets/tempest/DauthiGhoul.java
new file mode 100644
index 0000000000..8b81a6833e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/tempest/DauthiGhoul.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.tempest;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.DiesCreatureTriggeredAbility;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.abilities.keyword.ShadowAbility;
+import mage.abilities.keyword.ShadowAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.counters.CounterType;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.AbilityPredicate;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class DauthiGhoul extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a creature with shadow");
+
+ static {
+ filter.add(new AbilityPredicate(ShadowAbility.class));
+ }
+
+ public DauthiGhoul(UUID ownerId) {
+ super(ownerId, 15, "Dauthi Ghoul", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{B}");
+ this.expansionSetCode = "TMP";
+ this.subtype.add("Dauthi");
+ this.subtype.add("Zombie");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Shadow
+ this.addAbility(ShadowAbility.getInstance());
+ // Whenever a creature with shadow dies, put a +1/+1 counter on Dauthi Ghoul.
+ this.addAbility(new DiesCreatureTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false, filter));
+ }
+
+ public DauthiGhoul(final DauthiGhoul card) {
+ super(card);
+ }
+
+ @Override
+ public DauthiGhoul copy() {
+ return new DauthiGhoul(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/tempest/ThalakosMistfolk.java b/Mage.Sets/src/mage/sets/tempest/ThalakosMistfolk.java
new file mode 100644
index 0000000000..d13503cf7e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/tempest/ThalakosMistfolk.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.tempest;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.PutOnLibrarySourceEffect;
+import mage.abilities.keyword.ShadowAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class ThalakosMistfolk extends CardImpl {
+
+ public ThalakosMistfolk(UUID ownerId) {
+ super(ownerId, 93, "Thalakos Mistfolk", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{U}");
+ this.expansionSetCode = "TMP";
+ this.subtype.add("Thalakos");
+ this.subtype.add("Illusion");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // Shadow
+ this.addAbility(ShadowAbility.getInstance());
+ // {U}: Put Thalakos Mistfolk on top of its owner's library.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutOnLibrarySourceEffect(true), new ManaCostsImpl("{U}")));
+ }
+
+ public ThalakosMistfolk(final ThalakosMistfolk card) {
+ super(card);
+ }
+
+ @Override
+ public ThalakosMistfolk copy() {
+ return new ThalakosMistfolk(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/timeshifted/FacelessButcher.java b/Mage.Sets/src/mage/sets/timeshifted/FacelessButcher.java
index 3fc17bbe5a..9ff8881294 100644
--- a/Mage.Sets/src/mage/sets/timeshifted/FacelessButcher.java
+++ b/Mage.Sets/src/mage/sets/timeshifted/FacelessButcher.java
@@ -32,6 +32,7 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.LeavesBattlefieldTriggeredAbility;
+import mage.abilities.effects.Effect;
import mage.abilities.effects.common.ExileTargetForSourceEffect;
import mage.abilities.effects.common.ReturnFromExileForSourceEffect;
import mage.cards.CardImpl;
@@ -56,8 +57,8 @@ public class FacelessButcher extends CardImpl {
static {
filter.add(new AnotherPredicate());
}
-
-
+
+
public FacelessButcher(UUID ownerId) {
super(ownerId, 43, "Faceless Butcher", Rarity.SPECIAL, new CardType[]{CardType.CREATURE}, "{2}{B}{B}");
this.expansionSetCode = "TSB";
@@ -65,10 +66,12 @@ public class FacelessButcher extends CardImpl {
this.subtype.add("Horror");
this.power = new MageInt(2);
this.toughness = new MageInt(3);
-
+
// When Faceless Butcher enters the battlefield, exile target creature other than Faceless Butcher.
- Ability ability1 = new EntersBattlefieldTriggeredAbility(new ExileTargetForSourceEffect(), false);
+ Effect effect = new ExileTargetForSourceEffect();
+ effect.setText("exile target creature other than {this}");
+ Ability ability1 = new EntersBattlefieldTriggeredAbility(effect, false);
Target target = new TargetPermanent(filter);
ability1.addTarget(target);
this.addAbility(ability1);
@@ -76,7 +79,7 @@ public class FacelessButcher extends CardImpl {
// When Faceless Butcher leaves the battlefield, return the exiled card to the battlefield under its owner's control.
Ability ability2 = new LeavesBattlefieldTriggeredAbility(new ReturnFromExileForSourceEffect(Zone.BATTLEFIELD), false);
this.addAbility(ability2);
-
+
}
public FacelessButcher(final FacelessButcher card) {
diff --git a/Mage.Sets/src/mage/sets/timespiral/FacelessDevourer.java b/Mage.Sets/src/mage/sets/timespiral/FacelessDevourer.java
new file mode 100644
index 0000000000..10a7130adc
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/timespiral/FacelessDevourer.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.timespiral;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.LeavesBattlefieldTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.ExileTargetForSourceEffect;
+import mage.abilities.effects.common.ReturnFromExileForSourceEffect;
+import mage.abilities.keyword.ShadowAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.AbilityPredicate;
+import mage.filter.predicate.permanent.AnotherPredicate;
+import mage.target.Target;
+import mage.target.TargetPermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class FacelessDevourer extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
+
+ static {
+ filter.add(new AnotherPredicate());
+ filter.add(new AbilityPredicate(ShadowAbility.class));
+ }
+
+ public FacelessDevourer(UUID ownerId) {
+ super(ownerId, 108, "Faceless Devourer", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{B}");
+ this.expansionSetCode = "TSP";
+ this.subtype.add("Nightmare");
+ this.subtype.add("Horror");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // Shadow
+ this.addAbility(ShadowAbility.getInstance());
+ // When Faceless Devourer enters the battlefield, exile another target creature with shadow.
+ Effect effect = new ExileTargetForSourceEffect();
+ effect.setText("exile another target creature with shadow");
+ Ability ability = new EntersBattlefieldTriggeredAbility(effect, false);
+ Target target = new TargetPermanent(filter);
+ ability.addTarget(target);
+ this.addAbility(ability);
+ // When Faceless Devourer leaves the battlefield, return the exiled card to the battlefield under its owner's control.
+ ability = new LeavesBattlefieldTriggeredAbility(new ReturnFromExileForSourceEffect(Zone.BATTLEFIELD), false);
+ this.addAbility(ability);
+ }
+
+ public FacelessDevourer(final FacelessDevourer card) {
+ super(card);
+ }
+
+ @Override
+ public FacelessDevourer copy() {
+ return new FacelessDevourer(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/timespiral/StrongholdOverseer.java b/Mage.Sets/src/mage/sets/timespiral/StrongholdOverseer.java
new file mode 100644
index 0000000000..6127f98184
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/timespiral/StrongholdOverseer.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.timespiral;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.continuous.BoostAllEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.keyword.ShadowAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.AbilityPredicate;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class StrongholdOverseer extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures with shadow");
+ private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent("creatures without shadow");
+
+ static {
+ filter.add(new AbilityPredicate(ShadowAbility.class));
+ filter2.add(Predicates.not(new AbilityPredicate(ShadowAbility.class)));
+ }
+
+ public StrongholdOverseer(UUID ownerId) {
+ super(ownerId, 133, "Stronghold Overseer", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{B}{B}{B}");
+ this.expansionSetCode = "TSP";
+ this.subtype.add("Demon");
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(5);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // Shadow
+ this.addAbility(ShadowAbility.getInstance());
+ // {B}{B}: Creatures with shadow get +1/+0 until end of turn and creatures without shadow get -1/-0 until end of turn.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostAllEffect(1, 0, Duration.EndOfTurn, filter, false), new ManaCostsImpl("{B}{B}"));
+ Effect effect = new BoostAllEffect(-1, 0, Duration.EndOfTurn, filter2, false);
+ effect.setText("and creatures without shadow get -1/-0 until end of turn");
+ ability.addEffect(effect);
+ this.addAbility(ability);
+ }
+
+ public StrongholdOverseer(final StrongholdOverseer card) {
+ super(card);
+ }
+
+ @Override
+ public StrongholdOverseer copy() {
+ return new StrongholdOverseer(this);
+ }
+}
diff --git a/Mage/src/mage/abilities/effects/common/ExileTargetForSourceEffect.java b/Mage/src/mage/abilities/effects/common/ExileTargetForSourceEffect.java
index 99b3a1e0bd..f909d0828e 100644
--- a/Mage/src/mage/abilities/effects/common/ExileTargetForSourceEffect.java
+++ b/Mage/src/mage/abilities/effects/common/ExileTargetForSourceEffect.java
@@ -84,6 +84,10 @@ public class ExileTargetForSourceEffect extends OneShotEffect {
@Override
public String getText(Mode mode) {
+ if(staticText != null && !staticText.isEmpty()) {
+ return staticText;
+ }
+
if (mode.getTargets().isEmpty()) {
return "Exile it";
} else {
diff --git a/Mage/src/mage/game/permanent/token/CatToken.java b/Mage/src/mage/game/permanent/token/CatToken.java
new file mode 100644
index 0000000000..486891abbb
--- /dev/null
+++ b/Mage/src/mage/game/permanent/token/CatToken.java
@@ -0,0 +1,50 @@
+/*
+* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without modification, are
+* permitted provided that the following conditions are met:
+*
+* 1. Redistributions of source code must retain the above copyright notice, this list of
+* conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright notice, this list
+* of conditions and the following disclaimer in the documentation and/or other materials
+* provided with the distribution.
+*
+* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+* The views and conclusions contained in the software and documentation are those of the
+* authors and should not be interpreted as representing official policies, either expressed
+* or implied, of BetaSteward_at_googlemail.com.
+*/
+
+package mage.game.permanent.token;
+
+import java.util.Arrays;
+import mage.constants.CardType;
+import mage.MageInt;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class CatToken extends Token {
+
+ public CatToken() {
+ super("Cat", "2/2 white Cat creature token");
+ cardType.add(CardType.CREATURE);
+ color.setWhite(true);
+ subtype.add("Cat");
+ power = new MageInt(2);
+ toughness = new MageInt(2);
+ availableImageSetCodes.addAll(Arrays.asList("SOM", "M13", "M14", "C14"));
+ }
+}
diff --git a/Mage/src/mage/game/permanent/token/DemonToken.java b/Mage/src/mage/game/permanent/token/DemonToken.java
new file mode 100644
index 0000000000..824d6eb0a2
--- /dev/null
+++ b/Mage/src/mage/game/permanent/token/DemonToken.java
@@ -0,0 +1,69 @@
+/*
+* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without modification, are
+* permitted provided that the following conditions are met:
+*
+* 1. Redistributions of source code must retain the above copyright notice, this list of
+* conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright notice, this list
+* of conditions and the following disclaimer in the documentation and/or other materials
+* provided with the distribution.
+*
+* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+* The views and conclusions contained in the software and documentation are those of the
+* authors and should not be interpreted as representing official policies, either expressed
+* or implied, of BetaSteward_at_googlemail.com.
+*/
+
+package mage.game.permanent.token;
+
+import java.util.Arrays;
+import mage.constants.CardType;
+import mage.MageInt;
+import mage.abilities.keyword.FlyingAbility;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class DemonToken extends Token {
+
+ public DemonToken() {
+ super("Demon", "5/5 black Demon creature token with flying");
+ cardType.add(CardType.CREATURE);
+ color.setBlack(true);
+ subtype.add("Demon");
+ power = new MageInt(5);
+ toughness = new MageInt(5);
+ addAbility(FlyingAbility.getInstance());
+ availableImageSetCodes.addAll(Arrays.asList("INN", "AVR", "C14", "ORI"));
+ }
+
+ public DemonToken(final DemonToken token) {
+ super(token);
+ }
+
+ @Override
+ public DemonToken copy() {
+ return new DemonToken(this);
+ }
+
+ @Override
+ public void setExpansionSetCodeForImage(String code) {
+ super.setExpansionSetCodeForImage(code);
+ if (getOriginalExpansionSetCode().equals("C14")) {
+ this.setTokenType(2);
+ }
+ }
+}
diff --git a/Mage/src/mage/game/permanent/token/FaerieRogueToken.java b/Mage/src/mage/game/permanent/token/FaerieRogueToken.java
new file mode 100644
index 0000000000..a64ff36448
--- /dev/null
+++ b/Mage/src/mage/game/permanent/token/FaerieRogueToken.java
@@ -0,0 +1,53 @@
+/*
+* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without modification, are
+* permitted provided that the following conditions are met:
+*
+* 1. Redistributions of source code must retain the above copyright notice, this list of
+* conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright notice, this list
+* of conditions and the following disclaimer in the documentation and/or other materials
+* provided with the distribution.
+*
+* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+* The views and conclusions contained in the software and documentation are those of the
+* authors and should not be interpreted as representing official policies, either expressed
+* or implied, of BetaSteward_at_googlemail.com.
+*/
+
+package mage.game.permanent.token;
+
+import java.util.Arrays;
+import mage.constants.CardType;
+import mage.MageInt;
+import mage.abilities.keyword.FlyingAbility;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class FaerieRogueToken extends Token {
+
+ public FaerieRogueToken() {
+ super("Faerie Rogue", "1/1 black Faerie Rogue creature token with flying");
+ cardType.add(CardType.CREATURE);
+ color.setBlack(true);
+ subtype.add("Faerie");
+ subtype.add("Rogue");
+ power = new MageInt(1);
+ toughness = new MageInt(1);
+ addAbility(FlyingAbility.getInstance());
+ availableImageSetCodes.addAll(Arrays.asList("SHM", "MOR", "MMA"));
+ }
+}
diff --git a/Mage/src/mage/game/permanent/token/GoatToken.java b/Mage/src/mage/game/permanent/token/GoatToken.java
new file mode 100644
index 0000000000..82ea128414
--- /dev/null
+++ b/Mage/src/mage/game/permanent/token/GoatToken.java
@@ -0,0 +1,50 @@
+/*
+* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without modification, are
+* permitted provided that the following conditions are met:
+*
+* 1. Redistributions of source code must retain the above copyright notice, this list of
+* conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright notice, this list
+* of conditions and the following disclaimer in the documentation and/or other materials
+* provided with the distribution.
+*
+* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+* The views and conclusions contained in the software and documentation are those of the
+* authors and should not be interpreted as representing official policies, either expressed
+* or implied, of BetaSteward_at_googlemail.com.
+*/
+
+package mage.game.permanent.token;
+
+import java.util.Arrays;
+import mage.constants.CardType;
+import mage.MageInt;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class GoatToken extends Token {
+
+ public GoatToken() {
+ super("Goat", "0/1 white Goat creature token");
+ cardType.add(CardType.CREATURE);
+ color.setWhite(true);
+ subtype.add("Goat");
+ power = new MageInt(0);
+ toughness = new MageInt(1);
+ availableImageSetCodes.addAll(Arrays.asList("EVE", "M13", "M14", "C14"));
+ }
+}
diff --git a/Mage/src/mage/game/permanent/token/GoblinRogueToken.java b/Mage/src/mage/game/permanent/token/GoblinRogueToken.java
new file mode 100644
index 0000000000..b7839593c2
--- /dev/null
+++ b/Mage/src/mage/game/permanent/token/GoblinRogueToken.java
@@ -0,0 +1,51 @@
+/*
+* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without modification, are
+* permitted provided that the following conditions are met:
+*
+* 1. Redistributions of source code must retain the above copyright notice, this list of
+* conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright notice, this list
+* of conditions and the following disclaimer in the documentation and/or other materials
+* provided with the distribution.
+*
+* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+* The views and conclusions contained in the software and documentation are those of the
+* authors and should not be interpreted as representing official policies, either expressed
+* or implied, of BetaSteward_at_googlemail.com.
+*/
+
+package mage.game.permanent.token;
+
+import java.util.Arrays;
+import mage.constants.CardType;
+import mage.MageInt;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class GoblinRogueToken extends Token {
+
+ public GoblinRogueToken() {
+ super("Goblin Rogue", "1/1 black Goblin Rogue creature token");
+ cardType.add(CardType.CREATURE);
+ color.setBlack(true);
+ subtype.add("Goblin");
+ subtype.add("Rogue");
+ power = new MageInt(1);
+ toughness = new MageInt(1);
+ availableImageSetCodes.addAll(Arrays.asList("LRW", "MMA"));
+ }
+}
diff --git a/Mage/src/mage/game/permanent/token/HumanToken.java b/Mage/src/mage/game/permanent/token/HumanToken.java
new file mode 100644
index 0000000000..6e580a5642
--- /dev/null
+++ b/Mage/src/mage/game/permanent/token/HumanToken.java
@@ -0,0 +1,67 @@
+/*
+* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without modification, are
+* permitted provided that the following conditions are met:
+*
+* 1. Redistributions of source code must retain the above copyright notice, this list of
+* conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright notice, this list
+* of conditions and the following disclaimer in the documentation and/or other materials
+* provided with the distribution.
+*
+* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+* The views and conclusions contained in the software and documentation are those of the
+* authors and should not be interpreted as representing official policies, either expressed
+* or implied, of BetaSteward_at_googlemail.com.
+*/
+
+package mage.game.permanent.token;
+
+import java.util.Arrays;
+import mage.constants.CardType;
+import mage.MageInt;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class HumanToken extends Token {
+
+ public HumanToken() {
+ super("Human", "1/1 white Human creature token");
+ cardType.add(CardType.CREATURE);
+ color.setWhite(true);
+ subtype.add("Human");
+ power = new MageInt(1);
+ toughness = new MageInt(1);
+ availableImageSetCodes.addAll(Arrays.asList("DKA", "AVR", "FNMP"));
+ }
+
+ public HumanToken(final HumanToken token) {
+ super(token);
+ }
+
+ @Override
+ public HumanToken copy() {
+ return new HumanToken(this);
+ }
+
+ @Override
+ public void setExpansionSetCodeForImage(String code) {
+ super.setExpansionSetCodeForImage(code);
+ if (getOriginalExpansionSetCode().equals("AVR")) {
+ this.setTokenType(1);
+ }
+ }
+}
diff --git a/Mage/src/mage/game/permanent/token/SliverToken.java b/Mage/src/mage/game/permanent/token/SliverToken.java
new file mode 100644
index 0000000000..1c95852bfe
--- /dev/null
+++ b/Mage/src/mage/game/permanent/token/SliverToken.java
@@ -0,0 +1,49 @@
+/*
+* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without modification, are
+* permitted provided that the following conditions are met:
+*
+* 1. Redistributions of source code must retain the above copyright notice, this list of
+* conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright notice, this list
+* of conditions and the following disclaimer in the documentation and/or other materials
+* provided with the distribution.
+*
+* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+* The views and conclusions contained in the software and documentation are those of the
+* authors and should not be interpreted as representing official policies, either expressed
+* or implied, of BetaSteward_at_googlemail.com.
+*/
+
+package mage.game.permanent.token;
+
+import java.util.Arrays;
+import mage.constants.CardType;
+import mage.MageInt;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SliverToken extends Token {
+
+ public SliverToken() {
+ super("Sliver", "1/1 colorless Sliver creature token");
+ cardType.add(CardType.CREATURE);
+ subtype.add("Sliver");
+ power = new MageInt(1);
+ toughness = new MageInt(1);
+ availableImageSetCodes.addAll(Arrays.asList("M14", "M15"));
+ }
+}
diff --git a/Mage/src/mage/game/permanent/token/WarriorToken.java b/Mage/src/mage/game/permanent/token/WarriorToken.java
new file mode 100644
index 0000000000..5ddc1c3aa2
--- /dev/null
+++ b/Mage/src/mage/game/permanent/token/WarriorToken.java
@@ -0,0 +1,68 @@
+/*
+* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without modification, are
+* permitted provided that the following conditions are met:
+*
+* 1. Redistributions of source code must retain the above copyright notice, this list of
+* conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright notice, this list
+* of conditions and the following disclaimer in the documentation and/or other materials
+* provided with the distribution.
+*
+* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+* The views and conclusions contained in the software and documentation are those of the
+* authors and should not be interpreted as representing official policies, either expressed
+* or implied, of BetaSteward_at_googlemail.com.
+*/
+
+package mage.game.permanent.token;
+
+import java.util.Arrays;
+import java.util.Random;
+import mage.MageInt;
+import mage.constants.CardType;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class WarriorToken extends Token {
+
+ public WarriorToken() {
+ super("Warrior", "1/1 white Warrior creature token");
+ cardType.add(CardType.CREATURE);
+ color.setWhite(true);
+ subtype.add("Warrior");
+ power = new MageInt(1);
+ toughness = new MageInt(1);
+ availableImageSetCodes.addAll(Arrays.asList("KTK", "DTK"));
+ }
+
+ public WarriorToken(final WarriorToken token) {
+ super(token);
+ }
+
+ @Override
+ public WarriorToken copy() {
+ return new WarriorToken(this);
+ }
+
+ @Override
+ public void setExpansionSetCodeForImage(String code) {
+ super.setExpansionSetCodeForImage(code);
+ if (getOriginalExpansionSetCode().equals("KTK")) {
+ this.setTokenType(new Random().nextInt(2) + 1);
+ }
+ }
+}