From dd3057fa1058bef8934c94982f1d7e09a61974a8 Mon Sep 17 00:00:00 2001 From: Susucre <34709007+Susucre@users.noreply.github.com> Date: Thu, 4 Apr 2024 12:47:35 +0200 Subject: [PATCH] [BIG] Implement Tarnation Vista --- Mage.Sets/src/mage/cards/m/MirageMesa.java | 11 +- Mage.Sets/src/mage/cards/s/SunkenCitadel.java | 43 +------ .../src/mage/cards/t/TarnationVista.java | 112 ++++++++++++++++++ Mage.Sets/src/mage/sets/TheBigScore.java | 1 + ...eldTappedAsItEntersChooseColorAbility.java | 47 ++++++++ 5 files changed, 164 insertions(+), 50 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/t/TarnationVista.java create mode 100644 Mage/src/main/java/mage/abilities/common/EntersBattlefieldTappedAsItEntersChooseColorAbility.java diff --git a/Mage.Sets/src/mage/cards/m/MirageMesa.java b/Mage.Sets/src/mage/cards/m/MirageMesa.java index 92d3d6bb41e..f69d9440f84 100644 --- a/Mage.Sets/src/mage/cards/m/MirageMesa.java +++ b/Mage.Sets/src/mage/cards/m/MirageMesa.java @@ -1,15 +1,12 @@ package mage.cards.m; -import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldTappedAbility; +import mage.abilities.common.EntersBattlefieldTappedAsItEntersChooseColorAbility; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.ChooseColorEffect; import mage.abilities.effects.mana.AddManaChosenColorEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.SubType; import mage.constants.Zone; @@ -26,11 +23,7 @@ public final class MirageMesa extends CardImpl { this.subtype.add(SubType.DESERT); // Mirage Mesa enters the battlefield tapped. As it enters, choose a color. - Ability ability = new EntersBattlefieldTappedAbility( - "{this} enters the battlefield tapped. As it enters, choose a color." - ); - ability.addEffect(new ChooseColorEffect(Outcome.Benefit)); - this.addAbility(ability); + this.addAbility(new EntersBattlefieldTappedAsItEntersChooseColorAbility()); // {T}: Add one mana of the chosen color. this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaChosenColorEffect(), new TapSourceCost())); diff --git a/Mage.Sets/src/mage/cards/s/SunkenCitadel.java b/Mage.Sets/src/mage/cards/s/SunkenCitadel.java index 4f50a1a809f..e67ea38f2de 100644 --- a/Mage.Sets/src/mage/cards/s/SunkenCitadel.java +++ b/Mage.Sets/src/mage/cards/s/SunkenCitadel.java @@ -4,13 +4,9 @@ import mage.ConditionalMana; import mage.MageObject; import mage.Mana; import mage.abilities.Ability; -import mage.abilities.StaticAbility; +import mage.abilities.common.EntersBattlefieldTappedAsItEntersChooseColorAbility; import mage.abilities.condition.Condition; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.Effect; -import mage.abilities.effects.EntersBattlefieldEffect; -import mage.abilities.effects.common.ChooseColorEffect; -import mage.abilities.effects.common.TapSourceEffect; import mage.abilities.effects.mana.AddConditionalManaChosenColorEffect; import mage.abilities.effects.mana.AddManaChosenColorEffect; import mage.abilities.mana.SimpleManaAbility; @@ -18,7 +14,6 @@ import mage.abilities.mana.builder.ConditionalManaBuilder; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.SubType; import mage.constants.Zone; import mage.game.Game; @@ -36,7 +31,7 @@ public final class SunkenCitadel extends CardImpl { this.subtype.add(SubType.CAVE); // Sunken Citadel enters the battlefield tapped. As it enters, choose a color. - this.addAbility(new SunkenCitadelEntersBattlefieldAbility()); + this.addAbility(new EntersBattlefieldTappedAsItEntersChooseColorAbility()); // {T}: Add one mana of the chosen color. this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaChosenColorEffect(), new TapSourceCost())); @@ -55,40 +50,6 @@ public final class SunkenCitadel extends CardImpl { } } -class SunkenCitadelEntersBattlefieldAbility extends StaticAbility { - - public SunkenCitadelEntersBattlefieldAbility() { - super(Zone.ALL, new EntersBattlefieldEffect(new TapSourceEffect(true))); - this.addEffect(new ChooseColorEffect(Outcome.Benefit)); - } - - private SunkenCitadelEntersBattlefieldAbility(final SunkenCitadelEntersBattlefieldAbility ability) { - super(ability); - } - - @Override - public SunkenCitadelEntersBattlefieldAbility copy() { - return new SunkenCitadelEntersBattlefieldAbility(this); - } - - @Override - public void addEffect(Effect effect) { - if (!getEffects().isEmpty()) { - Effect entersEffect = this.getEffects().get(0); - if (entersEffect instanceof EntersBattlefieldEffect) { - ((EntersBattlefieldEffect) entersEffect).addEffect(effect); - return; - } - } - super.addEffect(effect); - } - - @Override - public String getRule() { - return "{this} enters the battlefield tapped. As it enters, choose a color."; - } -} - class SunkenCitadelManaBuilder extends ConditionalManaBuilder { @Override diff --git a/Mage.Sets/src/mage/cards/t/TarnationVista.java b/Mage.Sets/src/mage/cards/t/TarnationVista.java new file mode 100644 index 00000000000..7daf835d493 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TarnationVista.java @@ -0,0 +1,112 @@ +package mage.cards.t; + +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTappedAsItEntersChooseColorAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.mana.AddManaChosenColorEffect; +import mage.abilities.effects.mana.ManaEffect; +import mage.abilities.mana.ActivatedManaAbilityImpl; +import mage.abilities.mana.SimpleManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class TarnationVista extends CardImpl { + + public TarnationVista(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + // Tarnation Vista enters the battlefield tapped. As it enters, choose a color. + this.addAbility(new EntersBattlefieldTappedAsItEntersChooseColorAbility()); + + // {T}: Add one mana of the chosen color. + this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaChosenColorEffect(), new TapSourceCost())); + + // {1}, {T}: For each color among monocolored permanents you control, add one mana of that color. + this.addAbility(new TarnationVistaManaAbility()); + } + + private TarnationVista(final TarnationVista card) { + super(card); + } + + @Override + public TarnationVista copy() { + return new TarnationVista(this); + } +} + +class TarnationVistaManaAbility extends ActivatedManaAbilityImpl { + + TarnationVistaManaAbility() { + super(Zone.BATTLEFIELD, new TarnationVistaEffect(), new GenericManaCost(1)); + this.addCost(new TapSourceCost()); + } + + private TarnationVistaManaAbility(final TarnationVistaManaAbility ability) { + super(ability); + } + + @Override + public TarnationVistaManaAbility copy() { + return new TarnationVistaManaAbility(this); + } + +} + +// Inspired by Bloom Tender +class TarnationVistaEffect extends ManaEffect { + + TarnationVistaEffect() { + super(); + staticText = "For each color among permanents you control, add one mana of that color"; + } + + private TarnationVistaEffect(final TarnationVistaEffect effect) { + super(effect); + } + + @Override + public TarnationVistaEffect copy() { + return new TarnationVistaEffect(this); + } + + @Override + public Mana produceMana(Game game, Ability source) { + Mana mana = new Mana(); + if (game == null) { + return mana; + } + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(source.getControllerId())) { + if (permanent.getColor(game).getColorCount() != 1) { + continue; + } + if (mana.getBlack() == 0 && permanent.getColor(game).isBlack()) { + mana.increaseBlack(); + } + if (mana.getBlue() == 0 && permanent.getColor(game).isBlue()) { + mana.increaseBlue(); + } + if (mana.getRed() == 0 && permanent.getColor(game).isRed()) { + mana.increaseRed(); + } + if (mana.getGreen() == 0 && permanent.getColor(game).isGreen()) { + mana.increaseGreen(); + } + if (mana.getWhite() == 0 && permanent.getColor(game).isWhite()) { + mana.increaseWhite(); + } + } + return mana; + } +} diff --git a/Mage.Sets/src/mage/sets/TheBigScore.java b/Mage.Sets/src/mage/sets/TheBigScore.java index 10a8d6bfe47..2d266cda3ef 100644 --- a/Mage.Sets/src/mage/sets/TheBigScore.java +++ b/Mage.Sets/src/mage/sets/TheBigScore.java @@ -42,6 +42,7 @@ public final class TheBigScore extends ExpansionSet { cards.add(new SetCardInfo("Rest in Peace", 4, Rarity.MYTHIC, mage.cards.r.RestInPeace.class)); cards.add(new SetCardInfo("Simulacrum Synthesizer", 6, Rarity.MYTHIC, mage.cards.s.SimulacrumSynthesizer.class)); cards.add(new SetCardInfo("Sword of Wealth and Power", 26, Rarity.MYTHIC, mage.cards.s.SwordOfWealthAndPower.class)); + cards.add(new SetCardInfo("Tarnation Vista", 30, Rarity.MYTHIC, mage.cards.t.TarnationVista.class)); cards.add(new SetCardInfo("Torpor Orb", 27, Rarity.MYTHIC, mage.cards.t.TorporOrb.class)); cards.add(new SetCardInfo("Transmutation Font", 28, Rarity.MYTHIC, mage.cards.t.TransmutationFont.class)); cards.add(new SetCardInfo("Vaultborn Tyrant", 20, Rarity.MYTHIC, mage.cards.v.VaultbornTyrant.class)); diff --git a/Mage/src/main/java/mage/abilities/common/EntersBattlefieldTappedAsItEntersChooseColorAbility.java b/Mage/src/main/java/mage/abilities/common/EntersBattlefieldTappedAsItEntersChooseColorAbility.java new file mode 100644 index 00000000000..0b74ebd385d --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/EntersBattlefieldTappedAsItEntersChooseColorAbility.java @@ -0,0 +1,47 @@ + +package mage.abilities.common; + +import mage.abilities.StaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.EntersBattlefieldEffect; +import mage.abilities.effects.common.ChooseColorEffect; +import mage.abilities.effects.common.TapSourceEffect; +import mage.constants.Outcome; +import mage.constants.Zone; + +/** + * @author Susucr + */ +public class EntersBattlefieldTappedAsItEntersChooseColorAbility extends StaticAbility { + + public EntersBattlefieldTappedAsItEntersChooseColorAbility() { + super(Zone.ALL, new EntersBattlefieldEffect(new TapSourceEffect(true))); + this.addEffect(new ChooseColorEffect(Outcome.Benefit)); + } + + private EntersBattlefieldTappedAsItEntersChooseColorAbility(final EntersBattlefieldTappedAsItEntersChooseColorAbility ability) { + super(ability); + } + + @Override + public EntersBattlefieldTappedAsItEntersChooseColorAbility copy() { + return new EntersBattlefieldTappedAsItEntersChooseColorAbility(this); + } + + @Override + public void addEffect(Effect effect) { + if (!getEffects().isEmpty()) { + Effect entersEffect = this.getEffects().get(0); + if (entersEffect instanceof EntersBattlefieldEffect) { + ((EntersBattlefieldEffect) entersEffect).addEffect(effect); + return; + } + } + super.addEffect(effect); + } + + @Override + public String getRule() { + return "{this} enters the battlefield tapped. As it enters, choose a color."; + } +} \ No newline at end of file