From a5e1fdd85e96190cd8f131c647a9baccf04f5d70 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 23 May 2025 16:13:06 -0400 Subject: [PATCH] [FIN] Implement Balamb Garden, SeeD Academy / Balamb Garden, Airborne --- .../mage/cards/b/BalambGardenAirborne.java | 48 +++++++++++ .../mage/cards/b/BalambGardenSeeDAcademy.java | 86 +++++++++++++++++++ Mage.Sets/src/mage/sets/FinalFantasy.java | 2 + 3 files changed, 136 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BalambGardenAirborne.java create mode 100644 Mage.Sets/src/mage/cards/b/BalambGardenSeeDAcademy.java diff --git a/Mage.Sets/src/mage/cards/b/BalambGardenAirborne.java b/Mage.Sets/src/mage/cards/b/BalambGardenAirborne.java new file mode 100644 index 00000000000..7b34006109d --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BalambGardenAirborne.java @@ -0,0 +1,48 @@ +package mage.cards.b; + +import mage.MageInt; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.keyword.CrewAbility; +import mage.abilities.keyword.FlyingAbility; +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 BalambGardenAirborne extends CardImpl { + + public BalambGardenAirborne(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, ""); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.VEHICLE); + this.power = new MageInt(5); + this.toughness = new MageInt(4); + this.nightCard = true; + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever Balamb Garden attacks, draw a card. + this.addAbility(new AttacksTriggeredAbility(new DrawCardSourceControllerEffect(1))); + + // Crew 1 + this.addAbility(new CrewAbility(1)); + } + + private BalambGardenAirborne(final BalambGardenAirborne card) { + super(card); + } + + @Override + public BalambGardenAirborne copy() { + return new BalambGardenAirborne(this); + } +} diff --git a/Mage.Sets/src/mage/cards/b/BalambGardenSeeDAcademy.java b/Mage.Sets/src/mage/cards/b/BalambGardenSeeDAcademy.java new file mode 100644 index 00000000000..2e3f25f7964 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BalambGardenSeeDAcademy.java @@ -0,0 +1,86 @@ +package mage.cards.b; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTappedAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.CostAdjuster; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.common.InfoEffect; +import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.hint.Hint; +import mage.abilities.hint.ValueHint; +import mage.abilities.keyword.TransformAbility; +import mage.abilities.mana.BlueManaAbility; +import mage.abilities.mana.GreenManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; +import mage.game.Game; +import mage.util.CardUtil; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class BalambGardenSeeDAcademy extends CardImpl { + + public BalambGardenSeeDAcademy(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + this.subtype.add(SubType.TOWN); + this.secondSideCardClazz = mage.cards.b.BalambGardenAirborne.class; + + // This land enters tapped. + this.addAbility(new EntersBattlefieldTappedAbility()); + + // Add {G} or {U}. + this.addAbility(new GreenManaAbility()); + this.addAbility(new BlueManaAbility()); + + // {5}{G}{U}: Transform this land. This ability costs {1} less to activate for each other Town you control. + this.addAbility(new TransformAbility()); + Ability ability = new SimpleActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{5}{G}{U}")); + ability.addEffect(new InfoEffect("This ability costs {1} less to activate for each other Town you control")); + this.addAbility(ability + .setCostAdjuster(BalambGardenSeeDAcademyAdjuster.instance) + .addHint(BalambGardenSeeDAcademyAdjuster.getHint())); + } + + private BalambGardenSeeDAcademy(final BalambGardenSeeDAcademy card) { + super(card); + } + + @Override + public BalambGardenSeeDAcademy copy() { + return new BalambGardenSeeDAcademy(this); + } +} + +enum BalambGardenSeeDAcademyAdjuster implements CostAdjuster { + instance; + private static final FilterPermanent filter = new FilterControlledPermanent(SubType.TOWN); + + static { + filter.add(AnotherPredicate.instance); + } + + private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(filter); + private static final Hint hint = new ValueHint("Other Towns you control", xValue); + + static Hint getHint() { + return hint; + } + + @Override + public void reduceCost(Ability ability, Game game) { + int count = xValue.calculate(game, ability, null); + CardUtil.reduceCost(ability, count); + } +} diff --git a/Mage.Sets/src/mage/sets/FinalFantasy.java b/Mage.Sets/src/mage/sets/FinalFantasy.java index a2cbf51a572..d6bca6532bf 100644 --- a/Mage.Sets/src/mage/sets/FinalFantasy.java +++ b/Mage.Sets/src/mage/sets/FinalFantasy.java @@ -45,6 +45,8 @@ public final class FinalFantasy extends ExpansionSet { cards.add(new SetCardInfo("Astrologian's Planisphere", 46, Rarity.RARE, mage.cards.a.AstrologiansPlanisphere.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Astrologian's Planisphere", 581, Rarity.RARE, mage.cards.a.AstrologiansPlanisphere.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Auron's Inspiration", 8, Rarity.UNCOMMON, mage.cards.a.AuronsInspiration.class)); + cards.add(new SetCardInfo("Balamb Garden, Airborne", 272, Rarity.RARE, mage.cards.b.BalambGardenAirborne.class)); + cards.add(new SetCardInfo("Balamb Garden, SeeD Academy", 272, Rarity.RARE, mage.cards.b.BalambGardenSeeDAcademy.class)); cards.add(new SetCardInfo("Balamb T-Rexaur", 173, Rarity.COMMON, mage.cards.b.BalambTRexaur.class)); cards.add(new SetCardInfo("Balthier and Fran", 213, Rarity.RARE, mage.cards.b.BalthierAndFran.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Balthier and Fran", 319, Rarity.RARE, mage.cards.b.BalthierAndFran.class, NON_FULL_USE_VARIOUS));