From 10a2041115e1030bca60f8183ffd7460d8bd6dc0 Mon Sep 17 00:00:00 2001 From: Jeff Date: Fri, 8 Feb 2019 12:24:03 -0600 Subject: [PATCH] - Added Benthic Explorers and Awesome Presence. --- .../src/mage/cards/a/AwesomePresence.java | 96 +++++++ .../src/mage/cards/b/BenthicExplorers.java | 262 ++++++++++++++++++ Mage.Sets/src/mage/sets/Alliances.java | 4 + 3 files changed, 362 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/a/AwesomePresence.java create mode 100644 Mage.Sets/src/mage/cards/b/BenthicExplorers.java diff --git a/Mage.Sets/src/mage/cards/a/AwesomePresence.java b/Mage.Sets/src/mage/cards/a/AwesomePresence.java new file mode 100644 index 0000000000..604d293a3c --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AwesomePresence.java @@ -0,0 +1,96 @@ +package mage.cards.a; + +import java.util.UUID; +import mage.constants.SubType; +import mage.target.common.TargetCreaturePermanent; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCosts; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.PayCostToAttackBlockEffectImpl; +import mage.abilities.effects.PayCostToAttackBlockEffectImpl.RestrictType; +import mage.abilities.effects.common.AttachEffect; +import mage.constants.Outcome; +import mage.target.TargetPermanent; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author jeffwadsworth + */ +public final class AwesomePresence extends CardImpl { + + public AwesomePresence(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{U}"); + + this.subtype.add(SubType.AURA); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Enchanted creature can't be blocked unless defending player pays {3} for each creature he or she controls that's blocking it. + this.addAbility(new SimpleStaticAbility(new AwesomePresenceRestrictionEffect(new ManaCostsImpl("{3}")))); + + } + + private AwesomePresence(final AwesomePresence card) { + super(card); + } + + @Override + public AwesomePresence copy() { + return new AwesomePresence(this); + } +} + +class AwesomePresenceRestrictionEffect extends PayCostToAttackBlockEffectImpl { + + public AwesomePresenceRestrictionEffect(ManaCosts manaCosts) { + super(Duration.WhileOnBattlefield, Outcome.Neutral, RestrictType.BLOCK, manaCosts); + staticText = "Enchanted creature" + + " can't be blocked " + + "unless defending player pays " + + (manaCosts == null ? "" : manaCosts.getText() + + " for each creature he or she controls that's blocking it"); + } + + public AwesomePresenceRestrictionEffect(AwesomePresenceRestrictionEffect effect) { + super(effect); + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + Permanent blockingCreature = game.getPermanent(event.getSourceId()); + Permanent enchantedAttackingCreature = game.getPermanent(event.getTargetId()); + Permanent enchantment = game.getPermanent(source.getSourceId()); + if (blockingCreature != null + && enchantedAttackingCreature != null + && enchantment.isAttachedTo(enchantedAttackingCreature.getId())) { + Player defendingPlayer = game.getPlayer(blockingCreature.getControllerId()); + if (defendingPlayer != null) { + if (manaCosts.canPay(source, source.getSourceId(), defendingPlayer.getId(), game) + && manaCosts.pay(source, game, source.getSourceId(), defendingPlayer.getId(), false)) { + return false; + } + } + } + return true; + } + + @Override + public AwesomePresenceRestrictionEffect copy() { + return new AwesomePresenceRestrictionEffect(this); + } +} diff --git a/Mage.Sets/src/mage/cards/b/BenthicExplorers.java b/Mage.Sets/src/mage/cards/b/BenthicExplorers.java new file mode 100644 index 0000000000..0760baeed8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BenthicExplorers.java @@ -0,0 +1,262 @@ +package mage.cards.b; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import mage.MageInt; +import mage.Mana; +import mage.abilities.Abilities; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.CostImpl; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.ManaEffect; +import mage.abilities.mana.ActivatedManaAbilityImpl; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.choices.Choice; +import mage.choices.ChoiceColor; +import mage.constants.CardType; +import mage.constants.ColoredManaSymbol; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.filter.predicate.permanent.TappedPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetLandPermanent; +import mage.util.CardUtil; + +/** + * + * @author jeffwadsworth + */ +public final class BenthicExplorers extends CardImpl { + + private static final FilterLandPermanent filter = new FilterLandPermanent("tapped land an opponent controls"); + + static { + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + filter.add(TappedPredicate.instance); + } + + public BenthicExplorers(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}"); + + this.subtype.add(SubType.MERFOLK); + this.subtype.add(SubType.SCOUT); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // {tap}, Untap a tapped land an opponent controls: Add one mana of any type that land could produce. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BenthicExplorersManaEffect(), new TapSourceCost()); + ability.addCost(new BenthicExplorersCost(new TargetLandPermanent(filter))); + this.addAbility(ability); + + } + + private BenthicExplorers(final BenthicExplorers card) { + super(card); + } + + @Override + public BenthicExplorers copy() { + return new BenthicExplorers(this); + } +} + +class BenthicExplorersCost extends CostImpl { + + TargetLandPermanent target; + + public BenthicExplorersCost(TargetLandPermanent target) { + this.target = target; + this.text = "Untap " + CardUtil.numberToText(target.getMaxNumberOfTargets(), "") + ' ' + target.getTargetName(); + } + + public BenthicExplorersCost(final BenthicExplorersCost cost) { + super(cost); + this.target = cost.target.copy(); + } + + @Override + public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana, Cost costToPay) { + if (target.choose(Outcome.Untap, controllerId, sourceId, game)) { + for (UUID targetId : (List) target.getTargets()) { + Permanent permanent = game.getPermanent(targetId); + if (permanent == null) { + return false; + } + paid |= permanent.untap(game); + if (paid) { + game.getState().setValue("UntapTargetCost" + ability.getSourceId().toString(), permanent); // remember the untapped permanent + } + } + } + return paid; + } + + @Override + public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) { + return target.canChoose(controllerId, game); + } + + @Override + public BenthicExplorersCost copy() { + return new BenthicExplorersCost(this); + } + +} + +class BenthicExplorersManaEffect extends ManaEffect { + + public BenthicExplorersManaEffect() { + staticText = "Add one mana of any type that land could produce"; + } + + private BenthicExplorersManaEffect(final BenthicExplorersManaEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + //List mana = getNetMana(game, source); + Mana manaToProduce = produceMana(true, game, source); + controller.getManaPool().addMana(manaToProduce, game, source); + return true; + } + return false; + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { + Mana mana = new Mana(); + Mana types = getManaTypes(game, source); + Choice choice = new ChoiceColor(true); + choice.getChoices().clear(); + choice.setMessage("Pick a mana color"); + if (types.getBlack() > 0) { + choice.getChoices().add("Black"); + } + if (types.getRed() > 0) { + choice.getChoices().add("Red"); + } + if (types.getBlue() > 0) { + choice.getChoices().add("Blue"); + } + if (types.getGreen() > 0) { + choice.getChoices().add("Green"); + } + if (types.getWhite() > 0) { + choice.getChoices().add("White"); + } + if (types.getColorless() > 0) { + choice.getChoices().add("Colorless"); + } + if (types.getAny() > 0) { + choice.getChoices().add("Black"); + choice.getChoices().add("Red"); + choice.getChoices().add("Blue"); + choice.getChoices().add("Green"); + choice.getChoices().add("White"); + choice.getChoices().add("Colorless"); + + } + if (!choice.getChoices().isEmpty()) { + Player player = game.getPlayer(source.getControllerId()); + if (choice.getChoices().size() == 1) { + choice.setChoice(choice.getChoices().iterator().next()); + } else { + if (player == null + || !player.choose(Outcome.Neutral, choice, game)) { + return null; + } + } + if (choice.getChoice() != null) { + switch (choice.getChoice()) { + case "Black": + mana.setBlack(1); + break; + case "Blue": + mana.setBlue(1); + break; + case "Red": + mana.setRed(1); + break; + case "Green": + mana.setGreen(1); + break; + case "White": + mana.setWhite(1); + break; + case "Colorless": + mana.setColorless(1); + break; + } + } + } + return mana; + } + + private Mana getManaTypes(Game game, Ability source) { + Mana types = new Mana(); + if (game == null + || game.getPhase() == null) { + return types; + } + Permanent land = (Permanent) game.getState().getValue("UntapTargetCost" + source.getSourceId().toString()); + if (land != null) { + System.out.println("The land is " + land.getName()); + Abilities mana = land.getAbilities().getActivatedManaAbilities(Zone.BATTLEFIELD); + for (ActivatedManaAbilityImpl ability : mana) { + if (ability.definesMana(game)) { + for (Mana netMana : ability.getNetMana(game)) { + types.add(netMana); + } + } + } + } + System.out.println("The types : " + types.toString()); + return types; + } + + @Override + public List getNetMana(Game game, Ability source) { + List netManas = new ArrayList<>(); + Mana types = getManaTypes(game, source); + if (types.getBlack() > 0) { + netManas.add(new Mana(ColoredManaSymbol.B)); + } + if (types.getRed() > 0) { + netManas.add(new Mana(ColoredManaSymbol.R)); + } + if (types.getBlue() > 0) { + netManas.add(new Mana(ColoredManaSymbol.U)); + } + if (types.getGreen() > 0) { + netManas.add(new Mana(ColoredManaSymbol.G)); + } + if (types.getWhite() > 0) { + netManas.add(new Mana(ColoredManaSymbol.W)); + } + if (types.getColorless() > 0) { + netManas.add(Mana.ColorlessMana(1)); + } + if (types.getAny() > 0) { + netManas.add(Mana.AnyMana(1)); + } + return netManas; + } + + @Override + public BenthicExplorersManaEffect copy() { + return new BenthicExplorersManaEffect(this); + } +} diff --git a/Mage.Sets/src/mage/sets/Alliances.java b/Mage.Sets/src/mage/sets/Alliances.java index 45deebe54c..0ff5b4fa43 100644 --- a/Mage.Sets/src/mage/sets/Alliances.java +++ b/Mage.Sets/src/mage/sets/Alliances.java @@ -33,11 +33,15 @@ public final class Alliances extends ExpansionSet { cards.add(new SetCardInfo("Ashnod's Cylix", 117, Rarity.RARE, mage.cards.a.AshnodsCylix.class)); cards.add(new SetCardInfo("Astrolabe", "118a", Rarity.COMMON, mage.cards.a.Astrolabe.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Astrolabe", "118b", Rarity.COMMON, mage.cards.a.Astrolabe.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Awesome Presence", "23a", Rarity.COMMON, mage.cards.a.AwesomePresence.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Awesome Presence", "23b", Rarity.COMMON, mage.cards.a.AwesomePresence.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Balduvian Dead", 43, Rarity.UNCOMMON, mage.cards.b.BalduvianDead.class)); cards.add(new SetCardInfo("Balduvian Horde", 65, Rarity.RARE, mage.cards.b.BalduvianHorde.class)); cards.add(new SetCardInfo("Balduvian Trading Post", 137, Rarity.RARE, mage.cards.b.BalduvianTradingPost.class)); cards.add(new SetCardInfo("Balduvian War-Makers", "66a", Rarity.COMMON, mage.cards.b.BalduvianWarMakers.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Balduvian War-Makers", "66b", Rarity.COMMON, mage.cards.b.BalduvianWarMakers.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Benthic Explorers", "24a", Rarity.COMMON, mage.cards.b.BenthicExplorers.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Benthic Explorers", "24b", Rarity.COMMON, mage.cards.b.BenthicExplorers.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Bestial Fury", "67a", Rarity.COMMON, mage.cards.b.BestialFury.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Bestial Fury", "67b", Rarity.COMMON, mage.cards.b.BestialFury.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Bounty of the Hunt", 85, Rarity.UNCOMMON, mage.cards.b.BountyOfTheHunt.class));