From 6533e2b03cfb1a48e8a958665d413621b57b7891 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Sat, 10 May 2025 18:04:51 -0400 Subject: [PATCH] [FIN] Implement Cid, Timeless Artificer --- .../mage/cards/c/CidTimelessArtificer.java | 82 +++++++++++++++++++ Mage.Sets/src/mage/sets/FinalFantasy.java | 1 + .../java/mage/cards/decks/DeckValidator.java | 1 + Utils/mtg-cards-data.txt | 1 + 4 files changed, 85 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/CidTimelessArtificer.java diff --git a/Mage.Sets/src/mage/cards/c/CidTimelessArtificer.java b/Mage.Sets/src/mage/cards/c/CidTimelessArtificer.java new file mode 100644 index 00000000000..eb4c97d973c --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CidTimelessArtificer.java @@ -0,0 +1,82 @@ +package mage.cards.c; + +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.AdditiveDynamicValue; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.common.InfoEffect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.hint.Hint; +import mage.abilities.hint.ValueHint; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.FilterCard; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class CidTimelessArtificer extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); + private static final FilterCard filter2 = new FilterCard(); + + static { + filter.add(Predicates.or( + CardType.ARTIFACT.getPredicate(), + SubType.HERO.getPredicate() + )); + filter2.add(SubType.ARTIFICER.getPredicate()); + } + + private static final DynamicValue xValue = new AdditiveDynamicValue( + new PermanentsOnBattlefieldCount(new FilterControlledPermanent(SubType.ARTIFICER)), + new CardsInControllerGraveyardCount(filter2) + ); + private static final Hint hint = new ValueHint( + "Artificers you control and Artificer cards in your graveyard", xValue + ); + + public CidTimelessArtificer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}{U}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.ARTIFICER); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Artifact creatures and Heroes you control get +1/+1 for each Artificer you control and each Artificer card in your graveyard. + this.addAbility(new SimpleStaticAbility(new BoostControlledEffect( + xValue, xValue, Duration.WhileOnBattlefield, filter, false + ).setText("artifact creatures and Heroes you control get +1/+1 " + + "for each Artificer you control and each Artificer card in your graveyard")).addHint(hint)); + + // A deck can have any number of cards named Cid, Timeless Artificer. + this.getSpellAbility().addEffect(new InfoEffect("a deck can have any number of cards named Cid, Timeless Artificer")); + + // Cycling {W}{U} + this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{W}{U}"))); + } + + private CidTimelessArtificer(final CidTimelessArtificer card) { + super(card); + } + + @Override + public CidTimelessArtificer copy() { + return new CidTimelessArtificer(this); + } +} diff --git a/Mage.Sets/src/mage/sets/FinalFantasy.java b/Mage.Sets/src/mage/sets/FinalFantasy.java index 354022fcc0e..ddf4fc3e8ce 100644 --- a/Mage.Sets/src/mage/sets/FinalFantasy.java +++ b/Mage.Sets/src/mage/sets/FinalFantasy.java @@ -23,6 +23,7 @@ public final class FinalFantasy extends ExpansionSet { cards.add(new SetCardInfo("Adventurer's Inn", 271, Rarity.COMMON, mage.cards.a.AdventurersInn.class)); cards.add(new SetCardInfo("Black Mage's Rod", 90, Rarity.COMMON, mage.cards.b.BlackMagesRod.class)); cards.add(new SetCardInfo("Chaos, the Endless", 221, Rarity.UNCOMMON, mage.cards.c.ChaosTheEndless.class)); + cards.add(new SetCardInfo("Cid, Timeless Artificer", 216, Rarity.UNCOMMON, mage.cards.c.CidTimelessArtificer.class)); cards.add(new SetCardInfo("Cloud, Planet's Champion", 552, Rarity.MYTHIC, mage.cards.c.CloudPlanetsChampion.class)); cards.add(new SetCardInfo("Commune with Beavers", 102, Rarity.COMMON, mage.cards.c.CommuneWithBeavers.class)); cards.add(new SetCardInfo("Cooking Campsite", 31, Rarity.UNCOMMON, mage.cards.c.CookingCampsite.class)); diff --git a/Mage/src/main/java/mage/cards/decks/DeckValidator.java b/Mage/src/main/java/mage/cards/decks/DeckValidator.java index 71f5f1ecafb..6a9772c4ae5 100644 --- a/Mage/src/main/java/mage/cards/decks/DeckValidator.java +++ b/Mage/src/main/java/mage/cards/decks/DeckValidator.java @@ -50,6 +50,7 @@ public abstract class DeckValidator implements Serializable { maxCopiesMap.put("Templar Knight", Integer.MAX_VALUE); maxCopiesMap.put("Hare Apparent", Integer.MAX_VALUE); maxCopiesMap.put("Tempest Hawk", Integer.MAX_VALUE); + maxCopiesMap.put("Cid, Timeless Artificer", Integer.MAX_VALUE); maxCopiesMap.put("Once More with Feeling", 1); maxCopiesMap.put("Seven Dwarves", 7); maxCopiesMap.put("Nazgul", 9); diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 8bfb7cfe0d1..89317d77af7 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -57198,6 +57198,7 @@ Shinryu, Transcendent Rival|Final Fantasy|127|R||Legendary Creature - Human Nobl Zell Dincht|Final Fantasy|170|R|{2}{R}|Legendary Creature - Human Monk|0|3|You may play an additional land on each of your turns.$Zell Dincht gets +1/+0 for each land you control.$At the beginning of your end step, return a land you control to its owner's hand.| Jumbo Cactuar|Final Fantasy|191|R|{5}{G}{G}|Creature - Plant|1|7|10,000 Needles -- Whenever this creature attacks, it gets +9999/+0 until end of turn.| Sazh's Chocobo|Final Fantasy|200|U|{G}|Creature - Bird|0|1|Landfall -- Whenever a land you control enters, put a +1/+1 counter on this creature.| +Cid, Timeless Artificer|Final Fantasy|216|U|{2}{W}{U}|Legendary Creature - Human Artificer|4|4|Artifact creatures and Heroes you control get +1/+1 for each Artificer you control and each Artificer card in your graveyard.$A deck can have any number of cards named Cid, Timeless Artificer.$Cycling {W}{U}| Emet-Selch, Unsundered|Final Fantasy|218|M|{1}{U}{B}|Legendary Creature - Elder Wizard|2|4|Vigilance$Whenever Emet-Selch enters or attacks, draw a card, then discard a card.$At the beginning of your upkeep, if there are fourteen or more cards in your graveyard, you may transform Emet-Selch.| Hades, Sorcerer of Eld|Final Fantasy|218|M||Legendary Creature - Avatar|6|6|Vigilance$Echo of the Lost -- During your turn, you may play cards from your graveyard.$If a card or token would be put into your graveyard from anywhere, exile it instead.| Garland, Knight of Cornelia|Final Fantasy|221|U|{B}{R}|Legendary Creature - Human Knight|3|2|Whenever you cast a noncreature spell, surveil 1.${3}{B}{B}{R}{R}: Return this card from your graveyard to the battlefield transformed. Activate only as a sorcery.|