mirror of
https://github.com/magefree/mage.git
synced 2026-01-26 21:29:17 -08:00
[WHO] Implement Graham O'Brien, Iraxxa Empress of Mars, Sisterhood of Karn, Memory Worm, Flaming Tyrannosaurus (#11275)
* [WHO] Implement Graham O'Brien * [WHO] Implement Iraxxa, Empress of Mars * [WHO] Implement Sisterhood of Karn * [WHO] Implement Memory Worm * [WHO] Implement Flaming Tyrannosaurus * fix token name --------- Co-authored-by: xenohedron <xenohedron@users.noreply.github.com>
This commit is contained in:
parent
21bab428e7
commit
39522cdc59
7 changed files with 354 additions and 0 deletions
74
Mage.Sets/src/mage/cards/f/FlamingTyrannosaurus.java
Normal file
74
Mage.Sets/src/mage/cards/f/FlamingTyrannosaurus.java
Normal file
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
58
Mage.Sets/src/mage/cards/g/GrahamOBrien.java
Normal file
58
Mage.Sets/src/mage/cards/g/GrahamOBrien.java
Normal file
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
62
Mage.Sets/src/mage/cards/i/IraxxaEmpressOfMars.java
Normal file
62
Mage.Sets/src/mage/cards/i/IraxxaEmpressOfMars.java
Normal file
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
66
Mage.Sets/src/mage/cards/m/MemoryWorm.java
Normal file
66
Mage.Sets/src/mage/cards/m/MemoryWorm.java
Normal file
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
59
Mage.Sets/src/mage/cards/s/SisterhoodOfKarn.java
Normal file
59
Mage.Sets/src/mage/cards/s/SisterhoodOfKarn.java
Normal file
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue