From 13e633f1ca68afcf9788b5966f68cbaae5145ddd Mon Sep 17 00:00:00 2001 From: theelk801 Date: Wed, 14 May 2025 10:49:15 -0400 Subject: [PATCH] [FIN] Implement Vincent Valentine / Galian Beast --- Mage.Sets/src/mage/cards/g/GalianBeast.java | 51 +++++++++++ .../src/mage/cards/v/VincentValentine.java | 88 +++++++++++++++++++ Mage.Sets/src/mage/sets/FinalFantasy.java | 4 + Utils/mtg-cards-data.txt | 4 + 4 files changed, 147 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GalianBeast.java create mode 100644 Mage.Sets/src/mage/cards/v/VincentValentine.java diff --git a/Mage.Sets/src/mage/cards/g/GalianBeast.java b/Mage.Sets/src/mage/cards/g/GalianBeast.java new file mode 100644 index 00000000000..9ff6b2f8107 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GalianBeast.java @@ -0,0 +1,51 @@ +package mage.cards.g; + +import mage.MageInt; +import mage.abilities.common.DiesSourceTriggeredAbility; +import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect; +import mage.abilities.keyword.LifelinkAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class GalianBeast extends CardImpl { + + public GalianBeast(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, ""); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.WEREWOLF); + this.subtype.add(SubType.BEAST); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + this.nightCard = true; + this.color.setBlack(true); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Lifelink + this.addAbility(LifelinkAbility.getInstance()); + + // When Galian Beast dies, return it to the battlefield tapped. + this.addAbility(new DiesSourceTriggeredAbility(new ReturnSourceFromGraveyardToBattlefieldEffect(true) + .setText("return it to the battlefield tapped"))); + } + + private GalianBeast(final GalianBeast card) { + super(card); + } + + @Override + public GalianBeast copy() { + return new GalianBeast(this); + } +} diff --git a/Mage.Sets/src/mage/cards/v/VincentValentine.java b/Mage.Sets/src/mage/cards/v/VincentValentine.java new file mode 100644 index 00000000000..6cbb8596dd6 --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VincentValentine.java @@ -0,0 +1,88 @@ +package mage.cards.v; + +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.common.DiesCreatureTriggeredAbility; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.TransformAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.counters.CounterType; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.permanent.Permanent; + +import java.util.Optional; +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class VincentValentine extends CardImpl { + + public VincentValentine(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{B}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.ASSASSIN); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + this.secondSideCardClazz = mage.cards.g.GalianBeast.class; + + // Whenever a creature an opponent controls dies, put a number of +1/+1 counters on Vincent Valentine equal to that creature's power. + this.addAbility(new DiesCreatureTriggeredAbility( + new AddCountersSourceEffect(CounterType.P1P1.createInstance(), VincentValentineValue.instance) + .setText("put a number of +1/+1 counters on {this} equal to that creature's power"), + false, StaticFilters.FILTER_OPPONENTS_PERMANENT_A_CREATURE + )); + + // Whenever Vincent Valentine attacks, you may transform it. + this.addAbility(new TransformAbility()); + this.addAbility(new AttacksTriggeredAbility(new TransformSourceEffect(), true)); + } + + private VincentValentine(final VincentValentine card) { + super(card); + } + + @Override + public VincentValentine copy() { + return new VincentValentine(this); + } +} + +enum VincentValentineValue implements DynamicValue { + instance; + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + return Optional + .of((Permanent) effect.getValue("creatureDied")) + .map(MageObject::getPower) + .map(MageInt::getValue) + .orElse(0); + } + + @Override + public VincentValentineValue copy() { + return this; + } + + @Override + public String getMessage() { + return ""; + } + + @Override + public String toString() { + return "1"; + } +} diff --git a/Mage.Sets/src/mage/sets/FinalFantasy.java b/Mage.Sets/src/mage/sets/FinalFantasy.java index b298b0f67b8..864f27b3e23 100644 --- a/Mage.Sets/src/mage/sets/FinalFantasy.java +++ b/Mage.Sets/src/mage/sets/FinalFantasy.java @@ -98,6 +98,8 @@ public final class FinalFantasy extends ExpansionSet { cards.add(new SetCardInfo("Forest", 307, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Forest", 308, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Forest", 576, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Galian Beast", 125, Rarity.RARE, mage.cards.g.GalianBeast.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Galian Beast", 383, Rarity.RARE, mage.cards.g.GalianBeast.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Garland, Knight of Cornelia", 221, Rarity.UNCOMMON, mage.cards.g.GarlandKnightOfCornelia.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Garland, Knight of Cornelia", 486, Rarity.UNCOMMON, mage.cards.g.GarlandKnightOfCornelia.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Gladiolus Amicitia", 224, Rarity.UNCOMMON, mage.cards.g.GladiolusAmicitia.class, NON_FULL_USE_VARIOUS)); @@ -220,6 +222,8 @@ public final class FinalFantasy extends ExpansionSet { cards.add(new SetCardInfo("Vanille, Cheerful l'Cie", 392, Rarity.UNCOMMON, mage.cards.v.VanilleCheerfulLCie.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Vanille, Cheerful l'Cie", 475, Rarity.UNCOMMON, mage.cards.v.VanilleCheerfulLCie.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Vanille, Cheerful l'Cie", 537, Rarity.UNCOMMON, mage.cards.v.VanilleCheerfulLCie.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Vincent Valentine", 125, Rarity.RARE, mage.cards.v.VincentValentine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Vincent Valentine", 383, Rarity.RARE, mage.cards.v.VincentValentine.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Wastes", 309, Rarity.COMMON, mage.cards.w.Wastes.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("White Auracite", 41, Rarity.COMMON, mage.cards.w.WhiteAuracite.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("White Auracite", 579, Rarity.COMMON, mage.cards.w.WhiteAuracite.class, NON_FULL_USE_VARIOUS)); diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index f6f7e7bb16f..e05e7274db9 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -57664,6 +57664,8 @@ Sephiroth, Fabled SOLDIER|Final Fantasy|115|M|{2}{B}|Legendary Creature - Human Sephiroth, One-Winged Angel|Final Fantasy|115|M||Legendary Creature - Angel Nightmare Avatar|5|5|Flying$Super Nova -- As this creature transforms into Sephiroth, One-Winged Angel, you get an emblem with "Whenever a creature dies, target opponent loses 1 life and you gain 1 life."$Whenever Sephiroth attacks, you may sacrifice any number of other creatures. If you do, draw that many cards.| Summon: Primal Odin|Final Fantasy|121|R|{4}{B}{B}|Enchantment Creature - Saga Knight|5|3|(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)$I -- Gungnir -- Destroy target creature an opponent controls.$II -- Zantetsuken -- This creature gains "Whenever this creature deals combat damage to a player, that player loses the game."$III -- Hall of Sorrow -- Draw two cards. Each player loses 2 life.| Tonberry|Final Fantasy|122|U|{B}|Creature - Salamander Horror|2|1|This creature enters tapped with a stun counter on it.$Chef's Knife -- During your turn, this creature has first strike and deathtouch.| +Vincent Valentine|Final Fantasy|125|R|{2}{B}{B}|Legendary Creature - Assassin|2|2|Whenever a creature an opponent controls dies, put a number of +1/+1 counters on Vincent Valentine equal to that creature's power.$Whenever Vincent Valentine attacks, you may transform it.| +Galian Beast|Final Fantasy|125|R||Legendary Creature - Werewolf Beast|3|2|Trample, lifelink$When Galian Beast dies, return it to the battlefield tapped.| Zenos yae Galvus|Final Fantasy|127|R|{3}{B}{B}|Legendary Creature - Human Noble Warrior|4|4|My First Friend -- When Zenos yae Galvus enters, choose a creature an opponent controls. Until end of turn, creatures other than Zenos yae Galvus and the chosen creature get -2/-2.$When the chosen creature leaves the battlefield, transform Zenos yae Galvus.| Shinryu, Transcendent Rival|Final Fantasy|127|R||Legendary Creature - Dragon|8|8|Flying$As this creature transforms into Shinryu, choose an opponent.$Burning Chains -- When the chosen player loses the game, you win the game.| Zodiark, Umbral God|Final Fantasy|128|R|{B}{B}{B}{B}{B}|Legendary Creature - God|5|5|Indestructible$When Zodiark enters, each player sacrifices half the non-God creatures they control of their choice, rounded down.$Whenever a player sacrifices another creature, put a +1/+1 counter on Zodiark.| @@ -57782,6 +57784,8 @@ Fang, Fearless l'Cie|Final Fantasy|381|U|{2}{B}|Legendary Creature - Human Warri Ragnarok, Divine Deliverance|Final Fantasy|381b|U||Legendary Creature - Beast Avatar|7|6|Vigilance, menace, trample, reach, haste$When Ragnarok dies, destroy target permanent and return target nonlegendary permanent card from your graveyard to the battlefield.| Sephiroth, Fabled SOLDIER|Final Fantasy|382|M|{2}{B}|Legendary Creature - Human Avatar Soldier|3|3|Whenever Sephiroth enters or attacks, you may sacrifice another creature. If you do, draw a card.$Whenever another creature dies, target opponent loses 1 life and you gain 1 life. If this is the fourth time this ability has resolved this turn, transform Sephiroth.| Sephiroth, One-Winged Angel|Final Fantasy|382|M||Legendary Creature - Angel Nightmare Avatar|5|5|Flying$Super Nova -- As this creature transforms into Sephiroth, One-Winged Angel, you get an emblem with "Whenever a creature dies, target opponent loses 1 life and you gain 1 life."$Whenever Sephiroth attacks, you may sacrifice any number of other creatures. If you do, draw that many cards.| +Vincent Valentine|Final Fantasy|383|R|{2}{B}{B}|Legendary Creature - Assassin|2|2|Whenever a creature an opponent controls dies, put a number of +1/+1 counters on Vincent Valentine equal to that creature's power.$Whenever Vincent Valentine attacks, you may transform it.| +Galian Beast|Final Fantasy|383|R||Legendary Creature - Werewolf Beast|3|2|Trample, lifelink$When Galian Beast dies, return it to the battlefield tapped.| Zenos yae Galvus|Final Fantasy|384|R|{3}{B}{B}|Legendary Creature - Human Noble Warrior|4|4|My First Friend -- When Zenos yae Galvus enters, choose a creature an opponent controls. Until end of turn, creatures other than Zenos yae Galvus and the chosen creature get -2/-2.$When the chosen creature leaves the battlefield, transform Zenos yae Galvus.| Shinryu, Transcendent Rival|Final Fantasy|384|R||Legendary Creature - Dragon|8|8|Flying$As this creature transforms into Shinryu, choose an opponent.$Burning Chains -- When the chosen player loses the game, you win the game.| Clive, Ifrit's Dominant|Final Fantasy|385|M|{4}{R}{R}|Legendary Creature - Human Noble Warrior|5|5|When Clive enters, you may discard your hand, then draw cards equal to your devotion to red.${4}{R}{R}, {T}: Exile Clive, then return it to the battlefield transformed under its owner's control. Activate only as a sorcery.|