From 645779376fee846f9026e0d14265622759eb0477 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 16 Sep 2021 09:34:22 -0400 Subject: [PATCH] [MIC] Implemented Visions of Glory --- Mage.Sets/src/mage/cards/s/StingingStudy.java | 2 +- .../src/mage/cards/v/VisionsOfGlory.java | 43 +++++++++++++++++++ .../src/mage/sets/MidnightHuntCommander.java | 1 + .../src/main/java/mage/abilities/Ability.java | 2 +- .../main/java/mage/abilities/AbilityImpl.java | 3 +- .../CommanderManaValueAdjuster.java | 35 +++++++++++++++ .../abilities/keyword/FlashbackAbility.java | 3 +- .../java/mage/game/stack/StackAbility.java | 3 +- 8 files changed, 87 insertions(+), 5 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/v/VisionsOfGlory.java create mode 100644 Mage/src/main/java/mage/abilities/costs/costadjusters/CommanderManaValueAdjuster.java diff --git a/Mage.Sets/src/mage/cards/s/StingingStudy.java b/Mage.Sets/src/mage/cards/s/StingingStudy.java index ccee4735dec..f70ead86aee 100644 --- a/Mage.Sets/src/mage/cards/s/StingingStudy.java +++ b/Mage.Sets/src/mage/cards/s/StingingStudy.java @@ -68,7 +68,7 @@ class StingingStudyEffect extends OneShotEffect { for (Card commander : game.getCommanderCardsFromAnyZones(player, CommanderCardType.ANY, Zone.BATTLEFIELD, Zone.COMMAND)) { manaValues.add(commander.getManaValue()); } - int chosenValue = 0; + int chosenValue; if (manaValues.size() > 1) { Choice choice = new ChoiceImpl(true); choice.setChoices(manaValues.stream().map(x -> "" + x).collect(Collectors.toSet())); diff --git a/Mage.Sets/src/mage/cards/v/VisionsOfGlory.java b/Mage.Sets/src/mage/cards/v/VisionsOfGlory.java new file mode 100644 index 00000000000..5115f463d53 --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VisionsOfGlory.java @@ -0,0 +1,43 @@ +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.effects.common.CreateTokenEffect; +import mage.abilities.keyword.FlashbackAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.game.permanent.token.HumanToken; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class VisionsOfGlory extends CardImpl { + + public VisionsOfGlory(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{W}"); + + // Create a 1/1 white Human creature token for each creature you control. + this.getSpellAbility().addEffect(new CreateTokenEffect( + new HumanToken(), CreaturesYouControlCount.instance + ).setText("create a 1/1 white Human creature token for each creature you control")); + + // Flashback {8}{W}{W}. 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. + 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)); + } + + private VisionsOfGlory(final VisionsOfGlory card) { + super(card); + } + + @Override + public VisionsOfGlory copy() { + return new VisionsOfGlory(this); + } +} diff --git a/Mage.Sets/src/mage/sets/MidnightHuntCommander.java b/Mage.Sets/src/mage/sets/MidnightHuntCommander.java index 31c501a21b7..9c95ebee01b 100644 --- a/Mage.Sets/src/mage/sets/MidnightHuntCommander.java +++ b/Mage.Sets/src/mage/sets/MidnightHuntCommander.java @@ -137,6 +137,7 @@ public final class MidnightHuntCommander extends ExpansionSet { cards.add(new SetCardInfo("Undead Augur", 130, Rarity.UNCOMMON, mage.cards.u.UndeadAugur.class)); cards.add(new SetCardInfo("Verdurous Gearhulk", 145, Rarity.MYTHIC, mage.cards.v.VerdurousGearhulk.class)); cards.add(new SetCardInfo("Victory's Envoy", 96, Rarity.RARE, mage.cards.v.VictorysEnvoy.class)); + cards.add(new SetCardInfo("Visions of Glory", 32, Rarity.RARE, mage.cards.v.VisionsOfGlory.class)); cards.add(new SetCardInfo("Wild Beastmaster", 146, Rarity.RARE, mage.cards.w.WildBeastmaster.class)); cards.add(new SetCardInfo("Wilhelt, the Rotcleaver", 2, Rarity.MYTHIC, mage.cards.w.WilheltTheRotcleaver.class)); cards.add(new SetCardInfo("Yavimaya Elder", 147, Rarity.COMMON, mage.cards.y.YavimayaElder.class)); diff --git a/Mage/src/main/java/mage/abilities/Ability.java b/Mage/src/main/java/mage/abilities/Ability.java index 1af6b5e8f81..63cb477b0c7 100644 --- a/Mage/src/main/java/mage/abilities/Ability.java +++ b/Mage/src/main/java/mage/abilities/Ability.java @@ -543,7 +543,7 @@ public interface Ability extends Controllable, Serializable { void adjustTargets(Game game); - void setCostAdjuster(CostAdjuster costAdjuster); + Ability setCostAdjuster(CostAdjuster costAdjuster); CostAdjuster getCostAdjuster(); diff --git a/Mage/src/main/java/mage/abilities/AbilityImpl.java b/Mage/src/main/java/mage/abilities/AbilityImpl.java index dceaba8b20a..5b07c7502e5 100644 --- a/Mage/src/main/java/mage/abilities/AbilityImpl.java +++ b/Mage/src/main/java/mage/abilities/AbilityImpl.java @@ -1323,8 +1323,9 @@ public abstract class AbilityImpl implements Ability { * @param costAdjuster */ @Override - public void setCostAdjuster(CostAdjuster costAdjuster) { + public AbilityImpl setCostAdjuster(CostAdjuster costAdjuster) { this.costAdjuster = costAdjuster; + return this; } @Override diff --git a/Mage/src/main/java/mage/abilities/costs/costadjusters/CommanderManaValueAdjuster.java b/Mage/src/main/java/mage/abilities/costs/costadjusters/CommanderManaValueAdjuster.java new file mode 100644 index 00000000000..df1c58ca0ad --- /dev/null +++ b/Mage/src/main/java/mage/abilities/costs/costadjusters/CommanderManaValueAdjuster.java @@ -0,0 +1,35 @@ +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.game.Game; +import mage.players.Player; +import mage.util.CardUtil; + +/** + * @author TheElk801 + */ +public enum CommanderManaValueAdjuster implements CostAdjuster { + instance; + + @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); + } +} diff --git a/Mage/src/main/java/mage/abilities/keyword/FlashbackAbility.java b/Mage/src/main/java/mage/abilities/keyword/FlashbackAbility.java index 6347b1ef2dc..22ca67bc198 100644 --- a/Mage/src/main/java/mage/abilities/keyword/FlashbackAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/FlashbackAbility.java @@ -177,8 +177,9 @@ public class FlashbackAbility extends SpellAbility { * * @param abilityName */ - public void setAbilityName(String abilityName) { + public FlashbackAbility setAbilityName(String abilityName) { this.abilityName = abilityName; + return this; } } diff --git a/Mage/src/main/java/mage/game/stack/StackAbility.java b/Mage/src/main/java/mage/game/stack/StackAbility.java index 98df1330603..e9493bcb317 100644 --- a/Mage/src/main/java/mage/game/stack/StackAbility.java +++ b/Mage/src/main/java/mage/game/stack/StackAbility.java @@ -664,8 +664,9 @@ public class StackAbility extends StackObjectImpl implements Ability { } @Override - public void setCostAdjuster(CostAdjuster costAdjuster) { + public StackAbility setCostAdjuster(CostAdjuster costAdjuster) { this.costAdjuster = costAdjuster; + return this; } @Override