From aa1624dc1c1c1fc29ae96a3edd4ef3b77dd26903 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Sat, 5 Aug 2023 13:30:40 -0400 Subject: [PATCH] [WHO] Implement Sarah Jane Smith --- .../src/mage/cards/s/SarahJaneSmith.java | 50 +++++++++++++++++++ Mage.Sets/src/mage/sets/DoctorWho.java | 1 + .../keyword/DoctorsCompanionAbility.java | 38 ++++++++++++++ .../src/main/java/mage/constants/SubType.java | 1 + Utils/keywords.txt | 1 + 5 files changed, 91 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SarahJaneSmith.java create mode 100644 Mage/src/main/java/mage/abilities/keyword/DoctorsCompanionAbility.java diff --git a/Mage.Sets/src/mage/cards/s/SarahJaneSmith.java b/Mage.Sets/src/mage/cards/s/SarahJaneSmith.java new file mode 100644 index 00000000000..e8a3241d997 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SarahJaneSmith.java @@ -0,0 +1,50 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.keyword.InvestigateEffect; +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.filter.FilterSpell; +import mage.filter.common.FilterHistoricSpell; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class SarahJaneSmith extends CardImpl { + + private static final FilterSpell filter = new FilterHistoricSpell(); + + public SarahJaneSmith(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.DETECTIVE); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Whenever you cast a historic spell, investigate. This ability triggers only once each turn. + this.addAbility(new SpellCastControllerTriggeredAbility( + new InvestigateEffect(), filter, false + ).setTriggersOnceEachTurn(true)); + + // Doctor's companion + this.addAbility(DoctorsCompanionAbility.getInstance()); + } + + private SarahJaneSmith(final SarahJaneSmith card) { + super(card); + } + + @Override + public SarahJaneSmith copy() { + return new SarahJaneSmith(this); + } +} diff --git a/Mage.Sets/src/mage/sets/DoctorWho.java b/Mage.Sets/src/mage/sets/DoctorWho.java index af259fd4eab..b6ca0f61dcf 100644 --- a/Mage.Sets/src/mage/sets/DoctorWho.java +++ b/Mage.Sets/src/mage/sets/DoctorWho.java @@ -24,6 +24,7 @@ public final class DoctorWho extends ExpansionSet { cards.add(new SetCardInfo("Island", 199, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mountain", 203, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Plains", 197, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Sarah Jane Smith", 6, Rarity.RARE, mage.cards.s.SarahJaneSmith.class)); cards.add(new SetCardInfo("Swamp", 201, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); } } diff --git a/Mage/src/main/java/mage/abilities/keyword/DoctorsCompanionAbility.java b/Mage/src/main/java/mage/abilities/keyword/DoctorsCompanionAbility.java new file mode 100644 index 00000000000..a3827b259b0 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/keyword/DoctorsCompanionAbility.java @@ -0,0 +1,38 @@ +package mage.abilities.keyword; + +import mage.abilities.MageSingleton; +import mage.abilities.StaticAbility; +import mage.constants.Zone; + +import java.io.ObjectStreamException; + +/** + * @author TheElk801 + */ +public class DoctorsCompanionAbility extends StaticAbility implements MageSingleton { + + private static final DoctorsCompanionAbility instance = new DoctorsCompanionAbility(); + + private Object readResolve() throws ObjectStreamException { + return instance; + } + + public static DoctorsCompanionAbility getInstance() { + return instance; + } + + private DoctorsCompanionAbility() { + super(Zone.BATTLEFIELD, null); + } + + @Override + public String getRule() { + return "Doctor's companion (You can have two commanders if the other is the Doctor.)"; + } + + @Override + public DoctorsCompanionAbility copy() { + return instance; + } + +} diff --git a/Mage/src/main/java/mage/constants/SubType.java b/Mage/src/main/java/mage/constants/SubType.java index bdbc8d12315..5360eb685cc 100644 --- a/Mage/src/main/java/mage/constants/SubType.java +++ b/Mage/src/main/java/mage/constants/SubType.java @@ -134,6 +134,7 @@ public enum SubType { DEMIGOD("Demigod", SubTypeSet.CreatureType), DEMON("Demon", SubTypeSet.CreatureType), DESERTER("Deserter", SubTypeSet.CreatureType), + DETECTIVE("Detective", SubTypeSet.CreatureType), DEVIL("Devil", SubTypeSet.CreatureType), DINOSAUR("Dinosaur", SubTypeSet.CreatureType), // With Ixalan now being spoiled, need this to be selectable DJINN("Djinn", SubTypeSet.CreatureType), diff --git a/Utils/keywords.txt b/Utils/keywords.txt index bddf298a584..ba113c5ea2d 100644 --- a/Utils/keywords.txt +++ b/Utils/keywords.txt @@ -30,6 +30,7 @@ Devoid|color| Defender|instance| Disturb|cost| Dredge|number| +Doctor's companion|instance| Double Strike|instance| Dredge|number| Echo|manaString|