From bcd86872859d8ef30f0fd3e1033872a6205cd6ca Mon Sep 17 00:00:00 2001 From: Susucre <34709007+Susucre@users.noreply.github.com> Date: Sat, 28 Oct 2023 18:08:12 +0200 Subject: [PATCH] [LCI] Implement Poetic Ingenuity --- .../src/mage/cards/f/FangornTreeShepherd.java | 2 +- .../src/mage/cards/p/PoeticIngenuity.java | 77 +++++++++++++++++++ Mage.Sets/src/mage/cards/r/RabbleRousing.java | 2 +- .../src/mage/cards/s/ScreamingSwarm.java | 2 +- .../src/mage/sets/TheLostCavernsOfIxalan.java | 1 + .../AttacksWithCreaturesTriggeredAbility.java | 5 +- .../game/permanent/token/Dinosaur31Token.java | 28 +++++++ 7 files changed, 113 insertions(+), 4 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/p/PoeticIngenuity.java create mode 100644 Mage/src/main/java/mage/game/permanent/token/Dinosaur31Token.java diff --git a/Mage.Sets/src/mage/cards/f/FangornTreeShepherd.java b/Mage.Sets/src/mage/cards/f/FangornTreeShepherd.java index 32eb90e8830..f8b206bf834 100644 --- a/Mage.Sets/src/mage/cards/f/FangornTreeShepherd.java +++ b/Mage.Sets/src/mage/cards/f/FangornTreeShepherd.java @@ -77,7 +77,7 @@ class FangornTreeShepherdEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); - int amount = (Integer) getValue("attackers"); + int amount = (Integer) getValue(AttacksWithCreaturesTriggeredAbility.VALUEKEY_NUMBER_ATTACKERS); if (player != null && amount > 0) { player.getManaPool().addMana(Mana.GreenMana(2 * amount), game, source); return true; diff --git a/Mage.Sets/src/mage/cards/p/PoeticIngenuity.java b/Mage.Sets/src/mage/cards/p/PoeticIngenuity.java new file mode 100644 index 00000000000..1eaba72f247 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PoeticIngenuity.java @@ -0,0 +1,77 @@ +package mage.cards.p; + +import mage.abilities.Ability; +import mage.abilities.common.AttacksWithCreaturesTriggeredAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledPermanent; +import mage.game.Game; +import mage.game.permanent.token.Dinosaur31Token; +import mage.game.permanent.token.TreasureToken; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class PoeticIngenuity extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledPermanent(SubType.DINOSAUR); + + public PoeticIngenuity(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}"); + + // Whenever one or more Dinosaurs you control attack, create that many Treasure tokens. + this.addAbility(new AttacksWithCreaturesTriggeredAbility( + new PoeticIngenuityEffect(), 1, filter + ).setTriggerPhrase("Whenever one or more Dinosaurs you control attack, ")); + + // Whenever you cast an artifact spell, create a 3/1 red Dinosaur creature token. This ability triggers only once per turn. + this.addAbility(new SpellCastControllerTriggeredAbility( + new CreateTokenEffect(new Dinosaur31Token()), + StaticFilters.FILTER_SPELL_AN_ARTIFACT, + false + ).setTriggersOnceEachTurn(true)); + } + + private PoeticIngenuity(final PoeticIngenuity card) { + super(card); + } + + @Override + public PoeticIngenuity copy() { + return new PoeticIngenuity(this); + } +} + +class PoeticIngenuityEffect extends OneShotEffect { + + PoeticIngenuityEffect() { + super(Outcome.Benefit); + staticText = "create that many Treasure tokens"; + } + + private PoeticIngenuityEffect(final PoeticIngenuityEffect effect) { + super(effect); + } + + @Override + public PoeticIngenuityEffect copy() { + return new PoeticIngenuityEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + int amount = (Integer) getValue(AttacksWithCreaturesTriggeredAbility.VALUEKEY_NUMBER_ATTACKERS); + return amount > 0 && + new CreateTokenEffect(new TreasureToken(), amount).apply(game, source); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/r/RabbleRousing.java b/Mage.Sets/src/mage/cards/r/RabbleRousing.java index 1c84b86d3b8..ba6b3c4b414 100644 --- a/Mage.Sets/src/mage/cards/r/RabbleRousing.java +++ b/Mage.Sets/src/mage/cards/r/RabbleRousing.java @@ -63,7 +63,7 @@ enum RabbleRousingValue implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - return (Integer) effect.getValue("attackers"); + return (Integer) effect.getValue(AttacksWithCreaturesTriggeredAbility.VALUEKEY_NUMBER_ATTACKERS); } @Override diff --git a/Mage.Sets/src/mage/cards/s/ScreamingSwarm.java b/Mage.Sets/src/mage/cards/s/ScreamingSwarm.java index a3faa7bedc4..9ee1720a955 100644 --- a/Mage.Sets/src/mage/cards/s/ScreamingSwarm.java +++ b/Mage.Sets/src/mage/cards/s/ScreamingSwarm.java @@ -68,7 +68,7 @@ enum ScreamingSwarmValue implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - return (Integer) effect.getValue("attackers"); + return (Integer) effect.getValue(AttacksWithCreaturesTriggeredAbility.VALUEKEY_NUMBER_ATTACKERS); } @Override diff --git a/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java b/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java index d93c5a8484c..bf23c207972 100644 --- a/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java +++ b/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java @@ -79,6 +79,7 @@ public final class TheLostCavernsOfIxalan extends ExpansionSet { cards.add(new SetCardInfo("Oltec Cloud Guard", 28, Rarity.COMMON, mage.cards.o.OltecCloudGuard.class)); cards.add(new SetCardInfo("Palani's Hatcher", 237, Rarity.RARE, mage.cards.p.PalanisHatcher.class)); cards.add(new SetCardInfo("Plains", 393, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Poetic Ingenuity", 161, Rarity.RARE, mage.cards.p.PoeticIngenuity.class)); cards.add(new SetCardInfo("Poison Dart Frog", 207, Rarity.COMMON, mage.cards.p.PoisonDartFrog.class)); cards.add(new SetCardInfo("Pugnacious Hammerskull", 208, Rarity.RARE, mage.cards.p.PugnaciousHammerskull.class)); cards.add(new SetCardInfo("Quintorius Kand", 238, Rarity.MYTHIC, mage.cards.q.QuintoriusKand.class)); diff --git a/Mage/src/main/java/mage/abilities/common/AttacksWithCreaturesTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/AttacksWithCreaturesTriggeredAbility.java index a0a14bf2556..8bdb2645a64 100644 --- a/Mage/src/main/java/mage/abilities/common/AttacksWithCreaturesTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/AttacksWithCreaturesTriggeredAbility.java @@ -20,6 +20,9 @@ import java.util.stream.Collectors; */ public class AttacksWithCreaturesTriggeredAbility extends TriggeredAbilityImpl { + // retrieve the number of attackers in triggered effects with getValue + public static final String VALUEKEY_NUMBER_ATTACKERS = "number_attackers"; + private final FilterPermanent filter; private final int minAttackers; private final boolean setTargetPointer; @@ -86,7 +89,7 @@ public class AttacksWithCreaturesTriggeredAbility extends TriggeredAbilityImpl { if (attackers.size() < minAttackers) { return false; } - getEffects().setValue("attackers", attackers.size()); + getEffects().setValue(VALUEKEY_NUMBER_ATTACKERS, attackers.size()); if (setTargetPointer) { getEffects().setTargetPointer(new FixedTargets(attackers, game)); } diff --git a/Mage/src/main/java/mage/game/permanent/token/Dinosaur31Token.java b/Mage/src/main/java/mage/game/permanent/token/Dinosaur31Token.java new file mode 100644 index 00000000000..27aa5a7d887 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/Dinosaur31Token.java @@ -0,0 +1,28 @@ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.constants.CardType; +import mage.constants.SubType; + +/** + * @author Susucr + */ +public final class Dinosaur31Token extends TokenImpl { + + public Dinosaur31Token() { + super("Dinosaur Token", "3/1 red Dinosaur creature token"); + cardType.add(CardType.CREATURE); + color.setRed(true); + subtype.add(SubType.DINOSAUR); + power = new MageInt(3); + toughness = new MageInt(1); + } + + protected Dinosaur31Token(final Dinosaur31Token token) { + super(token); + } + + public Dinosaur31Token copy() { + return new Dinosaur31Token(this); + } +}