From 5adc350eed26cda341afbbda39a8b7993c4e2bf6 Mon Sep 17 00:00:00 2001 From: ssk97 Date: Mon, 27 Nov 2023 20:40:28 -0800 Subject: [PATCH] [LTC] Implementations part 1/4 (#11469) * Anduril, Narsil Reforged * Gimli's Reckless Might * Nazgul Battle-Mace * Rally the Galadhrim * Rammas Echor, Ancient Shield --- .../mage/cards/a/AndurilNarsilReforged.java | 55 +++++++++++++++++ .../src/mage/cards/g/GimlisRecklessMight.java | 56 +++++++++++++++++ .../src/mage/cards/n/NazgulBattleMace.java | 60 +++++++++++++++++++ .../src/mage/cards/r/RallyTheGaladhrim.java | 37 ++++++++++++ .../cards/r/RammasEchorAncientShield.java | 56 +++++++++++++++++ .../sets/TalesOfMiddleEarthCommander.java | 5 ++ 6 files changed, 269 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/a/AndurilNarsilReforged.java create mode 100644 Mage.Sets/src/mage/cards/g/GimlisRecklessMight.java create mode 100644 Mage.Sets/src/mage/cards/n/NazgulBattleMace.java create mode 100644 Mage.Sets/src/mage/cards/r/RallyTheGaladhrim.java create mode 100644 Mage.Sets/src/mage/cards/r/RammasEchorAncientShield.java diff --git a/Mage.Sets/src/mage/cards/a/AndurilNarsilReforged.java b/Mage.Sets/src/mage/cards/a/AndurilNarsilReforged.java new file mode 100644 index 00000000000..370b3e8621b --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AndurilNarsilReforged.java @@ -0,0 +1,55 @@ +package mage.cards.a; + +import mage.abilities.common.AttacksAttachedTriggeredAbility; +import mage.abilities.condition.common.CitysBlessingCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.counter.AddCountersAllEffect; +import mage.abilities.hint.common.CitysBlessingHint; +import mage.abilities.keyword.AscendAbility; +import mage.abilities.keyword.EquipAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.counters.CounterType; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * + * @author notgreat + */ +public final class AndurilNarsilReforged extends CardImpl { + + public AndurilNarsilReforged(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.EQUIPMENT); + + // Ascend + this.addAbility(new AscendAbility()); + + // Whenever equipped creature attacks, put a +1/+1 counter on each creature you control. If you have the city's blessing, put two +1/+1 counters on each creature you control instead. + this.addAbility(new AttacksAttachedTriggeredAbility( + new ConditionalOneShotEffect(new AddCountersAllEffect(CounterType.P1P1.createInstance(2), StaticFilters.FILTER_CONTROLLED_CREATURE), + new AddCountersAllEffect(CounterType.P1P1.createInstance(), StaticFilters.FILTER_CONTROLLED_CREATURE), CitysBlessingCondition.instance, + "put a +1/+1 counter on each creature you control. If you have the city's blessing, put two +1/+1 counters on each creature you control instead"), + AttachmentType.EQUIPMENT, false) + .addHint(CitysBlessingHint.instance)); + // Equip {3} + this.addAbility(new EquipAbility(3, false)); + } + + private AndurilNarsilReforged(final AndurilNarsilReforged card) { + super(card); + } + + @Override + public AndurilNarsilReforged copy() { + return new AndurilNarsilReforged(this); + } +} diff --git a/Mage.Sets/src/mage/cards/g/GimlisRecklessMight.java b/Mage.Sets/src/mage/cards/g/GimlisRecklessMight.java new file mode 100644 index 00000000000..44990dd8848 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GimlisRecklessMight.java @@ -0,0 +1,56 @@ +package mage.cards.g; + +import mage.abilities.TriggeredAbility; +import mage.abilities.common.AttacksWithCreaturesTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.FormidableCondition; +import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; +import mage.abilities.effects.common.FightTargetsEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.StaticFilters; +import mage.filter.common.FilterAttackingCreature; +import mage.filter.common.FilterCreaturePermanent; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * + * @author notgreat + */ +public final class GimlisRecklessMight extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterAttackingCreature("attacking creature you control"); + + static { + filter.add(TargetController.YOU.getControllerPredicate()); + } + + public GimlisRecklessMight(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{R}"); + + // Creatures you control have haste. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect( + HasteAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES))); + // Formidable -- Whenever you attack, if creatures you control have total power 8 or greater, target attacking creature you control fights up to one target creature you don't control. + TriggeredAbility ability = new AttacksWithCreaturesTriggeredAbility(new FightTargetsEffect(),1); + ability.addTarget(new TargetPermanent(filter)); + ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL)); + ability.setAbilityWord(AbilityWord.FORMIDABLE); + this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, FormidableCondition.instance, + "Formidable — Whenever you attack, if creatures you control have total power 8 or greater, target attacking creature you control fights up to one target creature you don't control.")); + } + + private GimlisRecklessMight(final GimlisRecklessMight card) { + super(card); + } + + @Override + public GimlisRecklessMight copy() { + return new GimlisRecklessMight(this); + } +} diff --git a/Mage.Sets/src/mage/cards/n/NazgulBattleMace.java b/Mage.Sets/src/mage/cards/n/NazgulBattleMace.java new file mode 100644 index 00000000000..1c286b23c81 --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NazgulBattleMace.java @@ -0,0 +1,60 @@ +package mage.cards.n; + +import mage.abilities.Ability; +import mage.abilities.common.OpponentSacrificesNonTokenPermanentTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.PayLifeCost; +import mage.abilities.effects.common.DoUnlessTargetPlayerOrTargetsControllerPaysEffect; +import mage.abilities.effects.common.ReturnToBattlefieldUnderYourControlTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.AnnihilatorAbility; +import mage.abilities.keyword.DeathtouchAbility; +import mage.abilities.keyword.EquipAbility; +import mage.abilities.keyword.MenaceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; + +import java.util.UUID; + +/** + * + * @author notgreat + */ +public final class NazgulBattleMace extends CardImpl { + + public NazgulBattleMace(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{5}"); + + this.subtype.add(SubType.EQUIPMENT); + //String abilityText = "Whenever an opponent sacrifices a nontoken permanent, put that card onto the battlefield under your control unless that player pays 3 life"; + // Equipped creature has menace, deathtouch, annihilator 1, and + // "Whenever an opponent sacrifices a nontoken permanent, put that card onto the battlefield under your control unless that player pays 3 life." + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(new MenaceAbility(false), AttachmentType.EQUIPMENT)); + ability.addEffect(new GainAbilityAttachedEffect(DeathtouchAbility.getInstance(), AttachmentType.EQUIPMENT).setText(", deathtouch")); + ability.addEffect(new GainAbilityAttachedEffect(new AnnihilatorAbility(1), AttachmentType.EQUIPMENT).setText(", annihilator 1")); + Ability sacTriggerAbility = new OpponentSacrificesNonTokenPermanentTriggeredAbility( + new DoUnlessTargetPlayerOrTargetsControllerPaysEffect( + new ReturnToBattlefieldUnderYourControlTargetEffect(), + new PayLifeCost(3) + ).setText("put that card onto the battlefield under your control unless that player pays 3 life")); + ability.addEffect(new GainAbilityAttachedEffect(sacTriggerAbility, AttachmentType.EQUIPMENT) + .setText(", and \""+sacTriggerAbility.getRule()+"\"") + ); + this.addAbility(ability); + // Equip {3} + this.addAbility(new EquipAbility(3, false)); + } + + private NazgulBattleMace(final NazgulBattleMace card) { + super(card); + } + + @Override + public NazgulBattleMace copy() { + return new NazgulBattleMace(this); + } +} diff --git a/Mage.Sets/src/mage/cards/r/RallyTheGaladhrim.java b/Mage.Sets/src/mage/cards/r/RallyTheGaladhrim.java new file mode 100644 index 00000000000..64b2e88ac0b --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RallyTheGaladhrim.java @@ -0,0 +1,37 @@ +package mage.cards.r; + +import mage.abilities.effects.common.CreateTokenCopyTargetEffect; +import mage.abilities.keyword.ConspireAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetControlledCreaturePermanent; + +import java.util.UUID; + +/** + * + * @author notgreat + */ +public final class RallyTheGaladhrim extends CardImpl { + + public RallyTheGaladhrim(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{G}{U}"); + + // Create a token that's a copy of target creature you control. + this.getSpellAbility().addEffect(new CreateTokenCopyTargetEffect()); + this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent()); + // Conspire + this.addAbility(new ConspireAbility(ConspireAbility.ConspireTargets.ONE)); + + } + + private RallyTheGaladhrim(final RallyTheGaladhrim card) { + super(card); + } + + @Override + public RallyTheGaladhrim copy() { + return new RallyTheGaladhrim(this); + } +} diff --git a/Mage.Sets/src/mage/cards/r/RammasEchorAncientShield.java b/Mage.Sets/src/mage/cards/r/RammasEchorAncientShield.java new file mode 100644 index 00000000000..626f97e0d23 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RammasEchorAncientShield.java @@ -0,0 +1,56 @@ +package mage.cards.r; + +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfCombatTriggeredAbility; +import mage.abilities.common.CastSecondSpellTriggeredAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.DefenderAbility; +import mage.abilities.keyword.ExaltedAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SuperType; +import mage.constants.TargetController; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.AbilityPredicate; +import mage.game.permanent.token.TeyoToken; + +import java.util.UUID; + +/** + * + * @author notgreat + */ +public final class RammasEchorAncientShield extends CardImpl { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("creatures you control with defender"); + + static { + filter.add(new AbilityPredicate(DefenderAbility.class)); + } + public RammasEchorAncientShield(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}{W}"); + + this.supertype.add(SuperType.LEGENDARY); + + // Whenever you cast your second spell each turn, draw a card, then create a 0/3 white Wall creature token with defender. + Ability ability = new CastSecondSpellTriggeredAbility(new DrawCardSourceControllerEffect(1)); + ability.addEffect(new CreateTokenEffect(new TeyoToken()).concatBy(", then")); + this.addAbility(ability); + + // At the beginning of combat on your turn, creatures you control with defender gain exalted until end of turn. + this.addAbility(new BeginningOfCombatTriggeredAbility(new GainAbilityControlledEffect(new ExaltedAbility(), Duration.EndOfTurn, filter), TargetController.YOU, false)); + } + + private RammasEchorAncientShield(final RammasEchorAncientShield card) { + super(card); + } + + @Override + public RammasEchorAncientShield copy() { + return new RammasEchorAncientShield(this); + } +} diff --git a/Mage.Sets/src/mage/sets/TalesOfMiddleEarthCommander.java b/Mage.Sets/src/mage/sets/TalesOfMiddleEarthCommander.java index 512ff4c8ae8..0a5359d1fe0 100644 --- a/Mage.Sets/src/mage/sets/TalesOfMiddleEarthCommander.java +++ b/Mage.Sets/src/mage/sets/TalesOfMiddleEarthCommander.java @@ -19,6 +19,7 @@ public final class TalesOfMiddleEarthCommander extends ExpansionSet { cards.add(new SetCardInfo("Abyssal Persecutor", 525, Rarity.MYTHIC, mage.cards.a.AbyssalPersecutor.class)); cards.add(new SetCardInfo("Access Tunnel", 294, Rarity.UNCOMMON, mage.cards.a.AccessTunnel.class)); cards.add(new SetCardInfo("Ancient Tomb", 357, Rarity.MYTHIC, mage.cards.a.AncientTomb.class)); + cards.add(new SetCardInfo("Anduril, Narsil Reforged", 491, Rarity.RARE, mage.cards.a.AndurilNarsilReforged.class)); cards.add(new SetCardInfo("Anger", 210, Rarity.UNCOMMON, mage.cards.a.Anger.class)); cards.add(new SetCardInfo("Anguished Unmaking", 265, Rarity.RARE, mage.cards.a.AnguishedUnmaking.class)); cards.add(new SetCardInfo("Aragorn, King of Gondor", 5, Rarity.MYTHIC, mage.cards.a.AragornKingOfGondor.class)); @@ -139,6 +140,7 @@ public final class TalesOfMiddleEarthCommander extends ExpansionSet { cards.add(new SetCardInfo("Gilded Goose", 246, Rarity.RARE, mage.cards.g.GildedGoose.class)); cards.add(new SetCardInfo("Gilraen, Dunedain Protector", 13, Rarity.RARE, mage.cards.g.GilraenDunedainProtector.class)); cards.add(new SetCardInfo("Gimli of the Glittering Caves", 32, Rarity.RARE, mage.cards.g.GimliOfTheGlitteringCaves.class)); + cards.add(new SetCardInfo("Gimli's Reckless Might", 494, Rarity.RARE, mage.cards.g.GimlisRecklessMight.class)); cards.add(new SetCardInfo("Glacial Fortress", 315, Rarity.RARE, mage.cards.g.GlacialFortress.class)); cards.add(new SetCardInfo("Go for the Throat", 201, Rarity.UNCOMMON, mage.cards.g.GoForTheThroat.class)); cards.add(new SetCardInfo("Goblin Cratermaker", 218, Rarity.UNCOMMON, mage.cards.g.GoblinCratermaker.class)); @@ -204,6 +206,7 @@ public final class TalesOfMiddleEarthCommander extends ExpansionSet { cards.add(new SetCardInfo("Murmuring Bosk", 320, Rarity.RARE, mage.cards.m.MurmuringBosk.class)); cards.add(new SetCardInfo("Myriad Landscape", 534, Rarity.UNCOMMON, mage.cards.m.MyriadLandscape.class)); cards.add(new SetCardInfo("Mystic Confluence", 193, Rarity.RARE, mage.cards.m.MysticConfluence.class)); + cards.add(new SetCardInfo("Nazgul Battle-Mace", 510, Rarity.RARE, mage.cards.n.NazgulBattleMace.class)); cards.add(new SetCardInfo("Necroblossom Snarl", 321, Rarity.RARE, mage.cards.n.NecroblossomSnarl.class)); cards.add(new SetCardInfo("Night's Whisper", 205, Rarity.COMMON, mage.cards.n.NightsWhisper.class)); cards.add(new SetCardInfo("Notion Thief", 270, Rarity.RARE, mage.cards.n.NotionThief.class)); @@ -230,6 +233,8 @@ public final class TalesOfMiddleEarthCommander extends ExpansionSet { cards.add(new SetCardInfo("Prosperous Innkeeper", 256, Rarity.UNCOMMON, mage.cards.p.ProsperousInnkeeper.class)); cards.add(new SetCardInfo("Radagast, Wizard of Wilds", 66, Rarity.RARE, mage.cards.r.RadagastWizardOfWilds.class)); cards.add(new SetCardInfo("Raise the Palisade", 23, Rarity.RARE, mage.cards.r.RaiseThePalisade.class)); + cards.add(new SetCardInfo("Rally the Galadhrim", 499, Rarity.RARE, mage.cards.r.RallyTheGaladhrim.class)); + cards.add(new SetCardInfo("Rammas Echor, Ancient Shield", 505, Rarity.RARE, mage.cards.r.RammasEchorAncientShield.class)); cards.add(new SetCardInfo("Rampaging War Mammoth", 34, Rarity.RARE, mage.cards.r.RampagingWarMammoth.class)); cards.add(new SetCardInfo("Rampant Growth", 257, Rarity.COMMON, mage.cards.r.RampantGrowth.class)); cards.add(new SetCardInfo("Rapacious Guest", 28, Rarity.RARE, mage.cards.r.RapaciousGuest.class));