diff --git a/Mage.Sets/src/mage/cards/e/EnduringTenacity.java b/Mage.Sets/src/mage/cards/e/EnduringTenacity.java new file mode 100644 index 00000000000..3b067c773b3 --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/EnduringTenacity.java @@ -0,0 +1,122 @@ +package mage.cards.e; + +import mage.MageInt; +import mage.MageObjectReference; +import mage.abilities.Ability; +import mage.abilities.common.DiesSourceTriggeredAbility; +import mage.abilities.common.GainLifeControllerTriggeredAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.SourceMatchesFilterCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.dynamicvalue.common.SavedGainedLifeValue; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.LoseLifeTargetEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetOpponent; +import mage.target.targetpointer.FixedTarget; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class EnduringTenacity extends CardImpl { + + private static final Condition condition = new SourceMatchesFilterCondition(StaticFilters.FILTER_PERMANENT_CREATURE); + + public EnduringTenacity(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "{2}{B}{B}"); + + this.subtype.add(SubType.SNAKE); + this.subtype.add(SubType.GLIMMER); + this.power = new MageInt(4); + this.toughness = new MageInt(3); + + // Whenever you gain life, target opponent loses that much life. + Ability ability = new GainLifeControllerTriggeredAbility(new LoseLifeTargetEffect(SavedGainedLifeValue.MUCH)); + ability.addTarget(new TargetOpponent()); + this.addAbility(ability); + + // When Enduring Tenacity dies, if it was a creature, return it to the battlefield under its owner's control. It's an enchantment. + this.addAbility(new ConditionalTriggeredAbility( + new DiesSourceTriggeredAbility(new EnduringTenacityReturnEffect()), + condition, "When {this} dies, if it was a creature, " + + "return it to the battlefield under its owner's control. It's an enchantment." + )); + } + + private EnduringTenacity(final EnduringTenacity card) { + super(card); + } + + @Override + public EnduringTenacity copy() { + return new EnduringTenacity(this); + } +} + +class EnduringTenacityReturnEffect extends OneShotEffect { + + EnduringTenacityReturnEffect() { + super(Outcome.Benefit); + } + + private EnduringTenacityReturnEffect(final EnduringTenacityReturnEffect effect) { + super(effect); + } + + @Override + public EnduringTenacityReturnEffect copy() { + return new EnduringTenacityReturnEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Card card = game.getCard(source.getSourceId()); + if (player == null || card == null + || card.getZoneChangeCounter(game) != source.getSourceObjectZoneChangeCounter() + 1) { + return false; + } + game.addEffect(new EnduringTenacityTypeEffect() + .setTargetPointer(new FixedTarget(new MageObjectReference(card, game, 1))), source); + return player.moveCards(card, Zone.BATTLEFIELD, source, game); + } +} + +class EnduringTenacityTypeEffect extends ContinuousEffectImpl { + + EnduringTenacityTypeEffect() { + super(Duration.Custom, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Benefit); + } + + private EnduringTenacityTypeEffect(final EnduringTenacityTypeEffect effect) { + super(effect); + } + + @Override + public EnduringTenacityTypeEffect copy() { + return new EnduringTenacityTypeEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (permanent == null) { + discard(); + return false; + } + permanent.retainAllEnchantmentSubTypes(game); + permanent.removeAllCardTypes(game); + permanent.addCardType(game, CardType.ENCHANTMENT); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/s/SanguineBond.java b/Mage.Sets/src/mage/cards/s/SanguineBond.java index f2d21379331..31c6cbac905 100644 --- a/Mage.Sets/src/mage/cards/s/SanguineBond.java +++ b/Mage.Sets/src/mage/cards/s/SanguineBond.java @@ -1,14 +1,12 @@ package mage.cards.s; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.Ability; +import mage.abilities.common.GainLifeControllerTriggeredAbility; +import mage.abilities.dynamicvalue.common.SavedGainedLifeValue; import mage.abilities.effects.common.LoseLifeTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; import mage.target.common.TargetOpponent; import java.util.UUID; @@ -22,7 +20,7 @@ public final class SanguineBond extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}{B}"); // Whenever you gain life, target opponent loses that much life. - SanguineBondTriggeredAbility ability = new SanguineBondTriggeredAbility(); + Ability ability = new GainLifeControllerTriggeredAbility(new LoseLifeTargetEffect(SavedGainedLifeValue.MUCH)); ability.addTarget(new TargetOpponent()); this.addAbility(ability); } @@ -36,39 +34,3 @@ public final class SanguineBond extends CardImpl { return new SanguineBond(this); } } - -class SanguineBondTriggeredAbility extends TriggeredAbilityImpl { - - public SanguineBondTriggeredAbility() { - super(Zone.BATTLEFIELD, null); - } - - private SanguineBondTriggeredAbility(final SanguineBondTriggeredAbility ability) { - super(ability); - } - - @Override - public SanguineBondTriggeredAbility copy() { - return new SanguineBondTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.GAINED_LIFE; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getPlayerId().equals(this.controllerId)) { - this.getEffects().clear(); - this.addEffect(new LoseLifeTargetEffect(event.getAmount())); - return true; - } - return false; - } - - @Override - public String getRule() { - return "Whenever you gain life, target opponent loses that much life."; - } -} diff --git a/Mage.Sets/src/mage/sets/DuskmournHouseOfHorror.java b/Mage.Sets/src/mage/sets/DuskmournHouseOfHorror.java index c6309a46006..7bf250c988f 100644 --- a/Mage.Sets/src/mage/sets/DuskmournHouseOfHorror.java +++ b/Mage.Sets/src/mage/sets/DuskmournHouseOfHorror.java @@ -1,6 +1,7 @@ package mage.sets; import mage.cards.ExpansionSet; +import mage.constants.Rarity; import mage.constants.SetType; /** @@ -19,5 +20,7 @@ public final class DuskmournHouseOfHorror extends ExpansionSet { this.blockName = "Duskmourn: House of Horror"; // for sorting in GUI this.hasBasicLands = true; this.hasBoosters = false; // temporary + + cards.add(new SetCardInfo("Enduring Tenacity", 390, Rarity.MYTHIC, mage.cards.e.EnduringTenacity.class)); } } diff --git a/Mage/src/main/java/mage/constants/SubType.java b/Mage/src/main/java/mage/constants/SubType.java index 1f4a6d5181c..dbe5b1ea3c3 100644 --- a/Mage/src/main/java/mage/constants/SubType.java +++ b/Mage/src/main/java/mage/constants/SubType.java @@ -188,6 +188,7 @@ public enum SubType { GERM("Germ", SubTypeSet.CreatureType), GIANT("Giant", SubTypeSet.CreatureType), GITH("Gith", SubTypeSet.CreatureType), + GLIMMER("Glimmer", SubTypeSet.CreatureType), GNOLL("Gnoll", SubTypeSet.CreatureType), GNOME("Gnome", SubTypeSet.CreatureType), GOAT("Goat", SubTypeSet.CreatureType),