From 4bd5ab5c0227acffadaead7c1d754e15afce3d72 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Sun, 12 Jan 2020 11:42:42 -0500 Subject: [PATCH] Implemented Bronzehide Lion --- .../src/mage/cards/b/BronzehideLion.java | 185 ++++++++++++++++++ .../src/mage/sets/TherosBeyondDeath.java | 1 + 2 files changed, 186 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BronzehideLion.java diff --git a/Mage.Sets/src/mage/cards/b/BronzehideLion.java b/Mage.Sets/src/mage/cards/b/BronzehideLion.java new file mode 100644 index 0000000000..29b75ebcdf --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BronzehideLion.java @@ -0,0 +1,185 @@ +package mage.cards.b; + +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.DiesTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.IndestructibleAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetPermanent; +import mage.target.common.TargetControlledCreaturePermanent; + +import java.util.ArrayList; +import java.util.UUID; + +/** + * @author LevelX2, TheElk801 + */ +public final class BronzehideLion extends CardImpl { + + public BronzehideLion(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}{W}"); + + this.subtype.add(SubType.CAT); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // {G}{W}: Bronzehide Lion gains indestructible until end of turn. + this.addAbility(new SimpleActivatedAbility(new GainAbilitySourceEffect( + IndestructibleAbility.getInstance(), Duration.EndOfTurn + ), new ManaCostsImpl("{G}{W}"))); + + // When Bronzehide Lion dies, return it to the battlefield. + // It's an Aura enchantment with enchant creature you control and + // "{G}{W}: Enchanted creature gains indestructible until end of turn," and it loses all other abilities. + this.addAbility(new DiesTriggeredAbility(new BronzehideLionReturnEffect())); + } + + private BronzehideLion(final BronzehideLion card) { + super(card); + } + + @Override + public BronzehideLion copy() { + return new BronzehideLion(this); + } +} + +class BronzehideLionReturnEffect extends OneShotEffect { + + BronzehideLionReturnEffect() { + super(Outcome.PutCardInPlay); + this.staticText = "return it to the battlefield. It's an Aura enchantment with enchant creature you control " + + "and \"{G}{W}: Enchanted creature gains indestructible until end of turn,\" and it loses all other abilities."; + } + + private BronzehideLionReturnEffect(final BronzehideLionReturnEffect effect) { + super(effect); + } + + @Override + public BronzehideLionReturnEffect copy() { + return new BronzehideLionReturnEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null || !(game.getState().getZone(source.getSourceId()) == Zone.GRAVEYARD)) { + return false; + } + + Card card = game.getCard(source.getSourceId()); + if (card == null) { + return false; + } + TargetPermanent target = new TargetControlledCreaturePermanent(); + target.setNotTarget(true); + if (controller.choose(outcome, target, source.getSourceId(), game) + && game.getPermanent(target.getFirstTarget()) != null) { + game.getState().setValue("attachTo:" + source.getSourceId(), target.getFirstTarget()); + } + game.addEffect(new BronzehideLionContinuousEffect(game.getState().getZoneChangeCounter(source.getSourceId()) + 1), source); + controller.moveCards(card, Zone.BATTLEFIELD, source, game); + Permanent aura = game.getPermanent(card.getId()); + Permanent creature = game.getPermanent(target.getFirstTarget()); + if (aura == null || creature == null) { + return true; + } + creature.addAttachment(aura.getId(), game); + return true; + } +} + +class BronzehideLionContinuousEffect extends ContinuousEffectImpl { + + private int zoneChangeCounter; + private final Ability activatedAbility = new SimpleActivatedAbility(new GainAbilityAttachedEffect( + IndestructibleAbility.getInstance(), AttachmentType.AURA, Duration.EndOfTurn + ), new ManaCostsImpl("{G}{W}")); + + BronzehideLionContinuousEffect(int zoneChangeCounter) { + super(Duration.Custom, Outcome.Neutral); + this.zoneChangeCounter = zoneChangeCounter; + dependencyTypes.add(DependencyType.AuraAddingRemoving); + } + + private BronzehideLionContinuousEffect(final BronzehideLionContinuousEffect ability) { + super(ability); + this.zoneChangeCounter = ability.zoneChangeCounter; + } + + @Override + public boolean apply(Game game, Ability source) { + return false; + } + + @Override + public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { + if (game.getState().getZoneChangeCounter(source.getSourceId()) > zoneChangeCounter) { + discard(); + } + MageObject sourceObject = game.getPermanent(source.getSourceId()); + if (sourceObject == null) { + sourceObject = game.getPermanentEntering(source.getSourceId()); + } + if (sourceObject == null) { + return false; + } + if (!(sourceObject instanceof Permanent)) { + return true; + } + Permanent lion = (Permanent) sourceObject; + switch (layer) { + case TypeChangingEffects_4: + lion.getCardType().clear(); + lion.addCardType(CardType.ENCHANTMENT); + lion.getSubtype(game).clear(); + lion.getSubtype(game).add(SubType.AURA); + break; + case AbilityAddingRemovingEffects_6: + ArrayList toRemove = new ArrayList<>(); + for (Ability ability : lion.getAbilities(game)) { + if (!lion.getSpellAbility().equals(ability)) { + toRemove.add(ability); + } + } + lion.getAbilities(game).removeAll(toRemove); + + lion.getSpellAbility().getTargets().clear(); + lion.getSpellAbility().getEffects().clear(); + TargetPermanent auraTarget = new TargetControlledCreaturePermanent(); + lion.getSpellAbility().addTarget(auraTarget); + lion.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + lion.addAbility(new EnchantAbility(auraTarget.getTargetName())); + + // add the activated ability + lion.addAbility(activatedAbility); + } + return true; + } + + @Override + public boolean hasLayer(Layer layer) { + return layer == Layer.TypeChangingEffects_4 || layer == Layer.AbilityAddingRemovingEffects_6; + } + + @Override + public BronzehideLionContinuousEffect copy() { + return new BronzehideLionContinuousEffect(this); + } +} diff --git a/Mage.Sets/src/mage/sets/TherosBeyondDeath.java b/Mage.Sets/src/mage/sets/TherosBeyondDeath.java index b4939a3cfc..78c1dfefe2 100644 --- a/Mage.Sets/src/mage/sets/TherosBeyondDeath.java +++ b/Mage.Sets/src/mage/sets/TherosBeyondDeath.java @@ -51,6 +51,7 @@ public final class TherosBeyondDeath extends ExpansionSet { cards.add(new SetCardInfo("Blood Aspirant", 128, Rarity.UNCOMMON, mage.cards.b.BloodAspirant.class)); cards.add(new SetCardInfo("Brine Giant", 44, Rarity.COMMON, mage.cards.b.BrineGiant.class)); cards.add(new SetCardInfo("Bronze Sword", 232, Rarity.COMMON, mage.cards.b.BronzeSword.class)); + cards.add(new SetCardInfo("Bronzehide Lion", 210, Rarity.RARE, mage.cards.b.BronzehideLion.class)); cards.add(new SetCardInfo("Calix, Destiny's Hand", 211, Rarity.MYTHIC, mage.cards.c.CalixDestinysHand.class)); cards.add(new SetCardInfo("Callaphe, Beloved of the Sea", 45, Rarity.UNCOMMON, mage.cards.c.CallapheBelovedOfTheSea.class)); cards.add(new SetCardInfo("Captivating Unicorn", 6, Rarity.COMMON, mage.cards.c.CaptivatingUnicorn.class));