From 39904d0ca32c4bf547aaa92292a5e29507970323 Mon Sep 17 00:00:00 2001 From: Susucre <34709007+Susucre@users.noreply.github.com> Date: Sun, 9 Jul 2023 22:42:29 +0200 Subject: [PATCH] [LTR] Implement Boromir, Warden of the Tower (#10594) * [LTR] Implement Boromir, Warden of the Tower * group trigger from Boromir and Lavinia * fix trigger text --- .../mage/cards/b/BoromirWardenOfTheTower.java | 61 +++++++++++++++++++ .../mage/cards/l/LaviniaAzoriusRenegade.java | 48 +-------------- .../TheLordOfTheRingsTalesOfMiddleEarth.java | 1 + ...stOpponentNoManaSpentTriggeredAbility.java | 48 +++++++++++++++ 4 files changed, 112 insertions(+), 46 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/b/BoromirWardenOfTheTower.java create mode 100644 Mage/src/main/java/mage/abilities/common/SpellCastOpponentNoManaSpentTriggeredAbility.java diff --git a/Mage.Sets/src/mage/cards/b/BoromirWardenOfTheTower.java b/Mage.Sets/src/mage/cards/b/BoromirWardenOfTheTower.java new file mode 100644 index 00000000000..b2fe2c73015 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BoromirWardenOfTheTower.java @@ -0,0 +1,61 @@ +package mage.cards.b; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SpellCastOpponentNoManaSpentTriggeredAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.effects.common.CounterTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.effects.keyword.TheRingTemptsYouEffect; +import mage.abilities.keyword.IndestructibleAbility; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * + * @author Susucr + */ +public final class BoromirWardenOfTheTower extends CardImpl { + + public BoromirWardenOfTheTower(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // Whenever an opponent casts a spell, if no mana was spent to cast it, counter that spell. + this.addAbility(new SpellCastOpponentNoManaSpentTriggeredAbility(new CounterTargetEffect())); + + // Sacrifice Boromir, Warden of the Tower: Creatures you control gain indestructible until end of turn. The Ring tempts you. + Ability ability = new SimpleActivatedAbility(new GainAbilityAllEffect( + IndestructibleAbility.getInstance(), Duration.EndOfTurn, + StaticFilters.FILTER_CONTROLLED_CREATURES, false + ), new SacrificeSourceCost()); + ability.addEffect(new TheRingTemptsYouEffect()); + this.addAbility(ability); + } + + private BoromirWardenOfTheTower(final BoromirWardenOfTheTower card) { + super(card); + } + + @Override + public BoromirWardenOfTheTower copy() { + return new BoromirWardenOfTheTower(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/l/LaviniaAzoriusRenegade.java b/Mage.Sets/src/mage/cards/l/LaviniaAzoriusRenegade.java index a592b8dac89..23b9b994000 100644 --- a/Mage.Sets/src/mage/cards/l/LaviniaAzoriusRenegade.java +++ b/Mage.Sets/src/mage/cards/l/LaviniaAzoriusRenegade.java @@ -4,10 +4,9 @@ package mage.cards.l; import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.SpellCastOpponentNoManaSpentTriggeredAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.CounterTargetEffect; import mage.cards.Card; import mage.cards.CardImpl; @@ -20,8 +19,6 @@ import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; -import mage.game.stack.Spell; -import mage.target.targetpointer.FixedTarget; import java.util.List; import java.util.UUID; @@ -45,7 +42,7 @@ public final class LaviniaAzoriusRenegade extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new LaviniaAzoriusRenegadeReplacementEffect())); // Whenever an opponent casts a spell, if no mana was spent to cast it, counter that spell. - this.addAbility(new LaviniaAzoriusRenegadeTriggeredAbility()); + this.addAbility(new SpellCastOpponentNoManaSpentTriggeredAbility(new CounterTargetEffect())); } private LaviniaAzoriusRenegade(final LaviniaAzoriusRenegade card) { @@ -114,45 +111,4 @@ class LaviniaAzoriusRenegadeReplacementEffect extends ContinuousRuleModifyingEff public LaviniaAzoriusRenegadeReplacementEffect copy() { return new LaviniaAzoriusRenegadeReplacementEffect(this); } -} - - -class LaviniaAzoriusRenegadeTriggeredAbility extends TriggeredAbilityImpl { - - public LaviniaAzoriusRenegadeTriggeredAbility() { - super(Zone.BATTLEFIELD, new CounterTargetEffect(), false); - } - - public LaviniaAzoriusRenegadeTriggeredAbility(final LaviniaAzoriusRenegadeTriggeredAbility ability) { - super(ability); - } - - @Override - public LaviniaAzoriusRenegadeTriggeredAbility copy() { - return new LaviniaAzoriusRenegadeTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.SPELL_CAST; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (game.getPlayer(this.getControllerId()).hasOpponent(event.getPlayerId(), game)) { - Spell spell = game.getStack().getSpell(event.getTargetId()); - if (spell != null && spell.getStackAbility().getManaCostsToPay().getUsedManaToPay().count() == 0) { - for (Effect effect : this.getEffects()) { - effect.setTargetPointer(new FixedTarget(event.getTargetId())); - } - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever an opponent casts a spell, if no mana was spent to cast it, counter that spell."; - } } \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/TheLordOfTheRingsTalesOfMiddleEarth.java b/Mage.Sets/src/mage/sets/TheLordOfTheRingsTalesOfMiddleEarth.java index cdf3e5905fb..450c8054b58 100644 --- a/Mage.Sets/src/mage/sets/TheLordOfTheRingsTalesOfMiddleEarth.java +++ b/Mage.Sets/src/mage/sets/TheLordOfTheRingsTalesOfMiddleEarth.java @@ -39,6 +39,7 @@ public final class TheLordOfTheRingsTalesOfMiddleEarth extends ExpansionSet { cards.add(new SetCardInfo("Bombadil's Song", 154, Rarity.COMMON, mage.cards.b.BombadilsSong.class)); cards.add(new SetCardInfo("Book of Mazarbul", 116, Rarity.UNCOMMON, mage.cards.b.BookOfMazarbul.class)); cards.add(new SetCardInfo("Borne Upon a Wind", 44, Rarity.RARE, mage.cards.b.BorneUponAWind.class)); + cards.add(new SetCardInfo("Boromir, Warden of the Tower", 4, Rarity.RARE, mage.cards.b.BoromirWardenOfTheTower.class)); cards.add(new SetCardInfo("Brandywine Farmer", 155, Rarity.COMMON, mage.cards.b.BrandywineFarmer.class)); cards.add(new SetCardInfo("Breaking of the Fellowship", 117, Rarity.COMMON, mage.cards.b.BreakingOfTheFellowship.class)); cards.add(new SetCardInfo("Butterbur, Bree Innkeeper", 197, Rarity.UNCOMMON, mage.cards.b.ButterburBreeInnkeeper.class)); diff --git a/Mage/src/main/java/mage/abilities/common/SpellCastOpponentNoManaSpentTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/SpellCastOpponentNoManaSpentTriggeredAbility.java new file mode 100644 index 00000000000..3b95261fafd --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/SpellCastOpponentNoManaSpentTriggeredAbility.java @@ -0,0 +1,48 @@ +package mage.abilities.common; + +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.stack.Spell; +import mage.target.targetpointer.FixedTarget; + +/** + * @author Susucr + */ +public class SpellCastOpponentNoManaSpentTriggeredAbility extends TriggeredAbilityImpl { + + public SpellCastOpponentNoManaSpentTriggeredAbility(Effect effect) { + super(Zone.BATTLEFIELD, effect, false); + this.setTriggerPhrase("Whenever an opponent casts a spell, if no mana was spent to cast it, "); + } + + public SpellCastOpponentNoManaSpentTriggeredAbility(final SpellCastOpponentNoManaSpentTriggeredAbility ability) { + super(ability); + } + + @Override + public SpellCastOpponentNoManaSpentTriggeredAbility copy() { + return new SpellCastOpponentNoManaSpentTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.SPELL_CAST; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (game.getPlayer(this.getControllerId()).hasOpponent(event.getPlayerId(), game)) { + Spell spell = game.getStack().getSpell(event.getTargetId()); + if (spell != null && spell.getStackAbility().getManaCostsToPay().getUsedManaToPay().count() == 0) { + for (Effect effect : this.getEffects()) { + effect.setTargetPointer(new FixedTarget(event.getTargetId())); + } + return true; + } + } + return false; + } +} \ No newline at end of file