diff --git a/Mage.Sets/src/mage/cards/f/FlamingTyrannosaurus.java b/Mage.Sets/src/mage/cards/f/FlamingTyrannosaurus.java new file mode 100644 index 00000000000..61f0b50f767 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FlamingTyrannosaurus.java @@ -0,0 +1,74 @@ +package mage.cards.f; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DiesSourceTriggeredAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.dynamicvalue.common.SourcePermanentPowerCount; +import mage.abilities.effects.common.DamagePlayersEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.MenaceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.FilterSpell; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.card.CastFromZonePredicate; +import mage.target.common.TargetAnyTarget; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class FlamingTyrannosaurus extends CardImpl { + + private static final FilterSpell filter = new FilterSpell("a spell from anywhere other than your hand"); + + static { + filter.add(Predicates.not(new CastFromZonePredicate(Zone.HAND))); + } + + public FlamingTyrannosaurus(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{R}{R}"); + + this.subtype.add(SubType.DINOSAUR); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // Menace + this.addAbility(new MenaceAbility(false)); + + // Paradox -- Whenever you cast a spell from anywhere other than your hand, Flaming Tyrannosaurus deals 3 damage to any target. Then put a +1/+1 counter on Flaming Tyrannosaurus. + Ability ability = new SpellCastControllerTriggeredAbility( + new DamageTargetEffect(3), + filter, false + ); + ability.addEffect(new AddCountersSourceEffect( + CounterType.P1P1.createInstance() + ).concatBy("Then")); + ability.addTarget(new TargetAnyTarget()); + + this.addAbility(ability.withFlavorWord("Paradox")); + + // When Flaming Tyrannosaurus dies, it deals damage equal to its power to each opponent. + this.addAbility(new DiesSourceTriggeredAbility( + new DamagePlayersEffect(new SourcePermanentPowerCount(), TargetController.OPPONENT) + .setText("it deals damage equal to its power to each opponent") + )); + } + + private FlamingTyrannosaurus(final FlamingTyrannosaurus card) { + super(card); + } + + @Override + public FlamingTyrannosaurus copy() { + return new FlamingTyrannosaurus(this); + } +} diff --git a/Mage.Sets/src/mage/cards/g/GrahamOBrien.java b/Mage.Sets/src/mage/cards/g/GrahamOBrien.java new file mode 100644 index 00000000000..c005b8b1b5d --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GrahamOBrien.java @@ -0,0 +1,58 @@ +package mage.cards.g; + +import mage.MageInt; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.keyword.DoctorsCompanionAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.constants.Zone; +import mage.filter.FilterSpell; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.card.CastFromZonePredicate; +import mage.game.permanent.token.FoodToken; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class GrahamOBrien extends CardImpl { + + private static final FilterSpell filter = new FilterSpell("a spell from anywhere other than your hand"); + + static { + filter.add(Predicates.not(new CastFromZonePredicate(Zone.HAND))); + } + + public GrahamOBrien(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.PILOT); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Paradox -- Whenever you cast a spell from anywhere other than your hand, create a Food token. + this.addAbility(new SpellCastControllerTriggeredAbility( + new CreateTokenEffect(new FoodToken()), + filter, false + ).withFlavorWord("Paradox")); + + // Doctor's companion + this.addAbility(DoctorsCompanionAbility.getInstance()); + } + + private GrahamOBrien(final GrahamOBrien card) { + super(card); + } + + @Override + public GrahamOBrien copy() { + return new GrahamOBrien(this); + } +} diff --git a/Mage.Sets/src/mage/cards/i/IraxxaEmpressOfMars.java b/Mage.Sets/src/mage/cards/i/IraxxaEmpressOfMars.java new file mode 100644 index 00000000000..23a470b9a26 --- /dev/null +++ b/Mage.Sets/src/mage/cards/i/IraxxaEmpressOfMars.java @@ -0,0 +1,62 @@ +package mage.cards.i; + +import mage.MageInt; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.keyword.BattleCryAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.constants.Zone; +import mage.filter.FilterSpell; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.card.CastFromZonePredicate; +import mage.game.permanent.token.AlienWarriorToken; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class IraxxaEmpressOfMars extends CardImpl { + + private static final FilterSpell filter = new FilterSpell("a spell from anywhere other than your hand"); + + static { + filter.add(Predicates.not(new CastFromZonePredicate(Zone.HAND))); + } + + public IraxxaEmpressOfMars(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}{R}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.ALIEN); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(5); + this.toughness = new MageInt(4); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Battle cry + this.addAbility(new BattleCryAbility()); + + // Paradox -- Whenever you cast a spell from anywhere other than your hand, create a 2/2 red Alien Warrior creature token. + this.addAbility(new SpellCastControllerTriggeredAbility( + new CreateTokenEffect(new AlienWarriorToken()), + filter, false + ).withFlavorWord("Paradox")); + } + + private IraxxaEmpressOfMars(final IraxxaEmpressOfMars card) { + super(card); + } + + @Override + public IraxxaEmpressOfMars copy() { + return new IraxxaEmpressOfMars(this); + } +} diff --git a/Mage.Sets/src/mage/cards/m/MemoryWorm.java b/Mage.Sets/src/mage/cards/m/MemoryWorm.java new file mode 100644 index 00000000000..85870ff1674 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MemoryWorm.java @@ -0,0 +1,66 @@ +package mage.cards.m; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DrawCardTargetEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.effects.common.discard.DiscardTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.FilterSpell; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.card.CastFromZonePredicate; +import mage.target.TargetPlayer; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class MemoryWorm extends CardImpl { + + private static final FilterSpell filter = new FilterSpell("a spell from anywhere other than your hand"); + + static { + filter.add(Predicates.not(new CastFromZonePredicate(Zone.HAND))); + } + + public MemoryWorm(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); + + this.subtype.add(SubType.ALIEN); + this.subtype.add(SubType.WORM); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Paradox -- Whenever you cast a spell from anywhere other than your hand, Memory Worm deals 2 damage to target player. That player discards a card, then draws a card. Put a +1/+1 counter on Memory Worm. + Ability ability = new SpellCastControllerTriggeredAbility( + new DamageTargetEffect(2), + filter, false + ); + ability.addTarget(new TargetPlayer()); + ability.addEffect(new DiscardTargetEffect(1) + .setText("That player discards a card")); + ability.addEffect(new DrawCardTargetEffect(1) + .setText(", then draws a card")); + ability.addEffect(new AddCountersSourceEffect( + CounterType.P1P1.createInstance() + )); + this.addAbility(ability.withFlavorWord("Paradox")); + } + + private MemoryWorm(final MemoryWorm card) { + super(card); + } + + @Override + public MemoryWorm copy() { + return new MemoryWorm(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SisterhoodOfKarn.java b/Mage.Sets/src/mage/cards/s/SisterhoodOfKarn.java new file mode 100644 index 00000000000..e67fb7d8ac0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SisterhoodOfKarn.java @@ -0,0 +1,59 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.common.DoubleCountersSourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.FilterSpell; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.card.CastFromZonePredicate; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class SisterhoodOfKarn extends CardImpl { + + private static final FilterSpell filter = new FilterSpell("a spell from anywhere other than your hand"); + + static { + filter.add(Predicates.not(new CastFromZonePredicate(Zone.HAND))); + } + + public SisterhoodOfKarn(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); + + this.subtype.add(SubType.CLERIC); + this.power = new MageInt(0); + this.toughness = new MageInt(0); + + // Sisterhood of Karn enters the battlefield with a +1/+1 counter on it. + this.addAbility(new EntersBattlefieldAbility( + new AddCountersSourceEffect(CounterType.P1P1.createInstance()), + "with a +1/+1 counter on it" + )); + + // Paradox -- Whenever you cast a spell from anywhere other than your hand, double the number of +1/+1 counters on Sisterhood of Karn. + this.addAbility(new SpellCastControllerTriggeredAbility( + new DoubleCountersSourceEffect(CounterType.P1P1), + filter, false + ).withFlavorWord("Paradox")); + } + + private SisterhoodOfKarn(final SisterhoodOfKarn card) { + super(card); + } + + @Override + public SisterhoodOfKarn copy() { + return new SisterhoodOfKarn(this); + } +} diff --git a/Mage.Sets/src/mage/sets/DoctorWho.java b/Mage.Sets/src/mage/sets/DoctorWho.java index 15d27aecde6..98c4e78ac96 100644 --- a/Mage.Sets/src/mage/sets/DoctorWho.java +++ b/Mage.Sets/src/mage/sets/DoctorWho.java @@ -64,6 +64,7 @@ public final class DoctorWho extends ExpansionSet { cards.add(new SetCardInfo("Feed the Swarm", 221, Rarity.COMMON, mage.cards.f.FeedTheSwarm.class)); cards.add(new SetCardInfo("Fetid Pools", 277, Rarity.RARE, mage.cards.f.FetidPools.class)); cards.add(new SetCardInfo("Fiery Islet", 278, Rarity.RARE, mage.cards.f.FieryIslet.class)); + cards.add(new SetCardInfo("Flaming Tyrannosaurus", 85, Rarity.RARE, mage.cards.f.FlamingTyrannosaurus.class)); cards.add(new SetCardInfo("Foreboding Ruins", 279, Rarity.RARE, mage.cards.f.ForebodingRuins.class)); cards.add(new SetCardInfo("Forest", 204, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Fortified Village", 280, Rarity.RARE, mage.cards.f.FortifiedVillage.class)); @@ -75,6 +76,7 @@ public final class DoctorWho extends ExpansionSet { cards.add(new SetCardInfo("Gallifrey Stands", 132, Rarity.RARE, mage.cards.g.GallifreyStands.class)); cards.add(new SetCardInfo("Game Trail", 284, Rarity.RARE, mage.cards.g.GameTrail.class)); cards.add(new SetCardInfo("Glacial Fortress", 285, Rarity.RARE, mage.cards.g.GlacialFortress.class)); + cards.add(new SetCardInfo("Graham O'Brien", 104, Rarity.RARE, mage.cards.g.GrahamOBrien.class)); cards.add(new SetCardInfo("Grasp of Fate", 208, Rarity.RARE, mage.cards.g.GraspOfFate.class)); cards.add(new SetCardInfo("Growth Spiral", 237, Rarity.COMMON, mage.cards.g.GrowthSpiral.class)); cards.add(new SetCardInfo("Haunted Ridge", 286, Rarity.RARE, mage.cards.h.HauntedRidge.class)); @@ -85,6 +87,7 @@ public final class DoctorWho extends ExpansionSet { cards.add(new SetCardInfo("Horizon Canopy", 287, Rarity.RARE, mage.cards.h.HorizonCanopy.class)); cards.add(new SetCardInfo("Inspiring Refrain", 216, Rarity.RARE, mage.cards.i.InspiringRefrain.class)); cards.add(new SetCardInfo("Into the Time Vortex", 88, Rarity.RARE, mage.cards.i.IntoTheTimeVortex.class)); + cards.add(new SetCardInfo("Iraxxa, Empress of Mars", 89, Rarity.UNCOMMON, mage.cards.i.IraxxaEmpressOfMars.class)); cards.add(new SetCardInfo("Irrigated Farmland", 288, Rarity.RARE, mage.cards.i.IrrigatedFarmland.class)); cards.add(new SetCardInfo("Island", 198, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Jenny, Generated Anomaly", 137, Rarity.RARE, mage.cards.j.JennyGeneratedAnomaly.class)); @@ -93,6 +96,7 @@ public final class DoctorWho extends ExpansionSet { cards.add(new SetCardInfo("Lightning Greaves", 243, Rarity.UNCOMMON, mage.cards.l.LightningGreaves.class)); cards.add(new SetCardInfo("Madame Vastra", 142, Rarity.RARE, mage.cards.m.MadameVastra.class)); cards.add(new SetCardInfo("Martha Jones", 48, Rarity.RARE, mage.cards.m.MarthaJones.class)); + cards.add(new SetCardInfo("Memory Worm", 90, Rarity.UNCOMMON, mage.cards.m.MemoryWorm.class)); cards.add(new SetCardInfo("Mind Stone", 244, Rarity.UNCOMMON, mage.cards.m.MindStone.class)); cards.add(new SetCardInfo("Mountain", 202, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Myriad Landscape", 290, Rarity.UNCOMMON, mage.cards.m.MyriadLandscape.class)); @@ -126,6 +130,7 @@ public final class DoctorWho extends ExpansionSet { cards.add(new SetCardInfo("Shadowblood Ridge", 303, Rarity.RARE, mage.cards.s.ShadowbloodRidge.class)); cards.add(new SetCardInfo("Sheltered Thicket", 304, Rarity.RARE, mage.cards.s.ShelteredThicket.class)); cards.add(new SetCardInfo("Shipwreck Marsh", 305, Rarity.RARE, mage.cards.s.ShipwreckMarsh.class)); + cards.add(new SetCardInfo("Sisterhood of Karn", 109, Rarity.RARE, mage.cards.s.SisterhoodOfKarn.class)); cards.add(new SetCardInfo("Skycloud Expanse", 306, Rarity.RARE, mage.cards.s.SkycloudExpanse.class)); cards.add(new SetCardInfo("Smoldering Marsh", 307, Rarity.RARE, mage.cards.s.SmolderingMarsh.class)); cards.add(new SetCardInfo("Snuff Out", 222, Rarity.UNCOMMON, mage.cards.s.SnuffOut.class)); diff --git a/Mage/src/main/java/mage/game/permanent/token/AlienWarriorToken.java b/Mage/src/main/java/mage/game/permanent/token/AlienWarriorToken.java new file mode 100644 index 00000000000..7770af7f030 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/AlienWarriorToken.java @@ -0,0 +1,30 @@ + +package mage.game.permanent.token; + +import mage.MageInt; +import mage.constants.CardType; +import mage.constants.SubType; + +/** + * @author Susucr + */ +public final class AlienWarriorToken extends TokenImpl { + + public AlienWarriorToken() { + super("Alien Warrior Token", "2/2 red Alien Warrior creature token"); + cardType.add(CardType.CREATURE); + color.setRed(true); + subtype.add(SubType.ALIEN); + subtype.add(SubType.WARRIOR); + power = new MageInt(2); + toughness = new MageInt(2); + } + + protected AlienWarriorToken(final AlienWarriorToken token) { + super(token); + } + + public AlienWarriorToken copy() { + return new AlienWarriorToken(this); + } +}