diff --git a/Mage.Sets/src/mage/cards/c/ConsumedByGreed.java b/Mage.Sets/src/mage/cards/c/ConsumedByGreed.java new file mode 100644 index 00000000000..2e3087089a8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ConsumedByGreed.java @@ -0,0 +1,59 @@ +package mage.cards.c; + +import mage.abilities.condition.common.GiftWasPromisedCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; +import mage.abilities.effects.common.SacrificeEffect; +import mage.abilities.keyword.GiftAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.GiftType; +import mage.filter.StaticFilters; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.GreatestPowerControlledPredicate; +import mage.target.common.TargetCardInYourGraveyard; +import mage.target.common.TargetOpponent; +import mage.target.targetadjustment.ConditionalTargetAdjuster; +import mage.target.targetpointer.SecondTargetPointer; + +import java.util.UUID; + +/** + * @author notgreat + */ +public final class ConsumedByGreed extends CardImpl { + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with the greatest power among creatures they control"); + + static { + filter.add(GreatestPowerControlledPredicate.instance); + } + + public ConsumedByGreed(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{B}{B}"); + + + // Gift a card + this.addAbility(new GiftAbility(this, GiftType.CARD)); + + // Target opponent sacrifices a creature with the greatest power among creatures they control. If the gift was promised, return target creature card from your graveyard to your hand. + this.getSpellAbility().addEffect(new SacrificeEffect(filter, 1, "Target opponent")); + this.getSpellAbility().addTarget(new TargetOpponent()); + + this.getSpellAbility().addEffect(new ConditionalOneShotEffect( + new ReturnFromGraveyardToHandTargetEffect(), GiftWasPromisedCondition.TRUE, + "If the gift was promised, return target creature card from your graveyard to your hand.") + .setTargetPointer(new SecondTargetPointer())); + this.getSpellAbility().setTargetAdjuster(new ConditionalTargetAdjuster(GiftWasPromisedCondition.TRUE, true, + new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD))); + } + + private ConsumedByGreed(final ConsumedByGreed card) { + super(card); + } + + @Override + public ConsumedByGreed copy() { + return new ConsumedByGreed(this); + } +} diff --git a/Mage.Sets/src/mage/cards/h/HeapedHarvest.java b/Mage.Sets/src/mage/cards/h/HeapedHarvest.java new file mode 100644 index 00000000000..ce26f3f44b6 --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HeapedHarvest.java @@ -0,0 +1,47 @@ +package mage.cards.h; + +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SacrificeSourceTriggeredAbility; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.abilities.meta.OrTriggeredAbility; +import mage.abilities.token.FoodAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author notgreat + */ +public final class HeapedHarvest extends CardImpl { + + public HeapedHarvest(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{G}"); + + this.subtype.add(SubType.FOOD); + + // When Heaped Harvest enters and when you sacrifice it, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle. + this.addAbility(new OrTriggeredAbility(Zone.BATTLEFIELD, new SearchLibraryPutInPlayEffect( + new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND_A), true), true, + "When {this} enters and when you sacrifice it, ", + new EntersBattlefieldTriggeredAbility(null), new SacrificeSourceTriggeredAbility(null) + )); + + // {2}, {T}, Sacrifice Heaped Harvest: You gain 3 life. + this.addAbility(new FoodAbility(true)); + } + + private HeapedHarvest(final HeapedHarvest card) { + super(card); + } + + @Override + public HeapedHarvest copy() { + return new HeapedHarvest(this); + } +} diff --git a/Mage.Sets/src/mage/cards/m/MabelsMettle.java b/Mage.Sets/src/mage/cards/m/MabelsMettle.java new file mode 100644 index 00000000000..81f1690ff91 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MabelsMettle.java @@ -0,0 +1,37 @@ +package mage.cards.m; + +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.StaticFilters; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetpointer.SecondTargetPointer; + +import java.util.UUID; + +/** + * @author notgreat + */ +public final class MabelsMettle extends CardImpl { + + public MabelsMettle(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}"); + + + // Target creature gets +2/+2 until end of turn. Up to one other target creature gets +1/+1 until end of turn. + this.getSpellAbility().addEffect(new BoostTargetEffect(2, 2)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent().setTargetTag(1)); + this.getSpellAbility().addEffect(new BoostTargetEffect(1, 1).setTargetPointer(new SecondTargetPointer())); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1, StaticFilters.FILTER_ANOTHER_CREATURE_TARGET_2, false).setTargetTag(2)); + } + + private MabelsMettle(final MabelsMettle card) { + super(card); + } + + @Override + public MabelsMettle copy() { + return new MabelsMettle(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/ThoughtShucker.java b/Mage.Sets/src/mage/cards/t/ThoughtShucker.java new file mode 100644 index 00000000000..d5d62db6815 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/ThoughtShucker.java @@ -0,0 +1,69 @@ +package mage.cards.t; + +import mage.MageInt; +import mage.abilities.condition.common.ThresholdCondition; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.decorator.ConditionalActivatedAbility; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AbilityWord; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.counters.CounterType; + +import java.util.UUID; + +/** + * @author notgreat + */ +public final class ThoughtShucker extends CardImpl { + + public ThoughtShucker(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); + + this.subtype.add(SubType.RAT); + this.subtype.add(SubType.ROGUE); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Threshold -- {1}{U}: Put a +1/+1 counter on Thought Shucker and draw a card. Activate only if seven or more cards are in your graveyard and only once. + this.addAbility(new ThoughtShuckerActivatedAbility()); + } + + private ThoughtShucker(final ThoughtShucker card) { + super(card); + } + + @Override + public ThoughtShucker copy() { + return new ThoughtShucker(this); + } +} + +class ThoughtShuckerActivatedAbility extends ConditionalActivatedAbility { + ThoughtShuckerActivatedAbility() { + super(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), + new ManaCostsImpl<>("{1}{U}"), ThresholdCondition.instance); + addEffect(new DrawCardSourceControllerEffect(1).concatBy("and")); + setAbilityWord(AbilityWord.THRESHOLD); + maxActivationsPerGame = 1; + } + + protected ThoughtShuckerActivatedAbility(final ThoughtShuckerActivatedAbility ability) { + super(ability); + } + + @Override + public ThoughtShuckerActivatedAbility copy() { + return new ThoughtShuckerActivatedAbility(this); + } + + @Override + public String getRule() { + String rule = super.getRule(); + int len = rule.length(); + return rule.substring(0, len - 1) + " and only once."; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/Bloomburrow.java b/Mage.Sets/src/mage/sets/Bloomburrow.java index e8c1158ee4e..59fe146b5c7 100644 --- a/Mage.Sets/src/mage/sets/Bloomburrow.java +++ b/Mage.Sets/src/mage/sets/Bloomburrow.java @@ -58,6 +58,7 @@ public final class Bloomburrow extends ExpansionSet { cards.add(new SetCardInfo("Clifftop Lookout", 168, Rarity.UNCOMMON, mage.cards.c.ClifftopLookout.class)); cards.add(new SetCardInfo("Colossification", 392, Rarity.RARE, mage.cards.c.Colossification.class)); cards.add(new SetCardInfo("Conduct Electricity", 130, Rarity.COMMON, mage.cards.c.ConductElectricity.class)); + cards.add(new SetCardInfo("Consumed by Greed", 87, Rarity.UNCOMMON, mage.cards.c.ConsumedByGreed.class)); cards.add(new SetCardInfo("Corpseberry Cultivator", 210, Rarity.COMMON, mage.cards.c.CorpseberryCultivator.class)); cards.add(new SetCardInfo("Coruscation Mage", 131, Rarity.UNCOMMON, mage.cards.c.CoruscationMage.class)); cards.add(new SetCardInfo("Cruelclaw's Heist", 88, Rarity.RARE, mage.cards.c.CruelclawsHeist.class)); @@ -104,6 +105,7 @@ public final class Bloomburrow extends ExpansionSet { cards.add(new SetCardInfo("Hazardroot Herbalist", 174, Rarity.UNCOMMON, mage.cards.h.HazardrootHerbalist.class)); cards.add(new SetCardInfo("Hazel's Nocturne", 97, Rarity.UNCOMMON, mage.cards.h.HazelsNocturne.class)); cards.add(new SetCardInfo("Head of the Homestead", 216, Rarity.COMMON, mage.cards.h.HeadOfTheHomestead.class)); + cards.add(new SetCardInfo("Heaped Harvest", 175, Rarity.COMMON, mage.cards.h.HeapedHarvest.class)); cards.add(new SetCardInfo("Heartfire Hero", 138, Rarity.UNCOMMON, mage.cards.h.HeartfireHero.class)); cards.add(new SetCardInfo("Hearthborn Battler", 139, Rarity.RARE, mage.cards.h.HearthbornBattler.class)); cards.add(new SetCardInfo("Hidden Grotto", 254, Rarity.COMMON, mage.cards.h.HiddenGrotto.class)); @@ -135,6 +137,7 @@ public final class Bloomburrow extends ExpansionSet { cards.add(new SetCardInfo("Lumra, Bellow of the Woods", 183, Rarity.MYTHIC, mage.cards.l.LumraBellowOfTheWoods.class)); cards.add(new SetCardInfo("Lunar Convocation", 223, Rarity.RARE, mage.cards.l.LunarConvocation.class)); cards.add(new SetCardInfo("Lupinflower Village", 256, Rarity.UNCOMMON, mage.cards.l.LupinflowerVillage.class)); + cards.add(new SetCardInfo("Mabel's Mettle", 21, Rarity.UNCOMMON, mage.cards.m.MabelsMettle.class)); cards.add(new SetCardInfo("Mabel, Heir to Cragflame", 224, Rarity.RARE, mage.cards.m.MabelHeirToCragflame.class)); cards.add(new SetCardInfo("Maha, Its Feathers Night", 100, Rarity.MYTHIC, mage.cards.m.MahaItsFeathersNight.class)); cards.add(new SetCardInfo("Manifold Mouse", 143, Rarity.RARE, mage.cards.m.ManifoldMouse.class)); @@ -226,6 +229,7 @@ public final class Bloomburrow extends ExpansionSet { cards.add(new SetCardInfo("Thistledown Players", 35, Rarity.COMMON, mage.cards.t.ThistledownPlayers.class)); cards.add(new SetCardInfo("Thornplate Intimidator", 117, Rarity.COMMON, mage.cards.t.ThornplateIntimidator.class)); cards.add(new SetCardInfo("Thornvault Forager", 197, Rarity.RARE, mage.cards.t.ThornvaultForager.class)); + cards.add(new SetCardInfo("Thought Shucker", 77, Rarity.COMMON, mage.cards.t.ThoughtShucker.class)); cards.add(new SetCardInfo("Thought-Stalker Warlock", 118, Rarity.UNCOMMON, mage.cards.t.ThoughtStalkerWarlock.class)); cards.add(new SetCardInfo("Three Tree Mascot", 251, Rarity.COMMON, mage.cards.t.ThreeTreeMascot.class)); cards.add(new SetCardInfo("Three Tree Rootweaver", 198, Rarity.COMMON, mage.cards.t.ThreeTreeRootweaver.class)); diff --git a/Mage/src/main/java/mage/abilities/condition/common/GiftWasPromisedCondition.java b/Mage/src/main/java/mage/abilities/condition/common/GiftWasPromisedCondition.java index 1cf353240c5..b147c704981 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/GiftWasPromisedCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/GiftWasPromisedCondition.java @@ -25,6 +25,6 @@ public enum GiftWasPromisedCondition implements Condition { @Override public String toString() { - return "Gift was " + (flag ? "" : "not ") + "promised"; + return "the gift was " + (flag ? "" : "not ") + "promised"; } } diff --git a/Mage/src/main/java/mage/abilities/keyword/GiftAbility.java b/Mage/src/main/java/mage/abilities/keyword/GiftAbility.java index 821c9d593e4..7070eb9bd89 100644 --- a/Mage/src/main/java/mage/abilities/keyword/GiftAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/GiftAbility.java @@ -44,7 +44,7 @@ public class GiftAbility extends StaticAbility implements OptionalAdditionalSour public GiftAbility(Card card, GiftType giftType) { super(Zone.STACK, null); this.additionalCost = new OptionalAdditionalCostImpl( - keywordText + ' ' + giftType, + keywordText + ' ' + giftType.getName(), makeReminderText(giftType, card.isPermanent()), new PromiseGiftCost(giftType) );