From 8850b4243e81f623e1601062a9dc5280c962c6bf Mon Sep 17 00:00:00 2001 From: jmharmon <37360760+jmharmon@users.noreply.github.com> Date: Tue, 3 Sep 2019 23:28:51 -0700 Subject: [PATCH 01/10] Implement Witching Well --- Mage.Sets/src/mage/cards/w/WitchingWell.java | 44 ++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/w/WitchingWell.java diff --git a/Mage.Sets/src/mage/cards/w/WitchingWell.java b/Mage.Sets/src/mage/cards/w/WitchingWell.java new file mode 100644 index 00000000000..965e730f14d --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WitchingWell.java @@ -0,0 +1,44 @@ +package mage.cards.w; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.keyword.ScryEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; + +import java.util.UUID; + +/** + * + * @author jmharmon + */ + +public final class WitchingWell extends CardImpl { + + public WitchingWell(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{U}"); + + // When Witching Well enters the battlefield, scry 2. + this.addAbility(new EntersBattlefieldTriggeredAbility(new ScryEffect(2))); + + // {3}{U}, Sacrifice Witching Well: Draw two cards. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(2), new ManaCostsImpl("{3}{U}")); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + } + + public WitchingWell(final WitchingWell card) { + super(card); + } + + @Override + public WitchingWell copy() { + return new WitchingWell(this); + } +} From 69f7ae624b265e2c668f8b712621175f6075ce25 Mon Sep 17 00:00:00 2001 From: jmharmon <37360760+jmharmon@users.noreply.github.com> Date: Tue, 3 Sep 2019 23:29:47 -0700 Subject: [PATCH 02/10] Implement Golden Egg --- Mage.Sets/src/mage/cards/g/GoldenEgg.java | 56 +++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GoldenEgg.java diff --git a/Mage.Sets/src/mage/cards/g/GoldenEgg.java b/Mage.Sets/src/mage/cards/g/GoldenEgg.java new file mode 100644 index 00000000000..65b9e5ed647 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GoldenEgg.java @@ -0,0 +1,56 @@ +package mage.cards.g; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.mana.AnyColorManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; + +import java.util.UUID; + +/** + * + * @author jmharmon + */ + +public final class GoldenEgg extends CardImpl { + + public GoldenEgg(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); + this.subtype.add(SubType.FOOD); + + // When Golden Egg enters the battlefield, draw a card. + this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1))); + + // {1}, {T}: Sacrifice Golden Egg: Add one mana of any color. + Ability ability = new AnyColorManaAbility(new GenericManaCost(1)); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + + // {2}, {T}, Sacrifice Golden Egg: You gain 3 life. + Ability ability1 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(3), new ManaCostsImpl("{1}")); + ability1.addCost(new TapSourceCost()); + ability1.addCost(new SacrificeSourceCost()); + this.addAbility(ability1); + } + + public GoldenEgg(final GoldenEgg card) { + super(card); + } + + @Override + public GoldenEgg copy() { + return new GoldenEgg(this); + } +} From 00dedb359a4cc33e63c435624d378825818752a6 Mon Sep 17 00:00:00 2001 From: jmharmon <37360760+jmharmon@users.noreply.github.com> Date: Tue, 3 Sep 2019 23:30:41 -0700 Subject: [PATCH 03/10] Implement GildedGoose --- Mage.Sets/src/mage/cards/GildedGoose.java | 71 +++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/GildedGoose.java diff --git a/Mage.Sets/src/mage/cards/GildedGoose.java b/Mage.Sets/src/mage/cards/GildedGoose.java new file mode 100644 index 00000000000..e733ac281e2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/GildedGoose.java @@ -0,0 +1,71 @@ +package mage.cards.g; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; +import mage.abilities.mana.AnyColorManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.permanent.token.custom.FoodToken; +import mage.target.common.TargetControlledPermanent; + +import java.util.UUID; + +/** + * + * @author jmharmon + */ + +public final class GildedGoose extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("a Food"); + + static { + filter.add(new SubtypePredicate(SubType.FOOD)); + } + + public GildedGoose(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}"); + this.subtype.add(SubType.BIRD); + + this.power = new MageInt(0); + this.toughness = new MageInt(2); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // When Gilded Goose enters the battlefield, create a Food token. (It’s an artifact with “{2}, {T}, Sacrifice this artifact: You gain 3 life.”) + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new FoodToken()), false)); + + // {1}{G}, {T}: Create a Food token. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new FoodToken()), new ManaCostsImpl("{1}{G}")); + ability.addCost(new TapSourceCost()); + this.addAbility(ability); + + // {T}, Sacrifice a Food: Add one mana of any color. + ActivatedManaAbilityImpl ability1 = new AnyColorManaAbility(new TapSourceCost()); + ability1.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter))); + this.addAbility(ability1); + } + + public GildedGoose(final GildedGoose card) { + super(card); + } + + @Override + public GildedGoose copy() { + return new GildedGoose(this); + } +} From b9f1c9ad6b8fa66d65dfd46e596e0c4630407347 Mon Sep 17 00:00:00 2001 From: jmharmon <37360760+jmharmon@users.noreply.github.com> Date: Tue, 3 Sep 2019 23:31:45 -0700 Subject: [PATCH 04/10] Implement Crystal Slipper --- .../src/mage/cards/c/CrystalSlipper.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/CrystalSlipper.java diff --git a/Mage.Sets/src/mage/cards/c/CrystalSlipper.java b/Mage.Sets/src/mage/cards/c/CrystalSlipper.java new file mode 100644 index 00000000000..1675e6e3c49 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CrystalSlipper.java @@ -0,0 +1,42 @@ +package mage.cards.c; + +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.continuous.BoostEquippedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EquipAbility; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; + +import java.util.UUID; + +/** + * + * @author jmharmon + */ + +public final class CrystalSlipper extends CardImpl { + + public CrystalSlipper(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{R}"); + this.subtype.add(SubType.EQUIPMENT); + + // Equipped creature gets +1/+0 and has haste. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(1, 0))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(HasteAbility.getInstance(), AttachmentType.EQUIPMENT))); + + // Equip {1} + this.addAbility(new EquipAbility(Outcome.BoostCreature, new GenericManaCost(1))); + } + + public CrystalSlipper(final CrystalSlipper card) { + super(card); + } + + @Override + public CrystalSlipper copy() { + return new CrystalSlipper(this); + } +} From 52f2d6399c9efa7eb5ab57939725e704d9f5b619 Mon Sep 17 00:00:00 2001 From: jmharmon <37360760+jmharmon@users.noreply.github.com> Date: Tue, 3 Sep 2019 23:36:51 -0700 Subject: [PATCH 05/10] Implement Food artifact subtype --- Mage/src/main/java/mage/constants/SubType.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage/src/main/java/mage/constants/SubType.java b/Mage/src/main/java/mage/constants/SubType.java index e0d8c557db6..449a6d7c1e1 100644 --- a/Mage/src/main/java/mage/constants/SubType.java +++ b/Mage/src/main/java/mage/constants/SubType.java @@ -37,6 +37,7 @@ public enum SubType { CLUE("Clue", SubTypeSet.ArtifactType), CONTRAPTION("Contraption", SubTypeSet.ArtifactType), EQUIPMENT("Equipment", SubTypeSet.ArtifactType), + FOOD("Food", SubTypeSet.ArtifactType), FORTIFICATION("Fortification", SubTypeSet.ArtifactType), TREASURE("Treasure", SubTypeSet.ArtifactType), VEHICLE("Vehicle", SubTypeSet.ArtifactType), From a10fbc765f21408de615f985d85b3f6e4debb130 Mon Sep 17 00:00:00 2001 From: jmharmon <37360760+jmharmon@users.noreply.github.com> Date: Tue, 3 Sep 2019 23:38:08 -0700 Subject: [PATCH 06/10] Implement Food Token --- .../mage/game/permanent/token/FoodToken.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 Mage/src/main/java/mage/game/permanent/token/FoodToken.java diff --git a/Mage/src/main/java/mage/game/permanent/token/FoodToken.java b/Mage/src/main/java/mage/game/permanent/token/FoodToken.java new file mode 100644 index 00000000000..e2d1b072214 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/FoodToken.java @@ -0,0 +1,60 @@ +package mage.game.permanent.token.custom; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.GainLifeEffect; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.game.permanent.token.TokenImpl; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * + * @author jmharmon + */ + +public final class FoodToken extends TokenImpl { + + static final private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("ELD")); + } + + public FoodToken() { + this(null, 0); + } + + public FoodToken(String setCode) { + this(setCode, 0); + } + + public FoodToken(String setCode, int tokenType) { + super("Food", "Food token"); + availableImageSetCodes = tokenImageSets; + setOriginalExpansionSetCode(setCode); + cardType.add(CardType.ARTIFACT); + subtype.add(SubType.FOOD); + + // {2}, {T}, Sacrifice this artifact: You gain 3 life.” + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(3), new GenericManaCost(2)); + SacrificeSourceCost cost = new SacrificeSourceCost(); + cost.setText("Sacrifice this artifact"); + ability.addCost(cost); + this.addAbility(ability); + } + + public FoodToken(final FoodToken token) { + super(token); + } + + public FoodToken copy() { + return new FoodToken(this); + } +} From 335446b1db8ee57bbf56dbdc173aa86ae36a8899 Mon Sep 17 00:00:00 2001 From: jmharmon <37360760+jmharmon@users.noreply.github.com> Date: Tue, 3 Sep 2019 23:43:39 -0700 Subject: [PATCH 07/10] Implement Wishful Merfolk --- .../src/mage/cards/w/WishfulMerfolk.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/w/WishfulMerfolk.java diff --git a/Mage.Sets/src/mage/cards/w/WishfulMerfolk.java b/Mage.Sets/src/mage/cards/w/WishfulMerfolk.java new file mode 100644 index 00000000000..4d7c663d70c --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WishfulMerfolk.java @@ -0,0 +1,65 @@ +package mage.cards.w; + +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; +import mage.abilities.keyword.DefenderAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.game.permanent.token.TokenImpl; + +import java.util.UUID; + +/** + * + * @author jmharmon + */ + +public final class WishfulMerfolk extends CardImpl { + + public WishfulMerfolk(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); + this.subtype.add(SubType.MERFOLK); + + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Defender + this.addAbility(DefenderAbility.getInstance()); + + // {1}{U}: Wishful Merfolk loses defender and becomes a Human until end of turn. + //this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new WishfulMerfolkEffect(), new ManaCostsImpl("{1}{U}"))); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect(new WishfulMerfolkToken(), "", Duration.EndOfTurn), new ManaCostsImpl("{1}{U}"))); + } + + public WishfulMerfolk(final WishfulMerfolk card) { + super(card); + } + + @Override + public WishfulMerfolk copy() { + return new WishfulMerfolk(this); + } +} + +class WishfulMerfolkToken extends TokenImpl { + + public WishfulMerfolkToken() { + super("Wishful Merfolk", ""); + this.cardType.add(CardType.CREATURE); + this.subtype.add(SubType.HUMAN); + this.color.setBlue(true); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + } + + public WishfulMerfolkToken(final WishfulMerfolkToken token) { + super(token); + } + + public WishfulMerfolkToken copy() { + return new WishfulMerfolkToken(this); + } +} From 234aa6b264e8dd9af6d46f981564d7fde77a802c Mon Sep 17 00:00:00 2001 From: jmharmon <37360760+jmharmon@users.noreply.github.com> Date: Tue, 3 Sep 2019 23:45:08 -0700 Subject: [PATCH 08/10] Update file --- Mage.Sets/src/mage/sets/ThroneOfEldraine.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Mage.Sets/src/mage/sets/ThroneOfEldraine.java b/Mage.Sets/src/mage/sets/ThroneOfEldraine.java index 294a1326ae4..69b482bf992 100644 --- a/Mage.Sets/src/mage/sets/ThroneOfEldraine.java +++ b/Mage.Sets/src/mage/sets/ThroneOfEldraine.java @@ -29,5 +29,10 @@ public final class ThroneOfEldraine extends ExpansionSet { cards.add(new SetCardInfo("Arcane Signet", 331, Rarity.COMMON, mage.cards.a.ArcaneSignet.class)); cards.add(new SetCardInfo("Chulane, Teller of Tales", 326, Rarity.MYTHIC, mage.cards.c.ChulaneTellerOfTales.class)); + cards.add(new SetCardInfo("Crystal Slipper", 119, Rarity.COMMON, mage.cards.c.CrystalSlipper.class)); + cards.add(new SetCardInfo("Gilded Goose", 160, Rarity.RARE, mage.cards.g.GildedGoose.class)); + cards.add(new SetCardInfo("Golden Egg", 220, Rarity.COMMON, mage.cards.g.GoldenEgg.class)); + cards.add(new SetCardInfo("Wishful Merfolk", 73, Rarity.COMMON, mage.cards.w.WishfulMerfolk.class)); + cards.add(new SetCardInfo("Witching Well", 74, Rarity.COMMON, mage.cards.w.WitchingWell.class)); } } From 95ef0d933c7ff124b13d7d0494894d69d79e9934 Mon Sep 17 00:00:00 2001 From: jmharmon <37360760+jmharmon@users.noreply.github.com> Date: Tue, 3 Sep 2019 23:54:11 -0700 Subject: [PATCH 09/10] Fixed cost on second ability --- Mage.Sets/src/mage/cards/g/GoldenEgg.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/g/GoldenEgg.java b/Mage.Sets/src/mage/cards/g/GoldenEgg.java index 65b9e5ed647..55a7b8c6ad8 100644 --- a/Mage.Sets/src/mage/cards/g/GoldenEgg.java +++ b/Mage.Sets/src/mage/cards/g/GoldenEgg.java @@ -39,7 +39,7 @@ public final class GoldenEgg extends CardImpl { this.addAbility(ability); // {2}, {T}, Sacrifice Golden Egg: You gain 3 life. - Ability ability1 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(3), new ManaCostsImpl("{1}")); + Ability ability1 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(3), new ManaCostsImpl("{2}")); ability1.addCost(new TapSourceCost()); ability1.addCost(new SacrificeSourceCost()); this.addAbility(ability1); From 9f304bf4aec334e10eb3c6958c09af92de335264 Mon Sep 17 00:00:00 2001 From: jmharmon <37360760+jmharmon@users.noreply.github.com> Date: Wed, 4 Sep 2019 00:15:49 -0700 Subject: [PATCH 10/10] Add TapSourceCost --- Mage/src/main/java/mage/game/permanent/token/FoodToken.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage/src/main/java/mage/game/permanent/token/FoodToken.java b/Mage/src/main/java/mage/game/permanent/token/FoodToken.java index e2d1b072214..87514016083 100644 --- a/Mage/src/main/java/mage/game/permanent/token/FoodToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/FoodToken.java @@ -44,6 +44,7 @@ public final class FoodToken extends TokenImpl { // {2}, {T}, Sacrifice this artifact: You gain 3 life.” Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(3), new GenericManaCost(2)); + ability.addCost(new TapSourceCost()); SacrificeSourceCost cost = new SacrificeSourceCost(); cost.setText("Sacrifice this artifact"); ability.addCost(cost);