diff --git a/Mage.Sets/src/mage/cards/c/CactusPreserve.java b/Mage.Sets/src/mage/cards/c/CactusPreserve.java new file mode 100644 index 00000000000..78feffa7e38 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CactusPreserve.java @@ -0,0 +1,78 @@ +package mage.cards.c; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTappedAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.CommanderGreatestManaValue; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; +import mage.abilities.keyword.ReachAbility; +import mage.abilities.mana.AnyColorLandsProduceManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.game.Game; +import mage.game.permanent.token.custom.CreatureToken; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class CactusPreserve extends CardImpl { + + public CactusPreserve(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + this.subtype.add(SubType.DESERT); + + // Cactus Preserve enters the battlefield tapped. + this.addAbility(new EntersBattlefieldTappedAbility()); + + // {T}: Add one mana of any type that a land you control could produce. + this.addAbility(new AnyColorLandsProduceManaAbility(TargetController.YOU, false)); + + // {3}: Until end of turn, Cactus Preserve becomes an X/X green Plant creature with reach, where X is the greatest mana value among your commanders. It's still a land. + this.addAbility(new SimpleActivatedAbility(new CactusPreserveEffect(), new ManaCostsImpl<>("{3}"))); + } + + private CactusPreserve(final CactusPreserve card) { + super(card); + } + + @Override + public CactusPreserve copy() { + return new CactusPreserve(this); + } +} + +class CactusPreserveEffect extends OneShotEffect { + + CactusPreserveEffect() { + super(Outcome.BecomeCreature); + this.staticText = "{this} becomes an X/X green Plant creature with reach, where X is the greatest mana value among your commanders. It's still a land."; + } + + private CactusPreserveEffect(final CactusPreserveEffect effect) { + super(effect); + } + + @Override + public CactusPreserveEffect copy() { + return new CactusPreserveEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + int xValue = CommanderGreatestManaValue.instance.calculate(game, source, this); + game.addEffect(new BecomesCreatureSourceEffect( + new CreatureToken(xValue, xValue, + "X/X green Plant creature with reach, where X is the greatest mana value among your commanders") + .withColor("G").withSubType(SubType.PLANT) + .withAbility(ReachAbility.getInstance()), + CardType.LAND, Duration.EndOfTurn), source + ); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/t/TangleweaveArmor.java b/Mage.Sets/src/mage/cards/t/TangleweaveArmor.java index b8676df6e2d..d3a494c7ebb 100644 --- a/Mage.Sets/src/mage/cards/t/TangleweaveArmor.java +++ b/Mage.Sets/src/mage/cards/t/TangleweaveArmor.java @@ -1,18 +1,17 @@ package mage.cards.t; -import mage.MageObject; -import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.effects.Effect; +import mage.abilities.dynamicvalue.common.CommanderGreatestManaValue; import mage.abilities.effects.common.continuous.BoostEquippedEffect; import mage.abilities.keyword.EquipAbility; import mage.abilities.keyword.LivingWeaponAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; -import mage.game.Game; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.Zone; import java.util.UUID; @@ -30,7 +29,7 @@ public final class TangleweaveArmor extends CardImpl { // Equipped creature gets +X/+X, where X is the greatest mana value among your commanders this.addAbility(new SimpleStaticAbility( - Zone.BATTLEFIELD, new BoostEquippedEffect(TangleweaveArmorDynamicValue.instance, TangleweaveArmorDynamicValue.instance) + Zone.BATTLEFIELD, new BoostEquippedEffect(CommanderGreatestManaValue.instance, CommanderGreatestManaValue.instance) )); // Equip {4} @@ -46,32 +45,3 @@ public final class TangleweaveArmor extends CardImpl { return new TangleweaveArmor(this); } } - -enum TangleweaveArmorDynamicValue implements DynamicValue { - instance; - - @Override - public int calculate(Game game, Ability sourceAbility, Effect effect) { - return game.getCommanderCardsFromAnyZones( - game.getPlayer(sourceAbility.getControllerId()), CommanderCardType.ANY, Zone.ALL) - .stream() - .mapToInt(MageObject::getManaValue) - .max() - .orElse(0); - } - - @Override - public TangleweaveArmorDynamicValue copy() { - return this; - } - - @Override - public String toString() { - return "X"; - } - - @Override - public String getMessage() { - return "the greatest mana value among your commanders"; - } -} diff --git a/Mage.Sets/src/mage/sets/OutlawsOfThunderJunctionCommander.java b/Mage.Sets/src/mage/sets/OutlawsOfThunderJunctionCommander.java index f94883395f8..920adff46d0 100644 --- a/Mage.Sets/src/mage/sets/OutlawsOfThunderJunctionCommander.java +++ b/Mage.Sets/src/mage/sets/OutlawsOfThunderJunctionCommander.java @@ -47,6 +47,7 @@ public final class OutlawsOfThunderJunctionCommander extends ExpansionSet { cards.add(new SetCardInfo("Boros Charm", 216, Rarity.UNCOMMON, mage.cards.b.BorosCharm.class)); cards.add(new SetCardInfo("Brainstealer Dragon", 127, Rarity.RARE, mage.cards.b.BrainstealerDragon.class)); cards.add(new SetCardInfo("Breena, the Demagogue", 217, Rarity.MYTHIC, mage.cards.b.BreenaTheDemagogue.class)); + cards.add(new SetCardInfo("Cactus Preserve", 40, Rarity.RARE, mage.cards.c.CactusPreserve.class)); cards.add(new SetCardInfo("Canyon Slough", 275, Rarity.RARE, mage.cards.c.CanyonSlough.class)); cards.add(new SetCardInfo("Captain Lannery Storm", 158, Rarity.RARE, mage.cards.c.CaptainLanneryStorm.class)); cards.add(new SetCardInfo("Captivating Crew", 159, Rarity.RARE, mage.cards.c.CaptivatingCrew.class)); diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/CommanderGreatestManaValue.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/CommanderGreatestManaValue.java new file mode 100644 index 00000000000..b1a6f6dfbfc --- /dev/null +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/CommanderGreatestManaValue.java @@ -0,0 +1,41 @@ +package mage.abilities.dynamicvalue.common; + +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.constants.CommanderCardType; +import mage.constants.Zone; +import mage.game.Game; + +/** + * @author PurpleCrowbar + */ +public enum CommanderGreatestManaValue implements DynamicValue { + instance; + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + return game.getCommanderCardsFromAnyZones( + game.getPlayer(sourceAbility.getControllerId()), CommanderCardType.ANY, Zone.ALL) + .stream() + .mapToInt(MageObject::getManaValue) + .max() + .orElse(0); + } + + @Override + public CommanderGreatestManaValue copy() { + return this; + } + + @Override + public String toString() { + return "X"; + } + + @Override + public String getMessage() { + return "the greatest mana value among your commanders"; + } +}