From 1907f555831c2911de9fbb7d2d30428419792fd8 Mon Sep 17 00:00:00 2001 From: Susucre <34709007+Susucre@users.noreply.github.com> Date: Sun, 22 Oct 2023 14:34:12 +0200 Subject: [PATCH] [LCI] Implement Huatli, Poet of Unity (#11331) --- .../src/mage/cards/h/HuatliPoetOfUnity.java | 59 +++++++++++ .../mage/cards/r/RoarOfTheFifthPeople.java | 100 ++++++++++++++++++ .../src/mage/sets/LostCavernsOfIxalan.java | 2 + .../permanent/token/DinosaurVanillaToken.java | 28 +++++ 4 files changed, 189 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/h/HuatliPoetOfUnity.java create mode 100644 Mage.Sets/src/mage/cards/r/RoarOfTheFifthPeople.java create mode 100644 Mage/src/main/java/mage/game/permanent/token/DinosaurVanillaToken.java diff --git a/Mage.Sets/src/mage/cards/h/HuatliPoetOfUnity.java b/Mage.Sets/src/mage/cards/h/HuatliPoetOfUnity.java new file mode 100644 index 00000000000..83e01945e95 --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HuatliPoetOfUnity.java @@ -0,0 +1,59 @@ +package mage.cards.h; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.ExileAndReturnSourceEffect; +import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; +import mage.abilities.keyword.TransformAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.PutCards; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.StaticFilters; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class HuatliPoetOfUnity extends CardImpl { + + public HuatliPoetOfUnity(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.WARRIOR); + this.subtype.add(SubType.BARD); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + this.secondSideCardClazz = mage.cards.r.RoarOfTheFifthPeople.class; + + // When Huatli, Poet of Unity enters the battlefield, search your library for a basic land card, reveal it, put it into your hand, then shuffle. + TargetCardInLibrary target = new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND); + this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInHandEffect(target, true), false)); + + // {3}{R/W}{R/W}: Exile Huatli, then return her to the battlefield transformed under her owner's control. Activate only as a sorcery. + this.addAbility(new TransformAbility()); + Ability ability = new ActivateAsSorceryActivatedAbility( + new ExileAndReturnSourceEffect(PutCards.BATTLEFIELD_TRANSFORMED), + new ManaCostsImpl<>("{3}{R/W}{R/W}") + ); + this.addAbility(ability); + } + + private HuatliPoetOfUnity(final HuatliPoetOfUnity card) { + super(card); + } + + @Override + public HuatliPoetOfUnity copy() { + return new HuatliPoetOfUnity(this); + } +} diff --git a/Mage.Sets/src/mage/cards/r/RoarOfTheFifthPeople.java b/Mage.Sets/src/mage/cards/r/RoarOfTheFifthPeople.java new file mode 100644 index 00000000000..6a4bbba19af --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RoarOfTheFifthPeople.java @@ -0,0 +1,100 @@ +package mage.cards.r; + +import mage.abilities.Ability; +import mage.abilities.common.SagaAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; +import mage.abilities.keyword.DoubleStrikeAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.abilities.mana.GreenManaAbility; +import mage.abilities.mana.RedManaAbility; +import mage.abilities.mana.WhiteManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SagaChapter; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledPermanent; +import mage.game.permanent.token.DinosaurVanillaToken; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class RoarOfTheFifthPeople extends CardImpl { + + private static final FilterCard filterCard = new FilterCard("Dinosaur card"); + private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.DINOSAUR, "Dinosaurs you control"); + + static { + filterCard.add(SubType.DINOSAUR.getPredicate()); + } + + public RoarOfTheFifthPeople(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, ""); + + this.color.setWhite(true); + this.color.setGreen(true); + this.color.setRed(true); + this.subtype.add(SubType.SAGA); + this.nightCard = true; + + // (As this Saga enters and after your draw step, add a lore counter. Sacrifice after IV.) + SagaAbility sagaAbility = new SagaAbility(this, SagaChapter.CHAPTER_IV); + + // I -- Create two 3/3 green Dinosaur creature tokens. + sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_I, new CreateTokenEffect(new DinosaurVanillaToken(), 2)); + + // II -- Roar of the Fifth People gains "Creatures you control have '{T}: Add {R}, {G}, or {W}.'" + + // Note: splitting the mana ability in 3 makes it easier on the UI. + Ability gainedAbility = new SimpleStaticAbility(new GainAbilityControlledEffect( + new RedManaAbility(), Duration.WhileOnBattlefield, StaticFilters.FILTER_CONTROLLED_CREATURES, false + ).setText("Creatures you control have '{T}: Add {R}")); + gainedAbility.addEffect(new GainAbilityControlledEffect( + new GreenManaAbility(), Duration.WhileOnBattlefield, StaticFilters.FILTER_CONTROLLED_CREATURES, false + ).setText(", {G}")); + gainedAbility.addEffect(new GainAbilityControlledEffect( + new WhiteManaAbility(), Duration.WhileOnBattlefield, StaticFilters.FILTER_CONTROLLED_CREATURES, false + ).setText(", or {W}.'")); + + sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_II, + new GainAbilitySourceEffect(gainedAbility, Duration.WhileOnBattlefield) + .setText("{this} gains \"Creatures you control have '{T}: Add {R}, {G}, or {W}.'\"") + ); + + // III -- Search your library for a Dinosaur card, reveal it, put it into your hand, then shuffle. + TargetCardInLibrary target = new TargetCardInLibrary(filterCard); + sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new SearchLibraryPutInHandEffect(target, true)); + + // IV -- Dinosaurs you control gain double strike and trample until end of turn. + sagaAbility.addChapterEffect( + this, SagaChapter.CHAPTER_IV, + new GainAbilityControlledEffect( + DoubleStrikeAbility.getInstance(), Duration.EndOfTurn, filter + ).setText("Dinosaurs you control gain double strike"), + new GainAbilityControlledEffect( + TrampleAbility.getInstance(), Duration.EndOfTurn, filter + ).setText("and trample until end of turn") + ); + + this.addAbility(sagaAbility); + } + + private RoarOfTheFifthPeople(final RoarOfTheFifthPeople card) { + super(card); + } + + @Override + public RoarOfTheFifthPeople copy() { + return new RoarOfTheFifthPeople(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LostCavernsOfIxalan.java b/Mage.Sets/src/mage/sets/LostCavernsOfIxalan.java index a4a29964908..0b2e149f126 100644 --- a/Mage.Sets/src/mage/sets/LostCavernsOfIxalan.java +++ b/Mage.Sets/src/mage/sets/LostCavernsOfIxalan.java @@ -24,10 +24,12 @@ public final class LostCavernsOfIxalan extends ExpansionSet { cards.add(new SetCardInfo("Cavern of Souls", 269, Rarity.MYTHIC, mage.cards.c.CavernOfSouls.class)); cards.add(new SetCardInfo("Forest", 291, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Ghalta, Stampede Tyrant", 185, Rarity.MYTHIC, mage.cards.g.GhaltaStampedeTyrant.class)); + cards.add(new SetCardInfo("Huatli, Poet of Unity", 189, Rarity.MYTHIC, mage.cards.h.HuatliPoetOfUnity.class)); cards.add(new SetCardInfo("Island", 288, Rarity.LAND, mage.cards.basiclands.Island.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Mountain", 290, Rarity.LAND, mage.cards.basiclands.Mountain.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Ojer Axonil, Deepest Might", 317, Rarity.MYTHIC, mage.cards.o.OjerAxonilDeepestMight.class)); cards.add(new SetCardInfo("Plains", 287, Rarity.LAND, mage.cards.basiclands.Plains.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Roar of the Fifth People", 189, Rarity.MYTHIC, mage.cards.r.RoarOfTheFifthPeople.class)); cards.add(new SetCardInfo("Swamp", 289, Rarity.LAND, mage.cards.basiclands.Swamp.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Temple of Power", 317, Rarity.MYTHIC, mage.cards.t.TempleOfPower.class)); cards.add(new SetCardInfo("The Skullspore Nexus", 212, Rarity.MYTHIC, mage.cards.t.TheSkullsporeNexus.class)); diff --git a/Mage/src/main/java/mage/game/permanent/token/DinosaurVanillaToken.java b/Mage/src/main/java/mage/game/permanent/token/DinosaurVanillaToken.java new file mode 100644 index 00000000000..309a7e5212b --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/DinosaurVanillaToken.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 DinosaurVanillaToken extends TokenImpl { + + public DinosaurVanillaToken() { + super("Dinosaur Token", "3/3 green Dinosaur creature token"); + cardType.add(CardType.CREATURE); + color.setGreen(true); + subtype.add(SubType.DINOSAUR); + power = new MageInt(3); + toughness = new MageInt(3); + } + + protected DinosaurVanillaToken(final DinosaurVanillaToken token) { + super(token); + } + + public DinosaurVanillaToken copy() { + return new DinosaurVanillaToken(this); + } +}