From 23ed717c8ca553a2f03401da74e13ab06f03ace6 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Sat, 4 Jun 2022 09:57:47 -0400 Subject: [PATCH] [CLB] Implemented Majestic Genesis --- Mage.Sets/src/mage/cards/c/Cloudkill.java | 49 ++--------- .../src/mage/cards/m/MajesticGenesis.java | 81 +++++++++++++++++++ .../src/mage/cards/v/VisionsOfDominance.java | 4 +- .../src/mage/cards/v/VisionsOfDread.java | 4 +- .../src/mage/cards/v/VisionsOfDuplicity.java | 4 +- .../src/mage/cards/v/VisionsOfGlory.java | 4 +- Mage.Sets/src/mage/cards/v/VisionsOfRuin.java | 4 +- .../CommanderLegendsBattleForBaldursGate.java | 1 + .../CommanderManaValueAdjuster.java | 20 +---- .../common/GreatestCommanderManaValue.java | 54 +++++++++++++ 10 files changed, 159 insertions(+), 66 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/m/MajesticGenesis.java create mode 100644 Mage/src/main/java/mage/abilities/dynamicvalue/common/GreatestCommanderManaValue.java diff --git a/Mage.Sets/src/mage/cards/c/Cloudkill.java b/Mage.Sets/src/mage/cards/c/Cloudkill.java index 43789b1d472..5d6c5187cc5 100644 --- a/Mage.Sets/src/mage/cards/c/Cloudkill.java +++ b/Mage.Sets/src/mage/cards/c/Cloudkill.java @@ -1,18 +1,13 @@ package mage.cards.c; -import mage.MageObject; -import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.effects.Effect; +import mage.abilities.dynamicvalue.common.GreatestCommanderManaValue; +import mage.abilities.dynamicvalue.common.SignInversionDynamicValue; import mage.abilities.effects.common.continuous.BoostAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.CommanderCardType; import mage.constants.Duration; -import mage.constants.Zone; -import mage.game.Game; -import mage.players.Player; import java.util.UUID; @@ -21,13 +16,14 @@ import java.util.UUID; */ public final class Cloudkill extends CardImpl { + private static final DynamicValue xValue = new SignInversionDynamicValue(GreatestCommanderManaValue.instance); + public Cloudkill(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{B}{B}"); // All creatures gets -X/-X until end of turn, where X is the greatest mana value of a commander you own on the battlefield or in the command zone. - this.getSpellAbility().addEffect(new BoostAllEffect( - CloudkillValue.instance, CloudkillValue.instance, Duration.EndOfTurn - )); + this.getSpellAbility().addEffect(new BoostAllEffect(xValue, xValue, Duration.EndOfTurn)); + this.getSpellAbility().addHint(GreatestCommanderManaValue.getHint()); } private Cloudkill(final Cloudkill card) { @@ -39,36 +35,3 @@ public final class Cloudkill extends CardImpl { return new Cloudkill(this); } } - -enum CloudkillValue implements DynamicValue { - instance; - - @Override - public int calculate(Game game, Ability sourceAbility, Effect effect) { - Player player = game.getPlayer(sourceAbility.getControllerId()); - return player != null ? -game - .getCommanderCardsFromAnyZones( - player, CommanderCardType.ANY, - Zone.BATTLEFIELD, Zone.COMMAND - ) - .stream() - .mapToInt(MageObject::getManaValue) - .max() - .orElse(0) : 0; - } - - @Override - public CloudkillValue copy() { - return this; - } - - @Override - public String getMessage() { - return "the greatest mana value of a commander you own on the battlefield or in the command zone"; - } - - @Override - public String toString() { - return "-X"; - } -} diff --git a/Mage.Sets/src/mage/cards/m/MajesticGenesis.java b/Mage.Sets/src/mage/cards/m/MajesticGenesis.java new file mode 100644 index 00000000000..196fdecd19c --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MajesticGenesis.java @@ -0,0 +1,81 @@ +package mage.cards.m; + +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.common.GreatestCommanderManaValue; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetCard; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class MajesticGenesis extends CardImpl { + + public MajesticGenesis(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{6}{G}{G}"); + + // Reveal the top X cards of your library, where X is the highest mana value of a commander you own on the battlefield or in the command zone. You may put any number of a permanent cards from among them onto the battlefield. Put the rest on the bottom of your library in a random order. + this.getSpellAbility().addEffect(new MajesticGenesisEffect()); + this.getSpellAbility().addHint(GreatestCommanderManaValue.getHint()); + } + + private MajesticGenesis(final MajesticGenesis card) { + super(card); + } + + @Override + public MajesticGenesis copy() { + return new MajesticGenesis(this); + } +} + +class MajesticGenesisEffect extends OneShotEffect { + + MajesticGenesisEffect() { + super(Outcome.Benefit); + staticText = "reveal the top X cards of your library, where X is the highest mana value of a commander " + + "you own on the battlefield or in the command zone. You may put any number of a permanent cards " + + "from among them onto the battlefield. Put the rest on the bottom of your library in a random order"; + } + + private MajesticGenesisEffect(final MajesticGenesisEffect effect) { + super(effect); + } + + @Override + public MajesticGenesisEffect copy() { + return new MajesticGenesisEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + int xValue = GreatestCommanderManaValue.instance.calculate(game, source, this); + if (player == null || xValue < 1) { + return false; + } + Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, xValue)); + player.revealCards(source, cards, game); + TargetCard target = new TargetCardInLibrary( + 0, Integer.MAX_VALUE, + StaticFilters.FILTER_CARD_PERMANENT + ); + player.choose(outcome, cards, target, game); + player.moveCards(new CardsImpl(target.getTargets()), Zone.BATTLEFIELD, source, game); + cards.retainZone(Zone.LIBRARY, game); + player.putCardsOnBottomOfLibrary(cards, game, source, false); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/v/VisionsOfDominance.java b/Mage.Sets/src/mage/cards/v/VisionsOfDominance.java index 4489ab56ed8..9f260848d61 100644 --- a/Mage.Sets/src/mage/cards/v/VisionsOfDominance.java +++ b/Mage.Sets/src/mage/cards/v/VisionsOfDominance.java @@ -3,6 +3,7 @@ package mage.cards.v; import mage.abilities.Ability; import mage.abilities.costs.costadjusters.CommanderManaValueAdjuster; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.GreatestCommanderManaValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.FlashbackAbility; import mage.cards.CardImpl; @@ -32,7 +33,8 @@ public final class VisionsOfDominance extends CardImpl { this.addAbility(new FlashbackAbility(this, new ManaCostsImpl<>("{8}{G}{G}")) .setAbilityName("This spell costs {X} less to cast this way, where X is the greatest mana value " + "of a commander you own on the battlefield or in the command zone.") - .setCostAdjuster(CommanderManaValueAdjuster.instance)); + .setCostAdjuster(CommanderManaValueAdjuster.instance) + .addHint(GreatestCommanderManaValue.getHint())); } private VisionsOfDominance(final VisionsOfDominance card) { diff --git a/Mage.Sets/src/mage/cards/v/VisionsOfDread.java b/Mage.Sets/src/mage/cards/v/VisionsOfDread.java index becee61ec98..08f27be5072 100644 --- a/Mage.Sets/src/mage/cards/v/VisionsOfDread.java +++ b/Mage.Sets/src/mage/cards/v/VisionsOfDread.java @@ -3,6 +3,7 @@ package mage.cards.v; import mage.abilities.Ability; import mage.abilities.costs.costadjusters.CommanderManaValueAdjuster; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.GreatestCommanderManaValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.FlashbackAbility; import mage.cards.CardImpl; @@ -34,7 +35,8 @@ public final class VisionsOfDread extends CardImpl { this.addAbility(new FlashbackAbility(this, new ManaCostsImpl<>("{8}{B}{B}")) .setAbilityName("This spell costs {X} less to cast this way, where X is the greatest mana value " + "of a commander you own on the battlefield or in the command zone.") - .setCostAdjuster(CommanderManaValueAdjuster.instance)); + .setCostAdjuster(CommanderManaValueAdjuster.instance) + .addHint(GreatestCommanderManaValue.getHint())); } private VisionsOfDread(final VisionsOfDread card) { diff --git a/Mage.Sets/src/mage/cards/v/VisionsOfDuplicity.java b/Mage.Sets/src/mage/cards/v/VisionsOfDuplicity.java index 5e9a9ac27fb..b8762a691fe 100644 --- a/Mage.Sets/src/mage/cards/v/VisionsOfDuplicity.java +++ b/Mage.Sets/src/mage/cards/v/VisionsOfDuplicity.java @@ -2,6 +2,7 @@ package mage.cards.v; import mage.abilities.costs.costadjusters.CommanderManaValueAdjuster; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.GreatestCommanderManaValue; import mage.abilities.effects.common.continuous.ExchangeControlTargetEffect; import mage.abilities.keyword.FlashbackAbility; import mage.cards.CardImpl; @@ -33,7 +34,8 @@ public final class VisionsOfDuplicity extends CardImpl { this.addAbility(new FlashbackAbility(this, new ManaCostsImpl<>("{8}{U}{U}")) .setAbilityName("This spell costs {X} less to cast this way, where X is the greatest mana value " + "of a commander you own on the battlefield or in the command zone.") - .setCostAdjuster(CommanderManaValueAdjuster.instance)); + .setCostAdjuster(CommanderManaValueAdjuster.instance) + .addHint(GreatestCommanderManaValue.getHint())); } private VisionsOfDuplicity(final VisionsOfDuplicity card) { diff --git a/Mage.Sets/src/mage/cards/v/VisionsOfGlory.java b/Mage.Sets/src/mage/cards/v/VisionsOfGlory.java index 5115f463d53..e21ee13a8dd 100644 --- a/Mage.Sets/src/mage/cards/v/VisionsOfGlory.java +++ b/Mage.Sets/src/mage/cards/v/VisionsOfGlory.java @@ -3,6 +3,7 @@ package mage.cards.v; import mage.abilities.costs.costadjusters.CommanderManaValueAdjuster; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.common.CreaturesYouControlCount; +import mage.abilities.dynamicvalue.common.GreatestCommanderManaValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.keyword.FlashbackAbility; import mage.cards.CardImpl; @@ -29,7 +30,8 @@ public final class VisionsOfGlory extends CardImpl { this.addAbility(new FlashbackAbility(this, new ManaCostsImpl<>("{8}{W}{W}")) .setAbilityName("This spell costs {X} less to cast this way, where X is the greatest mana value " + "of a commander you own on the battlefield or in the command zone.") - .setCostAdjuster(CommanderManaValueAdjuster.instance)); + .setCostAdjuster(CommanderManaValueAdjuster.instance) + .addHint(GreatestCommanderManaValue.getHint())); } private VisionsOfGlory(final VisionsOfGlory card) { diff --git a/Mage.Sets/src/mage/cards/v/VisionsOfRuin.java b/Mage.Sets/src/mage/cards/v/VisionsOfRuin.java index a3b9d021c43..f110cb2e886 100644 --- a/Mage.Sets/src/mage/cards/v/VisionsOfRuin.java +++ b/Mage.Sets/src/mage/cards/v/VisionsOfRuin.java @@ -3,6 +3,7 @@ package mage.cards.v; import mage.abilities.Ability; import mage.abilities.costs.costadjusters.CommanderManaValueAdjuster; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.GreatestCommanderManaValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.FlashbackAbility; import mage.cards.CardImpl; @@ -35,7 +36,8 @@ public final class VisionsOfRuin extends CardImpl { this.addAbility(new FlashbackAbility(this, new ManaCostsImpl<>("{8}{R}{R}")) .setAbilityName("This spell costs {X} less to cast this way, where X is the greatest mana value " + "of a commander you own on the battlefield or in the command zone.") - .setCostAdjuster(CommanderManaValueAdjuster.instance)); + .setCostAdjuster(CommanderManaValueAdjuster.instance) + .addHint(GreatestCommanderManaValue.getHint())); } private VisionsOfRuin(final VisionsOfRuin card) { diff --git a/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java b/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java index a585419a403..95e1222602a 100644 --- a/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java +++ b/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java @@ -336,6 +336,7 @@ public final class CommanderLegendsBattleForBaldursGate extends ExpansionSet { cards.add(new SetCardInfo("Mage's Attendant", 698, Rarity.UNCOMMON, mage.cards.m.MagesAttendant.class)); cards.add(new SetCardInfo("Magus of the Balance", 699, Rarity.RARE, mage.cards.m.MagusOfTheBalance.class)); cards.add(new SetCardInfo("Mahadi, Emporium Master", 282, Rarity.UNCOMMON, mage.cards.m.MahadiEmporiumMaster.class)); + cards.add(new SetCardInfo("Majestic Genesis", 240, Rarity.MYTHIC, mage.cards.m.MajesticGenesis.class)); cards.add(new SetCardInfo("Malakir Blood-Priest", 760, Rarity.COMMON, mage.cards.m.MalakirBloodPriest.class)); cards.add(new SetCardInfo("Managorger Hydra", 828, Rarity.RARE, mage.cards.m.ManagorgerHydra.class)); cards.add(new SetCardInfo("Manifold Key", 319, Rarity.UNCOMMON, mage.cards.m.ManifoldKey.class)); diff --git a/Mage/src/main/java/mage/abilities/costs/costadjusters/CommanderManaValueAdjuster.java b/Mage/src/main/java/mage/abilities/costs/costadjusters/CommanderManaValueAdjuster.java index df1c58ca0ad..cd018459433 100644 --- a/Mage/src/main/java/mage/abilities/costs/costadjusters/CommanderManaValueAdjuster.java +++ b/Mage/src/main/java/mage/abilities/costs/costadjusters/CommanderManaValueAdjuster.java @@ -1,12 +1,9 @@ package mage.abilities.costs.costadjusters; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.costs.CostAdjuster; -import mage.constants.CommanderCardType; -import mage.constants.Zone; +import mage.abilities.dynamicvalue.common.GreatestCommanderManaValue; import mage.game.Game; -import mage.players.Player; import mage.util.CardUtil; /** @@ -17,19 +14,6 @@ public enum CommanderManaValueAdjuster implements CostAdjuster { @Override public void adjustCosts(Ability ability, Game game) { - Player player = game.getPlayer(ability.getControllerId()); - if (player == null) { - return; - } - int maxValue = game - .getCommanderCardsFromAnyZones( - player, CommanderCardType.ANY, - Zone.BATTLEFIELD, Zone.COMMAND - ) - .stream() - .mapToInt(MageObject::getManaValue) - .max() - .orElse(0); - CardUtil.reduceCost(ability, maxValue); + CardUtil.reduceCost(ability, GreatestCommanderManaValue.instance.calculate(game, ability, null)); } } diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/GreatestCommanderManaValue.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/GreatestCommanderManaValue.java new file mode 100644 index 00000000000..a3acdd64c47 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/GreatestCommanderManaValue.java @@ -0,0 +1,54 @@ +package mage.abilities.dynamicvalue.common; + +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.abilities.hint.Hint; +import mage.abilities.hint.ValueHint; +import mage.constants.CommanderCardType; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; + +/** + * @author TheElk801 + */ +public enum GreatestCommanderManaValue implements DynamicValue { + instance; + + private static final Hint hint = new ValueHint("Greatest mana value of a commander you own", instance); + + public static Hint getHint() { + return hint; + } + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + Player player = game.getPlayer(sourceAbility.getControllerId()); + return player != null ? game + .getCommanderCardsFromAnyZones( + player, CommanderCardType.ANY, + Zone.BATTLEFIELD, Zone.COMMAND + ) + .stream() + .mapToInt(MageObject::getManaValue) + .max() + .orElse(0) : 0; + } + + @Override + public GreatestCommanderManaValue copy() { + return this; + } + + @Override + public String getMessage() { + return "the greatest mana value of a commander you own on the battlefield or in the command zone"; + } + + @Override + public String toString() { + return "X"; + } +}