From 921865a8f937ee56f80ea69d4100448a7219ff32 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 1 Jun 2022 20:22:02 -0400 Subject: [PATCH] [CLB] Implemented Scaled Nurturer --- .../mage/cards/g/GilanraCallerOfWirewood.java | 85 +++---------------- .../src/mage/cards/s/ScaledNurturer.java | 54 ++++++++++++ .../CommanderLegendsBattleForBaldursGate.java | 1 + .../ManaSpentDelayedTriggeredAbility.java | 84 ++++++++++++++++++ 4 files changed, 152 insertions(+), 72 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/s/ScaledNurturer.java create mode 100644 Mage/src/main/java/mage/abilities/common/delayed/ManaSpentDelayedTriggeredAbility.java diff --git a/Mage.Sets/src/mage/cards/g/GilanraCallerOfWirewood.java b/Mage.Sets/src/mage/cards/g/GilanraCallerOfWirewood.java index 685cb7448f6..c6e82eca859 100644 --- a/Mage.Sets/src/mage/cards/g/GilanraCallerOfWirewood.java +++ b/Mage.Sets/src/mage/cards/g/GilanraCallerOfWirewood.java @@ -1,8 +1,7 @@ package mage.cards.g; import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.DelayedTriggeredAbility; +import mage.abilities.common.delayed.ManaSpentDelayedTriggeredAbility; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.keyword.PartnerAbility; @@ -11,15 +10,11 @@ import mage.abilities.mana.GreenManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Duration; +import mage.constants.ComparisonType; import mage.constants.SubType; import mage.constants.SuperType; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.game.stack.Spell; -import mage.players.ManaPoolItem; -import mage.players.Player; +import mage.filter.FilterSpell; +import mage.filter.predicate.mageobject.ManaValuePredicate; import java.util.UUID; @@ -28,6 +23,12 @@ import java.util.UUID; */ public final class GilanraCallerOfWirewood extends CardImpl { + private static final FilterSpell filter = new FilterSpell("a spell with mana value 6 or greater"); + + static { + filter.add(new ManaValuePredicate(ComparisonType.MORE_THAN, 5)); + } + public GilanraCallerOfWirewood(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); @@ -39,7 +40,9 @@ public final class GilanraCallerOfWirewood extends CardImpl { // {T}: Add {G}. When you spend this mana to cast a spell with converted mana cost 6 or greater, draw a card. BasicManaAbility ability = new GreenManaAbility(); - ability.addEffect(new CreateDelayedTriggeredAbilityEffect(new GilanraCallerOfWirewoodTriggeredAbility())); + ability.addEffect(new CreateDelayedTriggeredAbilityEffect( + new ManaSpentDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), filter) + )); ability.setUndoPossible(false); this.addAbility(ability); @@ -56,65 +59,3 @@ public final class GilanraCallerOfWirewood extends CardImpl { return new GilanraCallerOfWirewood(this); } } - -class GilanraCallerOfWirewoodTriggeredAbility extends DelayedTriggeredAbility { - - GilanraCallerOfWirewoodTriggeredAbility() { - super(new DrawCardSourceControllerEffect(1), Duration.Custom, true, false); - } - - private GilanraCallerOfWirewoodTriggeredAbility(final GilanraCallerOfWirewoodTriggeredAbility ability) { - super(ability); - } - - @Override - public GilanraCallerOfWirewoodTriggeredAbility copy() { - return new GilanraCallerOfWirewoodTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.MANA_PAID; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (!getSourceId().equals(event.getSourceId())) { - return false; - } - Permanent sourcePermanent = getSourcePermanentOrLKI(game); - if (sourcePermanent == null - || sourcePermanent - .getAbilities(game) - .stream() - .map(Ability::getOriginalId) - .map(UUID::toString) - .noneMatch(event.getData()::equals)) { - return false; - } - Spell spell = game.getStack().getSpell(event.getTargetId()); - return spell != null && spell.getManaValue() >= 6; - } - - @Override - public boolean isInactive(Game game) { - if (super.isInactive(game)) { - return true; - } - // must remove effect on empty mana pool to fix accumulate bug - // if no mana in pool then it can be discarded - Player player = game.getPlayer(this.getControllerId()); - return player == null - || player - .getManaPool() - .getManaItems() - .stream() - .map(ManaPoolItem::getSourceId) - .noneMatch(getSourceId()::equals); - } - - @Override - public String getRule() { - return "When you spend this mana to cast a spell with mana value 6 or greater, draw a card."; - } -} diff --git a/Mage.Sets/src/mage/cards/s/ScaledNurturer.java b/Mage.Sets/src/mage/cards/s/ScaledNurturer.java new file mode 100644 index 00000000000..cc8dc5d0c20 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/ScaledNurturer.java @@ -0,0 +1,54 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.common.delayed.ManaSpentDelayedTriggeredAbility; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.mana.BasicManaAbility; +import mage.abilities.mana.GreenManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterSpell; +import mage.filter.common.FilterCreatureSpell; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ScaledNurturer extends CardImpl { + + private static final FilterSpell filter = new FilterCreatureSpell("a Dragon creature spell"); + + static { + filter.add(SubType.DRAGON.getPredicate()); + } + + public ScaledNurturer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); + + this.subtype.add(SubType.DRAGON); + this.subtype.add(SubType.DRUID); + this.power = new MageInt(0); + this.toughness = new MageInt(2); + + // {T}: Add {G}. When you spend this mana to cast a Dragon creature spell, you gain 2 life. + BasicManaAbility ability = new GreenManaAbility(); + ability.addEffect(new CreateDelayedTriggeredAbilityEffect( + new ManaSpentDelayedTriggeredAbility(new GainLifeEffect(2), filter) + )); + ability.setUndoPossible(false); + this.addAbility(ability); + } + + private ScaledNurturer(final ScaledNurturer card) { + super(card); + } + + @Override + public ScaledNurturer copy() { + return new ScaledNurturer(this); + } +} diff --git a/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java b/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java index 50bb1376e1e..4024c46574e 100644 --- a/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java +++ b/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java @@ -265,6 +265,7 @@ public final class CommanderLegendsBattleForBaldursGate extends ExpansionSet { cards.add(new SetCardInfo("Sailors' Bane", 93, Rarity.UNCOMMON, mage.cards.s.SailorsBane.class)); cards.add(new SetCardInfo("Sapphire Dragon", 94, Rarity.UNCOMMON, mage.cards.s.SapphireDragon.class)); cards.add(new SetCardInfo("Sarevok, Deathbringer", 144, Rarity.UNCOMMON, mage.cards.s.SarevokDeathbringer.class)); + cards.add(new SetCardInfo("Scaled Nurturer", 252, Rarity.COMMON, mage.cards.s.ScaledNurturer.class)); cards.add(new SetCardInfo("Scouting Hawk", 41, Rarity.COMMON, mage.cards.s.ScoutingHawk.class)); cards.add(new SetCardInfo("Sea Gate", 359, Rarity.COMMON, mage.cards.s.SeaGate.class)); cards.add(new SetCardInfo("Sea Hag", 95, Rarity.COMMON, mage.cards.s.SeaHag.class)); diff --git a/Mage/src/main/java/mage/abilities/common/delayed/ManaSpentDelayedTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/delayed/ManaSpentDelayedTriggeredAbility.java new file mode 100644 index 00000000000..57d2147a174 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/delayed/ManaSpentDelayedTriggeredAbility.java @@ -0,0 +1,84 @@ +package mage.abilities.common.delayed; + +import mage.abilities.Ability; +import mage.abilities.DelayedTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.constants.Duration; +import mage.filter.FilterSpell; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.game.stack.Spell; +import mage.players.ManaPoolItem; +import mage.players.Player; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public class ManaSpentDelayedTriggeredAbility extends DelayedTriggeredAbility { + + private final FilterSpell filter; + + public ManaSpentDelayedTriggeredAbility(Effect effect, FilterSpell filter) { + super(effect, Duration.Custom, true, false); + this.filter = filter; + } + + private ManaSpentDelayedTriggeredAbility(final ManaSpentDelayedTriggeredAbility ability) { + super(ability); + this.filter = ability.filter; + } + + @Override + public ManaSpentDelayedTriggeredAbility copy() { + return new ManaSpentDelayedTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.MANA_PAID; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (!getSourceId().equals(event.getSourceId())) { + return false; + } + Permanent sourcePermanent = getSourcePermanentOrLKI(game); + if (sourcePermanent == null + || sourcePermanent + .getAbilities(game) + .stream() + .map(Ability::getOriginalId) + .map(UUID::toString) + .noneMatch(event.getData()::equals)) { + return false; + } + Spell spell = game.getStack().getSpell(event.getTargetId()); + return spell != null && filter.match(spell, spell.getControllerId(), this, game); + } + + @Override + public boolean isInactive(Game game) { + if (super.isInactive(game)) { + return true; + } + // must remove effect on empty mana pool to fix accumulate bug + // if no mana in pool then it can be discarded + Player player = game.getPlayer(this.getControllerId()); + return player == null + || player + .getManaPool() + .getManaItems() + .stream() + .map(ManaPoolItem::getSourceId) + .noneMatch(getSourceId()::equals); + } + + @Override + public String getTriggerPhrase() { + return "When you spend this mana to cast " + filter.getMessage() + ", "; + } +}