From 0b4313846ec1ec75b081dca5fbf1e2150b913de4 Mon Sep 17 00:00:00 2001 From: Grath <1895280+Grath@users.noreply.github.com> Date: Tue, 10 Sep 2024 16:08:40 -0400 Subject: [PATCH] [ACR] Implement Roshan, Hidden Magister. --- .../mage/cards/r/RoshanHiddenMagister.java | 77 +++++++++++++++++++ Mage.Sets/src/mage/sets/AssassinsCreed.java | 1 + .../AddCreatureSubTypeAllMultiZoneEffect.java | 24 +++++- 3 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/r/RoshanHiddenMagister.java diff --git a/Mage.Sets/src/mage/cards/r/RoshanHiddenMagister.java b/Mage.Sets/src/mage/cards/r/RoshanHiddenMagister.java new file mode 100644 index 00000000000..47760e576b4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RoshanHiddenMagister.java @@ -0,0 +1,77 @@ +package mage.cards.r; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.TurnedFaceUpAllTriggeredAbility; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.LoseLifeSourceControllerEffect; +import mage.abilities.effects.common.continuous.AddCreatureSubTypeAllMultiZoneEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.MenaceAbility; +import mage.constants.*; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledCreatureSpell; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.common.FilterOwnedCreatureCard; +import mage.filter.predicate.card.FaceDownPredicate; + +/** + * + * @author Grath + */ +public final class RoshanHiddenMagister extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Face-down creatures"); + public static final FilterControlledCreatureSpell filterSpells = new FilterControlledCreatureSpell("creature spells you control"); + public static final FilterOwnedCreatureCard filterCards = new FilterOwnedCreatureCard("creature cards you own"); + + static { + filter.add(FaceDownPredicate.instance); + } + + public RoshanHiddenMagister(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.ASSASSIN); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Other creatures you control are Assassins in addition to their other types. The same is true for creature spells you control and creature cards you own that aren't on the battlefield. + this.addAbility(new SimpleStaticAbility(new AddCreatureSubTypeAllMultiZoneEffect( + StaticFilters.FILTER_CONTROLLED_CREATURES, + filterSpells, + filterCards, + SubType.ASSASSIN + ))); + + // Face-down creatures you control have menace. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD,new GainAbilityControlledEffect( + new MenaceAbility(false), + Duration.WhileOnBattlefield, + filter + ))); + + // Whenever a permanent you control is turned face up, you draw a card and you lose 1 life. + Ability ability = new TurnedFaceUpAllTriggeredAbility( + new DrawCardSourceControllerEffect(1), + StaticFilters.FILTER_CONTROLLED_A_PERMANENT + ); + ability.addEffect(new LoseLifeSourceControllerEffect(1)); + this.addAbility(ability); + } + + private RoshanHiddenMagister(final RoshanHiddenMagister card) { + super(card); + } + + @Override + public RoshanHiddenMagister copy() { + return new RoshanHiddenMagister(this); + } +} diff --git a/Mage.Sets/src/mage/sets/AssassinsCreed.java b/Mage.Sets/src/mage/sets/AssassinsCreed.java index 2bae1f33ef7..49117b4c31d 100644 --- a/Mage.Sets/src/mage/sets/AssassinsCreed.java +++ b/Mage.Sets/src/mage/sets/AssassinsCreed.java @@ -107,6 +107,7 @@ public final class AssassinsCreed extends ExpansionSet { cards.add(new SetCardInfo("Rest in Peace", 83, Rarity.RARE, mage.cards.r.RestInPeace.class)); cards.add(new SetCardInfo("Restart Sequence", 30, Rarity.UNCOMMON, mage.cards.r.RestartSequence.class)); cards.add(new SetCardInfo("Rooftop Bypass", 298, Rarity.RARE, mage.cards.r.RooftopBypass.class)); + cards.add(new SetCardInfo("Roshan, Hidden Magister", 32, Rarity.UNCOMMON, mage.cards.r.RoshanHiddenMagister.class)); cards.add(new SetCardInfo("Royal Assassin", 93, Rarity.RARE, mage.cards.r.RoyalAssassin.class)); cards.add(new SetCardInfo("Senu, Keen-Eyed Protector", 8, Rarity.RARE, mage.cards.s.SenuKeenEyedProtector.class)); cards.add(new SetCardInfo("Settlement Blacksmith", 280, Rarity.UNCOMMON, mage.cards.s.SettlementBlacksmith.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCreatureSubTypeAllMultiZoneEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCreatureSubTypeAllMultiZoneEffect.java index 7cc0aabe1cf..8367e9ceab7 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCreatureSubTypeAllMultiZoneEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCreatureSubTypeAllMultiZoneEffect.java @@ -24,19 +24,35 @@ public class AddCreatureSubTypeAllMultiZoneEffect extends ContinuousEffectImpl { private final FilterControlledCreaturePermanent filterPermanent; private final FilterControlledCreatureSpell filterSpell; private final FilterOwnedCreatureCard filterCard; + private final SubType chosenType; public AddCreatureSubTypeAllMultiZoneEffect( FilterControlledCreaturePermanent filterPermanent, FilterControlledCreatureSpell filterSpell, FilterOwnedCreatureCard filterCard + ) { + this(filterPermanent, filterSpell, filterCard, null); + } + + public AddCreatureSubTypeAllMultiZoneEffect( + FilterControlledCreaturePermanent filterPermanent, + FilterControlledCreatureSpell filterSpell, + FilterOwnedCreatureCard filterCard, + SubType chosenType ) { super(Duration.WhileOnBattlefield, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Benefit); this.filterPermanent = filterPermanent; this.filterSpell = filterSpell; this.filterCard = filterCard; + this.chosenType = chosenType; - staticText = filterPermanent.getMessage() + " are the chosen type in addition to their other types. " + String typeMessage = "the chosen type"; + if (chosenType != null) { + typeMessage = chosenType.getPluralName(); + } + + staticText = filterPermanent.getMessage() + " are " + typeMessage + " in addition to their other types. " + "The same is true for " + filterSpell.getMessage() + " and " + filterCard.getMessage() + " that aren't on the battlefield"; } @@ -46,6 +62,7 @@ public class AddCreatureSubTypeAllMultiZoneEffect extends ContinuousEffectImpl { this.filterPermanent = effect.filterPermanent; this.filterSpell = effect.filterSpell; this.filterCard = effect.filterCard; + this.chosenType = effect.chosenType; } @Override @@ -57,7 +74,10 @@ public class AddCreatureSubTypeAllMultiZoneEffect extends ContinuousEffectImpl { public boolean apply(Game game, Ability source) { UUID controllerId = source.getControllerId(); Player controller = game.getPlayer(controllerId); - SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(source.getSourceId(), game); + SubType subType = this.chosenType; + if (subType == null) { + subType = ChooseCreatureTypeEffect.getChosenCreatureType(source.getSourceId(), game); + } if (controller == null || subType == null) { return false; }