diff --git a/Mage.Client/src/main/java/mage/client/components/BracketLegalityLabel.java b/Mage.Client/src/main/java/mage/client/components/BracketLegalityLabel.java index aa163daaa4a..7f1e39b67d3 100644 --- a/Mage.Client/src/main/java/mage/client/components/BracketLegalityLabel.java +++ b/Mage.Client/src/main/java/mage/client/components/BracketLegalityLabel.java @@ -4,8 +4,12 @@ import mage.MageObject; import mage.cards.Card; import mage.cards.decks.Deck; import mage.client.util.GUISizeHelper; +import org.apache.log4j.Logger; import java.awt.*; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; import java.util.List; import java.util.*; import java.util.stream.Stream; @@ -16,21 +20,31 @@ import java.util.stream.Stream; *

* Support: * - [x] game changers - * - [ ] infinite combos + * - [x] infinite combos * - [x] mass land destruction * - [x] extra turns * - [x] tutors + * Features: + * - [x] find possible bracket level of the deck + * - [x] find affected cards by checking group + * - [ ] TODO: data download and generate + * - [ ] TODO: tests + * - [ ] TODO: table - players brackets level disclose settings * * @author JayDi85 */ public class BracketLegalityLabel extends LegalityLabel { + private static final Logger logger = Logger.getLogger(BracketLegalityLabel.class); + private static final String GROUP_GAME_CHANGES = "Game Changers"; - private static final String GROUP_INFINITE_COMBOS = "Infinite Combos (unsupported)"; + private static final String GROUP_INFINITE_COMBOS = "Infinite Combos"; private static final String GROUP_MASS_LAND_DESTRUCTION = "Mass Land Destruction"; private static final String GROUP_EXTRA_TURN = "Extra Turns"; private static final String GROUP_TUTORS = "Tutors"; + private static final String RESOURCE_INFINITE_COMBOS = "brackets/infinite-combos.txt"; + private final BracketLevel level; private final List foundGameChangers = new ArrayList<>(); @@ -41,6 +55,7 @@ public class BracketLegalityLabel extends LegalityLabel { private final List badCards = new ArrayList<>(); private final List fullGameChanges = new ArrayList<>(); + private final Set fullInfiniteCombos = new HashSet<>(); // card1@card2, sorted by names, name must be xmage compatible public enum BracketLevel { BRACKET_1("Bracket 1"), @@ -243,8 +258,64 @@ public class BracketLegalityLabel extends LegalityLabel { } private void collectInfiniteCombos(Deck deck) { - // TODO: implement this.foundInfiniteCombos.clear(); + + if (this.fullInfiniteCombos.isEmpty()) { + InputStream in = BracketLegalityLabel.class.getClassLoader().getResourceAsStream(RESOURCE_INFINITE_COMBOS); + if (in == null) { + throw new RuntimeException("Commander brackets: can't load infinite combos list"); + } + try (InputStreamReader input = new InputStreamReader(in); + BufferedReader reader = new BufferedReader(input)) { + String line = reader.readLine(); + while (line != null) { + try { + line = line.trim(); + if (line.startsWith("#")) { + continue; + } + List cards = Arrays.asList(line.split("@")); + if (cards.size() != 2) { + logger.warn("wrong line format in commander brackets file: " + line); + continue; + } + + Collections.sort(cards); + this.fullInfiniteCombos.add(String.join("@", cards)); + } finally { + line = reader.readLine(); + } + } + } catch (Exception e) { + throw new RuntimeException("Tokens brackets: can't load infinite combos list - " + e); + } + } + + // search and check all x2 combinations + List deckCards = new ArrayList<>(); + Set foundCards = new HashSet<>(); + deckCards.addAll(deck.getCards()); + deckCards.addAll(deck.getSideboard()); + for (Card card1 : deckCards) { + for (Card card2 : deckCards) { + if (card1 == card2) { + continue; + } + List names = Arrays.asList(card1.getName(), card2.getName()); + Collections.sort(names); + String deckCombo = String.join("@", names); + if (this.fullInfiniteCombos.contains(deckCombo)) { + foundCards.add(card1); + foundCards.add(card2); + break; + } + } + } + + foundCards.stream() + .map(MageObject::getName) + .sorted() + .forEach(this.foundInfiniteCombos::add); } private void collectMassLandDestruction(Deck deck) { diff --git a/Mage.Sets/src/mage/cards/a/Aberrant.java b/Mage.Sets/src/mage/cards/a/Aberrant.java index ea06d8710c0..dc2f62010a8 100644 --- a/Mage.Sets/src/mage/cards/a/Aberrant.java +++ b/Mage.Sets/src/mage/cards/a/Aberrant.java @@ -12,7 +12,7 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.filter.common.FilterArtifactOrEnchantmentPermanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -42,7 +42,7 @@ public final class Aberrant extends CardImpl { Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DestroyTargetEffect(), false, true); ability.withFlavorWord("Heavy Power Hammer"); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/a/AbzanBeastmaster.java b/Mage.Sets/src/mage/cards/a/AbzanBeastmaster.java index 07baf140a0e..a413743d361 100644 --- a/Mage.Sets/src/mage/cards/a/AbzanBeastmaster.java +++ b/Mage.Sets/src/mage/cards/a/AbzanBeastmaster.java @@ -1,36 +1,35 @@ package mage.cards.a; -import java.util.UUID; import mage.MageInt; -import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.abilities.condition.common.ControlsCreatureGreatestToughnessCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; +import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class AbzanBeastmaster extends CardImpl { public AbzanBeastmaster(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); this.subtype.add(SubType.DOG); this.subtype.add(SubType.SHAMAN); this.power = new MageInt(2); this.toughness = new MageInt(1); // At the beginning of your upkeep, draw a card if you control the creature with the greatest toughness or tied for the greatest toughness. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new BeginningOfUpkeepTriggeredAbility(new DrawCardSourceControllerEffect(1)), - ControlsCreatureGreatestToughnessCondition.instance, - "At the beginning of your upkeep, draw a card if you control the creature with the greatest toughness or tied for the greatest toughness." - )); + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new ConditionalOneShotEffect( + new DrawCardSourceControllerEffect(1), ControlsCreatureGreatestToughnessCondition.instance, + "draw a card if you control the creature with the greatest toughness or tied for the greatest toughness" + ))); } private AbzanBeastmaster(final AbzanBeastmaster card) { diff --git a/Mage.Sets/src/mage/cards/a/AcclaimedContender.java b/Mage.Sets/src/mage/cards/a/AcclaimedContender.java index 0450d449e5f..2fbf272c272 100644 --- a/Mage.Sets/src/mage/cards/a/AcclaimedContender.java +++ b/Mage.Sets/src/mage/cards/a/AcclaimedContender.java @@ -4,7 +4,6 @@ import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -25,7 +24,7 @@ import java.util.UUID; */ public final class AcclaimedContender extends CardImpl { - private static final FilterPermanent filter = new FilterControlledPermanent(SubType.KNIGHT); + private static final FilterPermanent filter = new FilterControlledPermanent(SubType.KNIGHT, "you control another Knight"); private static final FilterCard filter2 = new FilterCard("a Knight, Aura, Equipment, or legendary artifact card"); @@ -53,14 +52,9 @@ public final class AcclaimedContender extends CardImpl { this.toughness = new MageInt(3); // When Acclaimed Contender enters the battlefield, if you control another Knight, look at the top five cards of your library. You may reveal a Knight, Aura, Equipment, or legendary artifact card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect( - 5, 1, filter2, PutCards.HAND, PutCards.BOTTOM_RANDOM - )), condition, "When {this} enters, " + - "if you control another Knight, look at the top five cards of your library. " + - "You may reveal a Knight, Aura, Equipment, or legendary artifact card from among them " + - "and put it into your hand. Put the rest on the bottom of your library in a random order." - )); + this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect( + 5, 1, filter2, PutCards.HAND, PutCards.BOTTOM_RANDOM + )).withInterveningIf(condition)); } private AcclaimedContender(final AcclaimedContender card) { diff --git a/Mage.Sets/src/mage/cards/a/AcererakTheArchlich.java b/Mage.Sets/src/mage/cards/a/AcererakTheArchlich.java index 11eda4d0318..d429f82da8c 100644 --- a/Mage.Sets/src/mage/cards/a/AcererakTheArchlich.java +++ b/Mage.Sets/src/mage/cards/a/AcererakTheArchlich.java @@ -6,7 +6,6 @@ import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.CompletedDungeonCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ReturnToHandSourceEffect; import mage.abilities.effects.keyword.VentureIntoTheDungeonEffect; @@ -22,8 +21,6 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.ZombieToken; import mage.players.Player; -import mage.target.TargetPermanent; -import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetSacrifice; import mage.watchers.common.CompletedDungeonWatcher; @@ -44,13 +41,9 @@ public final class AcererakTheArchlich extends CardImpl { this.toughness = new MageInt(5); // When Acererak the Archlich enters the battlefield, if you have not completed Tomb of Annihilation, return Acererak the Archlich to its owner's hand and venture into the dungeon. - Ability ability = new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new ReturnToHandSourceEffect(true)), - AcererakTheArchlichCondition.instance, "When {this} enters, " + - "if you haven't completed Tomb of Annihilation, return {this} " + - "to its owner's hand and venture into the dungeon." - ); - ability.addEffect(new VentureIntoTheDungeonEffect()); + Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandSourceEffect(true)) + .withInterveningIf(AcererakTheArchlichCondition.instance); + ability.addEffect(new VentureIntoTheDungeonEffect().concatBy("and")); ability.addHint(CurrentDungeonHint.instance); ability.addHint(CompletedDungeonCondition.getHint()); this.addAbility(ability, new CompletedDungeonWatcher()); @@ -78,6 +71,11 @@ enum AcererakTheArchlichCondition implements Condition { source.getControllerId(), game ).contains("Tomb of Annihilation"); } + + @Override + public String toString() { + return "you haven't completed Tomb of Annihilation"; + } } class AcererakTheArchlichEffect extends OneShotEffect { diff --git a/Mage.Sets/src/mage/cards/a/AdherentOfHope.java b/Mage.Sets/src/mage/cards/a/AdherentOfHope.java index df3e76f6db4..62f145afd02 100644 --- a/Mage.Sets/src/mage/cards/a/AdherentOfHope.java +++ b/Mage.Sets/src/mage/cards/a/AdherentOfHope.java @@ -1,45 +1,41 @@ package mage.cards.a; import mage.MageInt; -import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; +import mage.abilities.condition.Condition; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.hint.ConditionHint; +import mage.abilities.hint.Hint; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.counters.CounterType; -import mage.filter.common.FilterControlledPermanent; +import mage.filter.common.FilterControlledPlaneswalkerPermanent; import java.util.UUID; /** - * * @author htrajan */ public final class AdherentOfHope extends CardImpl { - private static final FilterControlledPermanent filter = new FilterControlledPermanent(); - - static { - filter.add(CardType.PLANESWALKER.getPredicate()); - filter.add(SubType.BASRI.getPredicate()); - } + private static final Condition condition = new PermanentsOnTheBattlefieldCondition( + new FilterControlledPlaneswalkerPermanent(SubType.BASRI, "you control a Basri planeswalker") + ); + private static final Hint hint = new ConditionHint(condition); public AdherentOfHope(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); - + this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.SOLDIER); this.power = new MageInt(2); this.toughness = new MageInt(1); // At the beginning of combat on your turn, if you control a Basri planeswalker, put a +1/+1 counter on Adherent of Hope. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new BeginningOfCombatTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance())), - new PermanentsOnTheBattlefieldCondition(filter), - "At the beginning of combat on your turn, if you control a Basri planeswalker, put a +1/+1 counter on {this}.")); + this.addAbility(new BeginningOfCombatTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance())).withInterveningIf(condition).addHint(hint)); } private AdherentOfHope(final AdherentOfHope card) { diff --git a/Mage.Sets/src/mage/cards/a/Adrestia.java b/Mage.Sets/src/mage/cards/a/Adrestia.java index c0df6888563..7536ee8ad98 100644 --- a/Mage.Sets/src/mage/cards/a/Adrestia.java +++ b/Mage.Sets/src/mage/cards/a/Adrestia.java @@ -1,40 +1,38 @@ package mage.cards.a; -import java.util.*; - import mage.MageInt; import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.condition.Condition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; -import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.continuous.AddCardSubTypeSourceEffect; import mage.abilities.hint.ConditionHint; import mage.abilities.hint.Hint; -import mage.constants.*; -import mage.abilities.keyword.IslandwalkAbility; import mage.abilities.keyword.CrewAbility; +import mage.abilities.keyword.IslandwalkAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.*; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.watchers.Watcher; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + /** - * * @author Grath */ public final class Adrestia extends CardImpl { - private static final Condition condition = AdrestiaCondition.instance; public Adrestia(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); - + this.supertype.add(SuperType.LEGENDARY); this.subtype.add(SubType.VEHICLE); this.power = new MageInt(4); @@ -44,16 +42,14 @@ public final class Adrestia extends CardImpl { this.addAbility(new IslandwalkAbility()); // Whenever Adrestia attacks, if an Assassin crewed it this turn, draw a card. Adrestia becomes an Assassin in addition to its other types until end of turn. - Ability ability = new ConditionalInterveningIfTriggeredAbility( - new AttacksTriggeredAbility(new DrawCardSourceControllerEffect(1), false), - condition, "Whenever {this} attacks, if an Assassin crewed it this turn, draw a card. {this} becomes an Assassin in addition to its other types until end of turn."); + Ability ability = new AttacksTriggeredAbility(new DrawCardSourceControllerEffect(1), false) + .withInterveningIf(AdrestiaCondition.instance); ability.addEffect(new AddCardSubTypeSourceEffect(Duration.EndOfTurn, true, SubType.ASSASSIN)); ability.addHint(AdrestiaCondition.getHint()); this.addAbility(ability, new AdrestiaWatcher()); // Crew 1 this.addAbility(new CrewAbility(1)); - } private Adrestia(final Adrestia card) { @@ -68,13 +64,18 @@ public final class Adrestia extends CardImpl { enum AdrestiaCondition implements Condition { instance; - private static final Hint hint = new ConditionHint(instance, "an Assassin crewed it this turn"); + private static final Hint hint = new ConditionHint(instance); @Override public boolean apply(Game game, Ability source) { return AdrestiaWatcher.checkIfAssassinCrewed(source.getSourcePermanentOrLKI(game), game); } + @Override + public String toString() { + return "an Assassin crewed it this turn"; + } + public static Hint getHint() { return hint; } @@ -97,8 +98,7 @@ class AdrestiaWatcher extends Watcher { if (crewer != null) { if (!crewMap.containsKey(vehicle)) { crewMap.put(vehicle, filter.match(crewer, game)); - } - else { + } else { crewMap.put(vehicle, crewMap.get(vehicle) || filter.match(crewer, game)); } } diff --git a/Mage.Sets/src/mage/cards/a/AerialSurveyor.java b/Mage.Sets/src/mage/cards/a/AerialSurveyor.java index fae375b3700..0aaed9d279b 100644 --- a/Mage.Sets/src/mage/cards/a/AerialSurveyor.java +++ b/Mage.Sets/src/mage/cards/a/AerialSurveyor.java @@ -4,7 +4,6 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.condition.Condition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; import mage.abilities.hint.Hint; import mage.abilities.hint.common.LandsYouControlHint; @@ -46,13 +45,10 @@ public final class AerialSurveyor extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever Aerial Surveyor attacks, if defending player controls more lands than you, search your library for a basic Plains card, put it onto the battlefield tapped, then shuffle. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new AttacksTriggeredAbility( - new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true) - ), AerialSurveyorCondition.instance, "Whenever {this} attacks, if defending player " + - "controls more lands than you, search your library for a basic Plains card, " + - "put it onto the battlefield tapped, then shuffle." - ).addHint(LandsYouControlHint.instance).addHint(AerialSurveyorHint.instance)); + this.addAbility(new AttacksTriggeredAbility(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true)) + .withInterveningIf(AerialSurveyorCondition.instance) + .addHint(LandsYouControlHint.instance) + .addHint(AerialSurveyorHint.instance)); // Crew 2 this.addAbility(new CrewAbility(2)); @@ -85,6 +81,11 @@ enum AerialSurveyorCondition implements Condition { source.getControllerId(), source, game ); } + + @Override + public String toString() { + return ""; + } } enum AerialSurveyorHint implements Hint { diff --git a/Mage.Sets/src/mage/cards/a/AlelaCunningConqueror.java b/Mage.Sets/src/mage/cards/a/AlelaCunningConqueror.java index 35a70741ddc..64e623d1928 100644 --- a/Mage.Sets/src/mage/cards/a/AlelaCunningConqueror.java +++ b/Mage.Sets/src/mage/cards/a/AlelaCunningConqueror.java @@ -14,7 +14,7 @@ import mage.constants.*; import mage.filter.common.FilterCreaturePermanent; import mage.game.permanent.token.FaerieRogueToken; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -48,7 +48,7 @@ public final class AlelaCunningConqueror extends CardImpl { Effect effect = new GoadTargetEffect().setText("goad target creature that player controls"); Ability ability = new OneOrMoreCombatDamagePlayerTriggeredAbility(Zone.BATTLEFIELD, effect, faerieFilter, SetTargetPointer.PLAYER, false); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/a/ArmWithAether.java b/Mage.Sets/src/mage/cards/a/ArmWithAether.java index 5c8eacb5aac..56864b7214a 100644 --- a/Mage.Sets/src/mage/cards/a/ArmWithAether.java +++ b/Mage.Sets/src/mage/cards/a/ArmWithAether.java @@ -12,7 +12,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.filter.common.FilterCreaturePermanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -30,7 +30,7 @@ public final class ArmWithAether extends CardImpl { // Until end of turn, creatures you control gain "Whenever this creature deals damage to an opponent, you may return target creature that player controls to its owner's hand." Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new ReturnToHandTargetEffect(), false, true); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); Effect effect = new GainAbilityControlledEffect(ability, Duration.EndOfTurn, new FilterCreaturePermanent()); effect.setText("Until end of turn, creatures you control gain \"Whenever this creature deals damage to an opponent, you may return target creature that player controls to its owner's hand.\""); diff --git a/Mage.Sets/src/mage/cards/a/AshlingTheExtinguisher.java b/Mage.Sets/src/mage/cards/a/AshlingTheExtinguisher.java index 87c9ed6ce85..3b110555383 100644 --- a/Mage.Sets/src/mage/cards/a/AshlingTheExtinguisher.java +++ b/Mage.Sets/src/mage/cards/a/AshlingTheExtinguisher.java @@ -11,7 +11,7 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.constants.SuperType; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -32,7 +32,7 @@ public final class AshlingTheExtinguisher extends CardImpl { Effect effect = new SacrificeTargetEffect().setText("choose target creature that player controls. The player sacrifices that creature"); Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(effect, false, true); ability.addTarget(new TargetCreaturePermanent()); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/b/BladeOfSharedSouls.java b/Mage.Sets/src/mage/cards/b/BladeOfSharedSouls.java index 1331a8007bd..e4074b2f5a1 100644 --- a/Mage.Sets/src/mage/cards/b/BladeOfSharedSouls.java +++ b/Mage.Sets/src/mage/cards/b/BladeOfSharedSouls.java @@ -20,6 +20,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetPermanent; +import mage.util.CardUtil; import java.util.UUID; @@ -67,14 +68,11 @@ enum BladeOfSharedSoulsPredicate implements ObjectSourcePlayerPredicate input, Game game) { - return input.getSource() - .getEffects() - .stream() - .map(effect -> effect.getValue("attachedPermanent")) - .filter(Permanent.class::isInstance) - .map(Permanent.class::cast) - .noneMatch(permanent -> input.getObject().getId().equals(permanent.getId()) - && input.getObject().getZoneChangeCounter(game) == permanent.getZoneChangeCounter(game)); + return !CardUtil + .getEffectValueFromAbility(input.getSource(), "attachedPermanent", Permanent.class) + .filter(permanent -> input.getObject().getId().equals(permanent.getId()) + && input.getObject().getZoneChangeCounter(game) == permanent.getZoneChangeCounter(game)) + .isPresent(); } } @@ -141,4 +139,4 @@ class BladeOfSharedSoulsCopyEffect extends CopyEffect { } return false; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/b/BlindZealot.java b/Mage.Sets/src/mage/cards/b/BlindZealot.java index 2d1cb8f963b..502ab8e6f1b 100644 --- a/Mage.Sets/src/mage/cards/b/BlindZealot.java +++ b/Mage.Sets/src/mage/cards/b/BlindZealot.java @@ -14,7 +14,7 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.filter.common.FilterCreaturePermanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -39,7 +39,7 @@ public final class BlindZealot extends CardImpl { OneShotEffect effect = new DoIfCostPaid(new DestroyTargetEffect(), new SacrificeSourceCost()); Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(effect, false, true); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/b/BorosStrikeCaptain.java b/Mage.Sets/src/mage/cards/b/BorosStrikeCaptain.java new file mode 100644 index 00000000000..f753b05abf7 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BorosStrikeCaptain.java @@ -0,0 +1,142 @@ +package mage.cards.b; + +import mage.MageInt; +import mage.MageObjectReference; +import mage.abilities.Ability; +import mage.abilities.condition.Condition; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.hint.ConditionHint; +import mage.abilities.hint.Hint; +import mage.abilities.keyword.BattalionAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.players.Player; +import mage.util.CardUtil; +import mage.watchers.Watcher; + +import java.util.*; + +/** + * @author TheElk801 + */ +public final class BorosStrikeCaptain extends CardImpl { + + public BorosStrikeCaptain(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R/W}{R/W}"); + + this.subtype.add(SubType.MINOTAUR); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Battalion -- Whenever Boros Strike-Captain and at least two other creatures attack, exile the top card of your library. During any turn you attacked with three or more creatures, you may play that card. + this.addAbility(new BattalionAbility(new BorosStrikeCaptainEffect()) + .addHint(BorosStrikeCaptainCondition.getHint()), new BorosStrikeCaptainWatcher()); + } + + private BorosStrikeCaptain(final BorosStrikeCaptain card) { + super(card); + } + + @Override + public BorosStrikeCaptain copy() { + return new BorosStrikeCaptain(this); + } +} + +class BorosStrikeCaptainEffect extends OneShotEffect { + + BorosStrikeCaptainEffect() { + super(Outcome.Benefit); + staticText = "exile the top card of your library. During any turn you attacked " + + "with three or more creatures, you may play that card"; + } + + private BorosStrikeCaptainEffect(final BorosStrikeCaptainEffect effect) { + super(effect); + } + + @Override + public BorosStrikeCaptainEffect copy() { + return new BorosStrikeCaptainEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + Card card = player.getLibrary().getFromTop(game); + if (card == null) { + return false; + } + player.moveCards(card, Zone.EXILED, source, game); + CardUtil.makeCardPlayable( + game, source, card, false, Duration.Custom, false, + player.getId(), BorosStrikeCaptainCondition.instance + ); + return true; + } +} + +enum BorosStrikeCaptainCondition implements Condition { + instance; + private static final Hint hint = new ConditionHint(instance); + + public static Hint getHint() { + return hint; + } + + @Override + public boolean apply(Game game, Ability source) { + return BorosStrikeCaptainWatcher.checkPlayer(game, source); + } + + @Override + public String toString() { + return "you attacked with three or more creatures this turn"; + } +} + +class BorosStrikeCaptainWatcher extends Watcher { + + private final Map> map = new HashMap<>(); + + BorosStrikeCaptainWatcher() { + super(WatcherScope.GAME); + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() != GameEvent.EventType.ATTACKER_DECLARED) { + return; + } + Optional.ofNullable(event) + .map(GameEvent::getTargetId) + .map(game::getPermanent) + .ifPresent(permanent -> map + .computeIfAbsent(permanent.getControllerId(), x -> new HashSet<>()) + .add(new MageObjectReference(permanent, game))); + + } + + @Override + public void reset() { + super.reset(); + map.clear(); + } + + static boolean checkPlayer(Game game, Ability source) { + return game + .getState() + .getWatcher(BorosStrikeCaptainWatcher.class) + .map + .getOrDefault(source.getControllerId(), Collections.emptySet()) + .size() >= 3; + } +} diff --git a/Mage.Sets/src/mage/cards/b/BoxingRing.java b/Mage.Sets/src/mage/cards/b/BoxingRing.java index 84ffb7d9453..9c9fbb84a4a 100644 --- a/Mage.Sets/src/mage/cards/b/BoxingRing.java +++ b/Mage.Sets/src/mage/cards/b/BoxingRing.java @@ -14,7 +14,6 @@ import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.FilterPermanent; import mage.filter.StaticFilters; -import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.ObjectSourcePlayer; import mage.filter.predicate.ObjectSourcePlayerPredicate; @@ -23,10 +22,10 @@ import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.game.permanent.token.TreasureToken; import mage.target.TargetPermanent; +import mage.util.CardUtil; import mage.watchers.Watcher; import java.util.HashSet; -import java.util.Objects; import java.util.Set; import java.util.UUID; @@ -75,19 +74,11 @@ enum BoxingRingPredicate implements ObjectSourcePlayerPredicate { @Override public boolean apply(ObjectSourcePlayer input, Game game) { - return input - .getObject() - .getManaValue() - == input - .getSource() - .getEffects() - .stream() - .map(effect -> effect.getValue("permanentEnteringBattlefield")) - .map(Permanent.class::cast) - .filter(Objects::nonNull) + return CardUtil + .getEffectValueFromAbility(input.getSource(), "permanentEnteringBattlefield", Permanent.class) .map(MageObject::getManaValue) - .findFirst() - .orElse(-1); + .filter(x -> x == input.getObject().getManaValue()) + .isPresent(); } } diff --git a/Mage.Sets/src/mage/cards/c/CausticWasps.java b/Mage.Sets/src/mage/cards/c/CausticWasps.java index b7b6fb7f341..cf2c5bf75e7 100644 --- a/Mage.Sets/src/mage/cards/c/CausticWasps.java +++ b/Mage.Sets/src/mage/cards/c/CausticWasps.java @@ -12,7 +12,7 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.filter.common.FilterArtifactPermanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -37,7 +37,7 @@ public final class CausticWasps extends CardImpl { // Whenever Caustic Wasps deals combat damage to a player, you may destroy target artifact that player controls. Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DestroyTargetEffect(), true, true); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/c/ClementTheWorrywort.java b/Mage.Sets/src/mage/cards/c/ClementTheWorrywort.java index baf0b1530ae..558cfab74e0 100644 --- a/Mage.Sets/src/mage/cards/c/ClementTheWorrywort.java +++ b/Mage.Sets/src/mage/cards/c/ClementTheWorrywort.java @@ -15,30 +15,38 @@ import mage.abilities.mana.builder.ConditionalManaBuilder; import mage.abilities.mana.conditional.CreatureCastManaCondition; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.SuperType; import mage.filter.Filter; import mage.filter.FilterPermanent; import mage.filter.StaticFilters; import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.mageobject.ManaValuePredicate; +import mage.filter.predicate.ObjectSourcePlayer; +import mage.filter.predicate.ObjectSourcePlayerPredicate; import mage.game.Game; -import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.target.TargetPermanent; +import mage.util.CardUtil; import java.util.UUID; /** - * * @author earchip94 */ public final class ClementTheWorrywort extends CardImpl { + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("creature you control with lesser mana value"); private static final FilterPermanent frogFilter = new FilterPermanent(SubType.FROG, "Frogs"); + static { + filter.add(ClementTheWorrywortPredicate.instance); + } + public ClementTheWorrywort(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}{U}"); - + this.supertype.add(SuperType.LEGENDARY); this.subtype.add(SubType.FROG); this.subtype.add(SubType.DRUID); @@ -49,12 +57,16 @@ public final class ClementTheWorrywort extends CardImpl { this.addAbility(VigilanceAbility.getInstance()); // Whenever Clement, the Worrywort or another creature you control enters, return up to one target creature you control with lesser mana value to its owner's hand. - this.addAbility(new ClementTheWorrywortTriggeredAbility()); + Ability ability = new EntersBattlefieldThisOrAnotherTriggeredAbility( + new ReturnToHandTargetEffect(), StaticFilters.FILTER_CONTROLLED_CREATURE, false, false + ); + ability.addTarget(new TargetPermanent(0, 1, filter)); + this.addAbility(ability); // Frogs you control have "{T}: Add {G} or {U}. Spend this mana only to cast a creature spell." Ability gMana = new ConditionalColoredManaAbility(new TapSourceCost(), Mana.GreenMana(1), new ClementTheWorrywortManaBuilder()); Ability bMana = new ConditionalColoredManaAbility(new TapSourceCost(), Mana.BlueMana(1), new ClementTheWorrywortManaBuilder()); - Ability ability = new SimpleStaticAbility( + ability = new SimpleStaticAbility( new GainAbilityControlledEffect(gMana, Duration.WhileOnBattlefield, frogFilter, false) .setText("Frogs you control have \"{T}: Add {G} or {U}.") ); @@ -75,40 +87,17 @@ public final class ClementTheWorrywort extends CardImpl { } } -class ClementTheWorrywortTriggeredAbility extends EntersBattlefieldThisOrAnotherTriggeredAbility { - - ClementTheWorrywortTriggeredAbility() { - super(new ReturnToHandTargetEffect().setText("return up to one target creature you control with lesser mana value to its owner's hand"), - StaticFilters.FILTER_PERMANENT_CREATURE, false, true); - } - - ClementTheWorrywortTriggeredAbility(final ClementTheWorrywortTriggeredAbility ability) { - super(ability); - } +enum ClementTheWorrywortPredicate implements ObjectSourcePlayerPredicate { + instance; @Override - public ClementTheWorrywortTriggeredAbility copy() { - return new ClementTheWorrywortTriggeredAbility(this); + public boolean apply(ObjectSourcePlayer input, Game game) { + return CardUtil.getEffectValueFromAbility( + input.getSource(), "permanentEnteringBattlefield", Permanent.class + ) + .filter(permanent -> input.getObject().getManaValue() < permanent.getManaValue()) + .isPresent(); } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (super.checkTrigger(event, game)) { - this.getTargets().clear(); - Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent == null) { - return false; - } - int mv = permanent.getManaValue(); - FilterControlledCreaturePermanent filter = - new FilterControlledCreaturePermanent("creature you control with mana value " + (mv - 1) + " or less"); - filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, mv)); - this.addTarget(new TargetPermanent(0,1, filter)); - return true; - } - return false; - } - } class ClementTheWorrywortConditionalMana extends ConditionalMana { diff --git a/Mage.Sets/src/mage/cards/c/ComboAttack.java b/Mage.Sets/src/mage/cards/c/ComboAttack.java index b426489e07b..2b17b496161 100644 --- a/Mage.Sets/src/mage/cards/c/ComboAttack.java +++ b/Mage.Sets/src/mage/cards/c/ComboAttack.java @@ -55,20 +55,21 @@ class ComboAttackEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - if (source.getTargets().size() < 2 || source.getTargets().get(0).getTargets().size() < 2) { + if (source.getTargets().size() < 2) { return false; } - Permanent permanent1 = game.getPermanent(source.getTargets().get(0).getTargets().get(0)); - Permanent permanent2 = game.getPermanent(source.getTargets().get(0).getTargets().get(1)); Permanent permanent3 = game.getPermanent(source.getTargets().get(1).getFirstTarget()); if (permanent3 == null) { return false; } - if (permanent1 != null) { - permanent3.damage(permanent1.getPower().getValue(), permanent1.getId(), source, game, false, true); - } - if (permanent2 != null) { - permanent3.damage(permanent2.getPower().getValue(), permanent2.getId(), source, game, false, true); + // You can’t cast Combo Attack without targeting two creatures your team controls. + // If one of those creatures is an illegal target as Combo Attack resolves, + // the other will still deal damage equal to its power. (2018-06-08) + for (UUID id : source.getTargets().get(0).getTargets()) { + Permanent permanent = game.getPermanent(id); + if (permanent != null) { + permanent3.damage(permanent.getPower().getValue(), permanent.getId(), source, game); + } } return true; } diff --git a/Mage.Sets/src/mage/cards/c/CommanderLiaraPortyr.java b/Mage.Sets/src/mage/cards/c/CommanderLiaraPortyr.java new file mode 100644 index 00000000000..ee037b68bc7 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CommanderLiaraPortyr.java @@ -0,0 +1,120 @@ +package mage.cards.c; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksWithCreaturesTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.cost.CostModificationEffectImpl; +import mage.cards.*; +import mage.constants.*; +import mage.game.Game; +import mage.game.stack.Spell; +import mage.players.Player; +import mage.util.CardUtil; + +import java.util.Optional; +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class CommanderLiaraPortyr extends CardImpl { + + public CommanderLiaraPortyr(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}{W}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(5); + this.toughness = new MageInt(3); + + // Whenever you attack, spells you cast from exile this turn cost {X} less to cast, where X is the number of players being attacked. Exile the top X cards of your library. Until end of turn, you may cast spells from among those exiled cards. + Ability ability = new AttacksWithCreaturesTriggeredAbility(new CommanderLiaraPortyrCostEffect(), 1); + ability.addEffect(new CommanderLiaraPortyrExileEffect()); + this.addAbility(ability); + } + + private CommanderLiaraPortyr(final CommanderLiaraPortyr card) { + super(card); + } + + @Override + public CommanderLiaraPortyr copy() { + return new CommanderLiaraPortyr(this); + } +} + +class CommanderLiaraPortyrCostEffect extends CostModificationEffectImpl { + + CommanderLiaraPortyrCostEffect() { + super(Duration.EndOfTurn, Outcome.Benefit, CostModificationType.REDUCE_COST); + staticText = "spells you cast from exile this turn cost {X} less to cast, " + + "where X is the number of players being attacked"; + } + + private CommanderLiaraPortyrCostEffect(final CommanderLiaraPortyrCostEffect effect) { + super(effect); + } + + @Override + public CommanderLiaraPortyrCostEffect copy() { + return new CommanderLiaraPortyrCostEffect(this); + } + + @Override + public boolean apply(Game game, Ability source, Ability abilityToModify) { + Optional.ofNullable((Integer) getValue(AttacksWithCreaturesTriggeredAbility.VALUEKEY_NUMBER_DEFENDING_PLAYERS)) + .ifPresent(i -> CardUtil.reduceCost(abilityToModify, 1)); + return true; + } + + @Override + public boolean applies(Ability abilityToModify, Ability source, Game game) { + return Optional + .ofNullable(abilityToModify) + .map(Ability::getSourceId) + .map(game::getSpell) + .map(Spell::getFromZone) + .filter(Zone.EXILED::match) + .isPresent(); + } +} + +class CommanderLiaraPortyrExileEffect extends OneShotEffect { + + CommanderLiaraPortyrExileEffect() { + super(Outcome.Benefit); + staticText = "Exile the top X cards of your library. Until end of turn, " + + "you may cast spells from among those exiled cards"; + } + + private CommanderLiaraPortyrExileEffect(final CommanderLiaraPortyrExileEffect effect) { + super(effect); + } + + @Override + public CommanderLiaraPortyrExileEffect copy() { + return new CommanderLiaraPortyrExileEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + int count = Optional.ofNullable((Integer) getValue( + AttacksWithCreaturesTriggeredAbility.VALUEKEY_NUMBER_DEFENDING_PLAYERS + )).orElse(0); + if (player == null || count < 1) { + return true; + } + Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, count)); + if (cards.isEmpty()) { + return false; + } + player.moveCards(cards, Zone.EXILED, source, game); + for (Card card : cards.getCards(game)) { + CardUtil.makeCardPlayable(game, source, card, true, Duration.EndOfTurn, false); + } + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/c/CommandoRaid.java b/Mage.Sets/src/mage/cards/c/CommandoRaid.java index be0b73f7b6c..c0d604217ac 100644 --- a/Mage.Sets/src/mage/cards/c/CommandoRaid.java +++ b/Mage.Sets/src/mage/cards/c/CommandoRaid.java @@ -12,7 +12,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -29,7 +29,7 @@ public final class CommandoRaid extends CardImpl { effect.setText("have it deal damage equal to its power to target creature that player controls."); Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(effect, true, true); ability.addTarget(new TargetCreaturePermanent()); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.getSpellAbility().addEffect(new GainAbilityTargetEffect( ability, Duration.EndOfTurn, diff --git a/Mage.Sets/src/mage/cards/c/CovetousElegy.java b/Mage.Sets/src/mage/cards/c/CovetousElegy.java new file mode 100644 index 00000000000..9d088f7a114 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CovetousElegy.java @@ -0,0 +1,92 @@ +package mage.cards.c; + +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.hint.Hint; +import mage.abilities.hint.ValueHint; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.TreasureToken; +import mage.players.Player; +import mage.target.TargetPermanent; +import mage.target.common.TargetControlledCreaturePermanent; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class CovetousElegy extends CardImpl { + + private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE); + private static final Hint hint = new ValueHint("Creatures your opponents control", xValue); + + public CovetousElegy(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{W}{B}"); + + // Each player chooses up to two creatures they control, then sacrifices the rest. Then you create a tapped Treasure token for each creature your opponents control. + this.getSpellAbility().addEffect(new CovetousElegyEffect()); + this.getSpellAbility().addEffect(new CreateTokenEffect(new TreasureToken(), xValue).concatBy("Then")); + this.getSpellAbility().addHint(hint); + } + + private CovetousElegy(final CovetousElegy card) { + super(card); + } + + @Override + public CovetousElegy copy() { + return new CovetousElegy(this); + } +} + +class CovetousElegyEffect extends OneShotEffect { + + CovetousElegyEffect() { + super(Outcome.Benefit); + staticText = "each player chooses up to two creatures they control, then sacrifices the rest"; + } + + private CovetousElegyEffect(final CovetousElegyEffect effect) { + super(effect); + } + + @Override + public CovetousElegyEffect copy() { + return new CovetousElegyEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Set creatures = new HashSet<>(); + for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) { + Player player = game.getPlayer(playerId); + if (player == null) { + continue; + } + TargetPermanent target = new TargetControlledCreaturePermanent(0, 2); + target.withNotTarget(true); + target.withChooseHint("the rest will be sacrificed"); + player.choose(outcome, target, source, game); + creatures.addAll(target.getTargets()); + } + for (Permanent permanent : game.getBattlefield().getActivePermanents( + StaticFilters.FILTER_PERMANENT_CREATURE, source.getControllerId(), source, game + )) { + if (!creatures.contains(permanent.getId())) { + permanent.sacrifice(source, game); + } + } + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/d/DawningPurist.java b/Mage.Sets/src/mage/cards/d/DawningPurist.java index b41e8c8ecf2..25fa10758d7 100644 --- a/Mage.Sets/src/mage/cards/d/DawningPurist.java +++ b/Mage.Sets/src/mage/cards/d/DawningPurist.java @@ -13,7 +13,7 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.filter.common.FilterEnchantmentPermanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -36,7 +36,7 @@ public final class DawningPurist extends CardImpl { // Whenever Dawning Purist deals combat damage to a player, you may destroy target enchantment that player controls. Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DestroyTargetEffect(), true, true); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); // Morph {1}{W} diff --git a/Mage.Sets/src/mage/cards/d/DeluxeDragster.java b/Mage.Sets/src/mage/cards/d/DeluxeDragster.java index eba0ecfca95..b5100fa2b03 100644 --- a/Mage.Sets/src/mage/cards/d/DeluxeDragster.java +++ b/Mage.Sets/src/mage/cards/d/DeluxeDragster.java @@ -20,7 +20,7 @@ import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterInstantOrSorceryCard; import mage.filter.predicate.Predicates; import mage.target.common.TargetCardInGraveyard; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -54,7 +54,7 @@ public final class DeluxeDragster extends CardImpl { + ThatSpellGraveyardExileReplacementEffect.RULE_A); Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(effect, false, true); ability.addTarget(new TargetCardInGraveyard(filterCard)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster(true)); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster(true)); this.addAbility(ability); // Crew 2 diff --git a/Mage.Sets/src/mage/cards/d/DranaAndLinvala.java b/Mage.Sets/src/mage/cards/d/DranaAndLinvala.java index 021f6aca581..bf8c376bb13 100644 --- a/Mage.Sets/src/mage/cards/d/DranaAndLinvala.java +++ b/Mage.Sets/src/mage/cards/d/DranaAndLinvala.java @@ -162,12 +162,10 @@ class DranaAndLinvalaManaEffect extends AsThoughEffectImpl implements AsThoughMa return CardUtil .getMainCardId(game, objectId) .equals(source.getSourceId()) - && affectedAbility - .getEffects() - .stream() - .map(effect -> effect.getValue("dranaLinvalaFlag")) - .filter(Boolean.class::isInstance) - .anyMatch(Boolean.class::cast) + && CardUtil + .getEffectValueFromAbility( + affectedAbility, "dranaLinvalaFlag", Boolean.class + ).orElse(false) && source.isControlledBy(playerId); } diff --git a/Mage.Sets/src/mage/cards/d/DreadmawsIre.java b/Mage.Sets/src/mage/cards/d/DreadmawsIre.java index c5703f64d9d..01c34fc336b 100644 --- a/Mage.Sets/src/mage/cards/d/DreadmawsIre.java +++ b/Mage.Sets/src/mage/cards/d/DreadmawsIre.java @@ -15,7 +15,7 @@ import mage.constants.CardType; import mage.filter.common.FilterArtifactPermanent; import mage.target.TargetPermanent; import mage.target.common.TargetAttackingCreature; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -41,7 +41,7 @@ public final class DreadmawsIre extends CardImpl { effect.setText("have it deal damage equal to its power to target creature that player controls."); Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DestroyTargetEffect(), false, true); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.getSpellAbility().addEffect(new GainAbilityTargetEffect(ability) .setText("and \"Whenever this creature deals combat damage to a player, destroy target artifact that player controls.\"")); diff --git a/Mage.Sets/src/mage/cards/d/DrizztDoUrden.java b/Mage.Sets/src/mage/cards/d/DrizztDoUrden.java index 4904c140f5f..ec84d0ca805 100644 --- a/Mage.Sets/src/mage/cards/d/DrizztDoUrden.java +++ b/Mage.Sets/src/mage/cards/d/DrizztDoUrden.java @@ -1,6 +1,7 @@ package mage.cards.d; import mage.MageInt; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; @@ -19,6 +20,7 @@ import mage.counters.CounterType; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.GuenhwyvarToken; +import mage.util.CardUtil; import java.util.UUID; @@ -66,15 +68,13 @@ enum DrizztDoUrdenCondition implements Condition { @Override public boolean apply(Game game, Ability source) { Permanent sourcePermanent = source.getSourcePermanentOrLKI(game); - Permanent creatureDied = (Permanent) source - .getEffects() - .stream() - .map(effect -> effect.getValue("creatureDied")) - .findFirst() - .orElse(null); return sourcePermanent != null - && creatureDied != null - && creatureDied.getPower().getValue() > sourcePermanent.getPower().getValue(); + && CardUtil + .getEffectValueFromAbility(source, "creatureDied", Permanent.class) + .map(MageObject::getPower) + .map(MageInt::getValue) + .filter(x -> sourcePermanent.getPower().getValue() < x) + .isPresent(); } } diff --git a/Mage.Sets/src/mage/cards/e/EshkiTemursRoar.java b/Mage.Sets/src/mage/cards/e/EshkiTemursRoar.java index 2e8c907d1ef..ca711ba0931 100644 --- a/Mage.Sets/src/mage/cards/e/EshkiTemursRoar.java +++ b/Mage.Sets/src/mage/cards/e/EshkiTemursRoar.java @@ -75,15 +75,11 @@ enum EshkiTemursRoarCondition implements Condition { @Override public boolean apply(Game game, Ability source) { - return CardUtil.castStream( - source.getEffects() - .stream() - .map(effect -> effect.getValue("spellCast")), - Spell.class - ) - .findFirst() + return CardUtil + .getEffectValueFromAbility(source, "spellCast", Spell.class) .map(Spell::getPower) .map(MageInt::getValue) - .orElse(0) >= amount; + .filter(x -> x >= amount) + .isPresent(); } } diff --git a/Mage.Sets/src/mage/cards/e/EtrataTheSilencer.java b/Mage.Sets/src/mage/cards/e/EtrataTheSilencer.java index 849f43f2213..58f5cad072c 100644 --- a/Mage.Sets/src/mage/cards/e/EtrataTheSilencer.java +++ b/Mage.Sets/src/mage/cards/e/EtrataTheSilencer.java @@ -18,7 +18,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -44,7 +44,7 @@ public final class EtrataTheSilencer extends CardImpl { // Whenever Etrata deals combat damage to a player, exile target creature that player controls and put a hit counter on that card. That player loses the game if they own three or more exiled card with hit counters on them. Etrata's owner shuffles Etrata into their library. Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new EtrataTheSilencerEffect(), false, true); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/f/FaridehDevilsChosen.java b/Mage.Sets/src/mage/cards/f/FaridehDevilsChosen.java index f9ff066ec65..73642c06f44 100644 --- a/Mage.Sets/src/mage/cards/f/FaridehDevilsChosen.java +++ b/Mage.Sets/src/mage/cards/f/FaridehDevilsChosen.java @@ -16,8 +16,8 @@ import mage.constants.Duration; import mage.constants.SubType; import mage.constants.SuperType; import mage.game.Game; +import mage.util.CardUtil; -import java.util.Objects; import java.util.UUID; /** @@ -65,12 +65,9 @@ enum FaridehDevilsChosenCondition implements Condition { @Override public boolean apply(Game game, Ability source) { - return source - .getEffects() - .stream() - .map(effect -> effect.getValue("maxDieRoll")) - .filter(Objects::nonNull) - .mapToInt(Integer.class::cast) - .anyMatch(x -> x >= 10); + return CardUtil + .getEffectValueFromAbility(source, "maxDieRoll", Integer.class) + .filter(x -> x >= 10) + .isPresent(); } } diff --git a/Mage.Sets/src/mage/cards/f/FuriousSpinesplitter.java b/Mage.Sets/src/mage/cards/f/FuriousSpinesplitter.java new file mode 100644 index 00000000000..bfae9505ed1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FuriousSpinesplitter.java @@ -0,0 +1,82 @@ +package mage.cards.f; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.counters.CounterType; +import mage.game.Game; +import mage.watchers.common.AmountOfDamageAPlayerReceivedThisTurnWatcher; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class FuriousSpinesplitter extends CardImpl { + + public FuriousSpinesplitter(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R/G}{R/G}"); + + this.subtype.add(SubType.OGRE); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // At the beginning of your end step, put a +1/+1 counter on Furious Spinesplitter for each opponent that was dealt damage this turn. + this.addAbility(new BeginningOfEndStepTriggeredAbility(new AddCountersSourceEffect( + CounterType.P1P1.createInstance(), FuriousSpinesplitterValue.instance + )), new AmountOfDamageAPlayerReceivedThisTurnWatcher()); + } + + private FuriousSpinesplitter(final FuriousSpinesplitter card) { + super(card); + } + + @Override + public FuriousSpinesplitter copy() { + return new FuriousSpinesplitter(this); + } +} + +enum FuriousSpinesplitterValue implements DynamicValue { + instance; + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + return game + .getOpponents(sourceAbility.getControllerId()) + .stream() + .map(game + .getState() + .getWatcher(AmountOfDamageAPlayerReceivedThisTurnWatcher.class) + ::getAmountOfDamageReceivedThisTurn) + .mapToInt(x -> Math.min(x, 1)) + .sum(); + } + + @Override + public FuriousSpinesplitterValue copy() { + return this; + } + + @Override + public String getMessage() { + return "opponent that was dealt damage this turn"; + } + + @Override + public String toString() { + return "1"; + } +} diff --git a/Mage.Sets/src/mage/cards/h/HammerOfRuin.java b/Mage.Sets/src/mage/cards/h/HammerOfRuin.java index 85331db5be1..9ceb1aecafc 100644 --- a/Mage.Sets/src/mage/cards/h/HammerOfRuin.java +++ b/Mage.Sets/src/mage/cards/h/HammerOfRuin.java @@ -16,7 +16,7 @@ import mage.constants.Outcome; import mage.constants.SubType; import mage.filter.FilterPermanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -38,7 +38,7 @@ public final class HammerOfRuin extends CardImpl { // Whenever equipped creature deals combat damage to a player, you may destroy target Equipment that player controls. Ability ability = new DealsDamageToAPlayerAttachedTriggeredAbility(new DestroyTargetEffect(), "equipped creature", true, true); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); // Equip {2} diff --git a/Mage.Sets/src/mage/cards/h/HammerheadTyrant.java b/Mage.Sets/src/mage/cards/h/HammerheadTyrant.java index 0e10903c3a9..eab93495e3e 100644 --- a/Mage.Sets/src/mage/cards/h/HammerheadTyrant.java +++ b/Mage.Sets/src/mage/cards/h/HammerheadTyrant.java @@ -70,19 +70,10 @@ enum HammerheadTyrantPredicate implements ObjectSourcePlayerPredicate @Override public boolean apply(ObjectSourcePlayer input, Game game) { - return input - .getObject() - .getManaValue() - <= CardUtil - .castStream( - input.getSource() - .getEffects() - .stream() - .map(effect -> effect.getValue("spellCast")), - Spell.class - ) - .findFirst() + return CardUtil + .getEffectValueFromAbility(input.getSource(), "spellCast", Spell.class) .map(Spell::getManaValue) - .orElse(-1); + .filter(x -> x >= input.getObject().getManaValue()) + .isPresent(); } } diff --git a/Mage.Sets/src/mage/cards/i/InkEyesServantOfOni.java b/Mage.Sets/src/mage/cards/i/InkEyesServantOfOni.java index d9ae50f79ff..d2c6655563d 100644 --- a/Mage.Sets/src/mage/cards/i/InkEyesServantOfOni.java +++ b/Mage.Sets/src/mage/cards/i/InkEyesServantOfOni.java @@ -13,10 +13,9 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.SuperType; -import mage.constants.Zone; import mage.filter.common.FilterCreatureCard; import mage.target.common.TargetCardInGraveyard; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -43,7 +42,7 @@ public final class InkEyesServantOfOni extends CardImpl { // Whenever Ink-Eyes, Servant of Oni deals combat damage to a player, you may put target creature card from that player's graveyard onto the battlefield under your control. Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect(), true, true); ability.addTarget(new TargetCardInGraveyard(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster(true)); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster(true)); this.addAbility(ability); // {1}{B}: Regenerate Ink-Eyes. diff --git a/Mage.Sets/src/mage/cards/j/JensonCarthalionDruidExile.java b/Mage.Sets/src/mage/cards/j/JensonCarthalionDruidExile.java index f5da11bd7c5..c78364cd08b 100644 --- a/Mage.Sets/src/mage/cards/j/JensonCarthalionDruidExile.java +++ b/Mage.Sets/src/mage/cards/j/JensonCarthalionDruidExile.java @@ -2,6 +2,7 @@ package mage.cards.j; import mage.MageInt; import mage.Mana; +import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.condition.Condition; @@ -23,7 +24,6 @@ import mage.game.permanent.token.AngelVigilanceToken; import mage.game.stack.Spell; import mage.util.CardUtil; -import java.util.Objects; import java.util.UUID; /** @@ -72,15 +72,12 @@ enum JensonCarthalionDruidExileCondition implements Condition { @Override public boolean apply(Game game, Ability source) { - return CardUtil.castStream( - source.getEffects() - .stream() - .map(effect -> effect.getValue("spellCast")), - Spell.class - ).findAny() - .filter(Objects::nonNull) - .map(spell -> spell.getColor(game).getColorCount()) - .orElse(0) >= 5; + return CardUtil + .getEffectValueFromAbility(source, "spellCast", Spell.class) + .map(spell -> spell.getColor(game)) + .map(ObjectColor::getColorCount) + .filter(x -> x >= 5) + .isPresent(); } @Override diff --git a/Mage.Sets/src/mage/cards/k/KarakykGuardian.java b/Mage.Sets/src/mage/cards/k/KarakykGuardian.java index 6fd569725a6..01151692af5 100644 --- a/Mage.Sets/src/mage/cards/k/KarakykGuardian.java +++ b/Mage.Sets/src/mage/cards/k/KarakykGuardian.java @@ -1,10 +1,8 @@ package mage.cards.k; import mage.MageInt; -import mage.MageObjectReference; -import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.condition.Condition; +import mage.abilities.condition.common.SourceHasntDealtDamageThisGameCondition; import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.FlyingAbility; @@ -15,14 +13,8 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.WatcherScope; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.watchers.Watcher; +import mage.watchers.common.DealtDamageThisGameWatcher; -import java.util.HashSet; -import java.util.Set; import java.util.UUID; /** @@ -49,8 +41,9 @@ public final class KarakykGuardian extends CardImpl { // This creature has hexproof if it hasn't dealt damage yet. this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( new GainAbilitySourceEffect(HexproofAbility.getInstance()), - KarakykGuardianCondition.instance, "{this} has hexproof if it hasn't dealt damage yet" - )), new KarakykGuardianWatcher()); + SourceHasntDealtDamageThisGameCondition.instance, + "{this} has hexproof if it hasn't dealt damage yet" + )).addHint(SourceHasntDealtDamageThisGameCondition.getHint()), new DealtDamageThisGameWatcher()); } private KarakykGuardian(final KarakykGuardian card) { @@ -62,49 +55,3 @@ public final class KarakykGuardian extends CardImpl { return new KarakykGuardian(this); } } - -enum KarakykGuardianCondition implements Condition { - - instance; - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getSourceId()); - KarakykGuardianWatcher watcher = game.getState().getWatcher(KarakykGuardianWatcher.class); - return permanent != null && !watcher.getDamagers().contains(new MageObjectReference(permanent, game)); - } - - @Override - public String toString() { - return "{this} hasn't dealt damage yet"; - } - -} - -class KarakykGuardianWatcher extends Watcher { - - private final Set damagers = new HashSet<>(); - - public KarakykGuardianWatcher() { - super(WatcherScope.GAME); - } - - @Override - public void watch(GameEvent event, Game game) { - switch (event.getType()) { - case DAMAGED_PERMANENT: - case DAMAGED_PLAYER: - break; - default: - return; - } - Permanent permanent = game.getPermanent(event.getSourceId()); - if (permanent != null) { - damagers.add(new MageObjectReference(permanent, game)); - } - } - - public Set getDamagers() { - return damagers; - } -} diff --git a/Mage.Sets/src/mage/cards/l/LatullasOrders.java b/Mage.Sets/src/mage/cards/l/LatullasOrders.java index c3ca0307682..3e274506c02 100644 --- a/Mage.Sets/src/mage/cards/l/LatullasOrders.java +++ b/Mage.Sets/src/mage/cards/l/LatullasOrders.java @@ -15,7 +15,7 @@ import mage.constants.SubType; import mage.filter.common.FilterArtifactPermanent; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -45,7 +45,7 @@ public final class LatullasOrders extends CardImpl { new DestroyTargetEffect(), "enchanted creature", true, true ).setTriggerPhrase("Whenever enchanted creature deals combat damage to defending player, "); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/l/LightwielderPaladin.java b/Mage.Sets/src/mage/cards/l/LightwielderPaladin.java index 00d395d0cbd..3203a1ebd15 100644 --- a/Mage.Sets/src/mage/cards/l/LightwielderPaladin.java +++ b/Mage.Sets/src/mage/cards/l/LightwielderPaladin.java @@ -15,7 +15,7 @@ import mage.filter.FilterPermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ColorPredicate; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -46,7 +46,7 @@ public final class LightwielderPaladin extends CardImpl { // Whenever Lightwielder Paladin deals combat damage to a player, you may exile target black or red permanent that player controls. Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new ExileTargetEffect(), true, true); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/m/MemoryVampire.java b/Mage.Sets/src/mage/cards/m/MemoryVampire.java new file mode 100644 index 00000000000..d1925c1c47f --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MemoryVampire.java @@ -0,0 +1,108 @@ +package mage.cards.m; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.delayed.ReflexiveTriggeredAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.common.CollectEvidenceCost; +import mage.abilities.dynamicvalue.common.SavedDamageValue; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.MayCastTargetCardEffect; +import mage.abilities.effects.common.MillCardsTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.CastManaAdjustment; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.common.FilterNonlandCard; +import mage.filter.predicate.card.OwnerIdPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetPlayer; +import mage.target.common.TargetCardInGraveyard; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class MemoryVampire extends CardImpl { + + public MemoryVampire(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}{B}"); + + this.subtype.add(SubType.VAMPIRE); + this.subtype.add(SubType.DETECTIVE); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever Memory Vampire deals combat damage to a player, any number of target players each mill that many cards. Then you may collect evidence 9. When you do, you may cast target nonland card from defending player's graveyard without paying its mana cost. + Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility( + new MillCardsTargetEffect(SavedDamageValue.MANY) + .setText("any number of target players each mill that many cards") + ); + ability.addEffect(new MemoryVampireEffect()); + ability.addTarget(new TargetPlayer(0, Integer.MAX_VALUE, false)); + this.addAbility(ability); + } + + private MemoryVampire(final MemoryVampire card) { + super(card); + } + + @Override + public MemoryVampire copy() { + return new MemoryVampire(this); + } +} + +class MemoryVampireEffect extends OneShotEffect { + + MemoryVampireEffect() { + super(Outcome.Benefit); + staticText = "Then you may collect evidence 9. When you do, you may cast target " + + "nonland card from defending player's graveyard without paying its mana cost"; + } + + private MemoryVampireEffect(final MemoryVampireEffect effect) { + super(effect); + } + + @Override + public MemoryVampireEffect copy() { + return new MemoryVampireEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + Cost cost = new CollectEvidenceCost(9); + if (!cost.canPay(source, source, source.getControllerId(), game) + || !player.chooseUse(outcome, "Collect evidence 9?", source, game) + || !cost.pay(source, game, source, source.getControllerId(), true)) { + return false; + } + UUID defenderId = (UUID) getValue("damagedPlayer"); + if (defenderId == null) { + return true; + } + ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility( + new MayCastTargetCardEffect(CastManaAdjustment.WITHOUT_PAYING_MANA_COST), false + ); + FilterCard filter = new FilterNonlandCard("nonland card from defending player's graveyard"); + filter.add(new OwnerIdPredicate(defenderId)); + ability.addTarget(new TargetCardInGraveyard(filter)); + game.fireReflexiveTriggeredAbility(ability, source); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/m/MistbladeShinobi.java b/Mage.Sets/src/mage/cards/m/MistbladeShinobi.java index 304042e182e..9959e14301a 100644 --- a/Mage.Sets/src/mage/cards/m/MistbladeShinobi.java +++ b/Mage.Sets/src/mage/cards/m/MistbladeShinobi.java @@ -12,7 +12,7 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.filter.common.FilterCreaturePermanent; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -38,7 +38,7 @@ public final class MistbladeShinobi extends CardImpl { // Whenever Mistblade Shinobi deals combat damage to a player, you may return target creature that player controls to its owner's hand. Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new ReturnToHandTargetEffect(), true, true); ability.addTarget(new TargetCreaturePermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/m/MordantDragon.java b/Mage.Sets/src/mage/cards/m/MordantDragon.java index d336d6a8a2f..634fc2d91ec 100644 --- a/Mage.Sets/src/mage/cards/m/MordantDragon.java +++ b/Mage.Sets/src/mage/cards/m/MordantDragon.java @@ -15,9 +15,8 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; -import mage.constants.Zone; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -45,7 +44,7 @@ public final class MordantDragon extends CardImpl { effect.setText("have it deal that much damage to target creature that player controls."); Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(effect, true, true); ability.addTarget(new TargetCreaturePermanent()); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/o/OrdruunMentor.java b/Mage.Sets/src/mage/cards/o/OrdruunMentor.java new file mode 100644 index 00000000000..a42c25b507a --- /dev/null +++ b/Mage.Sets/src/mage/cards/o/OrdruunMentor.java @@ -0,0 +1,104 @@ +package mage.cards.o; + +import mage.MageInt; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.MentorAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.ObjectSourcePlayer; +import mage.filter.predicate.ObjectSourcePlayerPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; +import mage.util.CardUtil; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class OrdruunMentor extends CardImpl { + + public OrdruunMentor(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R/W}"); + + this.subtype.add(SubType.MINOTAUR); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Mentor + this.addAbility(new MentorAbility()); + + // Whenever you attack a player, target creature that's attacking that player gains first strike until end of turn. + this.addAbility(new OrdruunMentorTriggeredAbility()); + } + + private OrdruunMentor(final OrdruunMentor card) { + super(card); + } + + @Override + public OrdruunMentor copy() { + return new OrdruunMentor(this); + } +} + +class OrdruunMentorTriggeredAbility extends TriggeredAbilityImpl { + + private enum OrdruunMentorPredicate implements ObjectSourcePlayerPredicate { + instance; + + @Override + public boolean apply(ObjectSourcePlayer input, Game game) { + return CardUtil.getEffectValueFromAbility( + input.getSource(), "playerAttacked", UUID.class + ) + .filter(uuid -> uuid.equals(game.getCombat().getDefenderId(input.getObject().getId()))) + .isPresent(); + } + } + + private static final FilterPermanent filter = new FilterCreaturePermanent("creature that's attacking that player"); + + static { + filter.add(OrdruunMentorPredicate.instance); + } + + OrdruunMentorTriggeredAbility() { + super(Zone.BATTLEFIELD, new GainAbilityTargetEffect(FirstStrikeAbility.getInstance()).setText("")); + this.setTriggerPhrase("Whenever you attack a player, "); + this.addTarget(new TargetPermanent(filter)); + } + + private OrdruunMentorTriggeredAbility(final OrdruunMentorTriggeredAbility ability) { + super(ability); + } + + @Override + public OrdruunMentorTriggeredAbility copy() { + return new OrdruunMentorTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DEFENDER_ATTACKED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (!isControlledBy(event.getPlayerId()) || game.getPlayer(event.getTargetId()) == null) { + return false; + } + this.getEffects().setValue("playerAttacked", event.getTargetId()); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/p/PalladiaMorsTheRuiner.java b/Mage.Sets/src/mage/cards/p/PalladiaMorsTheRuiner.java index 52a3f52255f..5a650a1ec43 100644 --- a/Mage.Sets/src/mage/cards/p/PalladiaMorsTheRuiner.java +++ b/Mage.Sets/src/mage/cards/p/PalladiaMorsTheRuiner.java @@ -1,13 +1,8 @@ package mage.cards.p; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; import mage.MageInt; -import mage.MageObjectReference; -import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.condition.Condition; +import mage.abilities.condition.common.SourceHasntDealtDamageThisGameCondition; import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.FlyingAbility; @@ -19,15 +14,11 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.SuperType; -import mage.constants.WatcherScope; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.watchers.Watcher; +import mage.watchers.common.DealtDamageThisGameWatcher; + +import java.util.UUID; /** - * * @author TheElk801 */ public final class PalladiaMorsTheRuiner extends CardImpl { @@ -51,13 +42,11 @@ public final class PalladiaMorsTheRuiner extends CardImpl { this.addAbility(TrampleAbility.getInstance()); // Palladia-Mors, the Ruiner has hexproof if it hasn't dealt damage yet. - this.addAbility(new SimpleStaticAbility( - new ConditionalContinuousEffect( - new GainAbilitySourceEffect(HexproofAbility.getInstance()), - PalladiaMorsTheRuinerCondition.instance, - "{this} has hexproof if it hasn't dealt damage yet" - ) - ), new PalladiaMorsTheRuinerWatcher()); + this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( + new GainAbilitySourceEffect(HexproofAbility.getInstance()), + SourceHasntDealtDamageThisGameCondition.instance, + "{this} has hexproof if it hasn't dealt damage yet" + )).addHint(SourceHasntDealtDamageThisGameCondition.getHint()), new DealtDamageThisGameWatcher()); } private PalladiaMorsTheRuiner(final PalladiaMorsTheRuiner card) { @@ -69,49 +58,3 @@ public final class PalladiaMorsTheRuiner extends CardImpl { return new PalladiaMorsTheRuiner(this); } } - -enum PalladiaMorsTheRuinerCondition implements Condition { - - instance; - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getSourceId()); - PalladiaMorsTheRuinerWatcher watcher = game.getState().getWatcher(PalladiaMorsTheRuinerWatcher.class); - return permanent != null && !watcher.getDamagers().contains(new MageObjectReference(permanent, game)); - } - - @Override - public String toString() { - return "{this} hasn't dealt damage yet"; - } - -} - -class PalladiaMorsTheRuinerWatcher extends Watcher { - - private final Set damagers = new HashSet<>(); - - public PalladiaMorsTheRuinerWatcher() { - super(WatcherScope.GAME); - } - - @Override - public void watch(GameEvent event, Game game) { - switch (event.getType()) { - case DAMAGED_PERMANENT: - case DAMAGED_PLAYER: - break; - default: - return; - } - Permanent permanent = game.getPermanent(event.getSourceId()); - if (permanent != null) { - damagers.add(new MageObjectReference(permanent, game)); - } - } - - public Set getDamagers() { - return damagers; - } -} diff --git a/Mage.Sets/src/mage/cards/p/ParapetThrasher.java b/Mage.Sets/src/mage/cards/p/ParapetThrasher.java index 8fe9ba4b29e..48725cea523 100644 --- a/Mage.Sets/src/mage/cards/p/ParapetThrasher.java +++ b/Mage.Sets/src/mage/cards/p/ParapetThrasher.java @@ -22,7 +22,7 @@ import mage.filter.common.FilterControlledPermanent; import mage.game.Game; import mage.players.Player; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; /** * @@ -49,7 +49,7 @@ public final class ParapetThrasher extends CardImpl { filter, true, true, SetTargetPointer.PLAYER, false) .setTriggerPhrase("Whenever one or more Dragons you control deal combat damage to an opponent, "); ability.addTarget(new TargetPermanent(artifactFilter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); ability.setModeTag("destroy artifact"); ability.getModes().setLimitUsageByOnce(true); diff --git a/Mage.Sets/src/mage/cards/p/PheliaExuberantShepherd.java b/Mage.Sets/src/mage/cards/p/PheliaExuberantShepherd.java index 63f6fdba3df..851b8af4e35 100644 --- a/Mage.Sets/src/mage/cards/p/PheliaExuberantShepherd.java +++ b/Mage.Sets/src/mage/cards/p/PheliaExuberantShepherd.java @@ -1,6 +1,7 @@ package mage.cards.p; import mage.MageInt; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; @@ -49,10 +50,7 @@ public final class PheliaExuberantShepherd extends CardImpl { this.addAbility(FlashAbility.getInstance()); // Whenever Phelia, Exuberant Shepherd attacks, exile up to one other target nonland permanent. At the beginning of the next end step, return that card to the battlefield under its owner's control. If it entered under your control, put a +1/+1 counter on Phelia. - Ability ability = new AttacksTriggeredAbility(new ExileTargetEffect().setToSourceExileZone(true)); - ability.addEffect(new CreateDelayedTriggeredAbilityEffect( - new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new PheliaExuberantShepherdEffect()), false - )); + Ability ability = new AttacksTriggeredAbility(new PheliaExuberantShepherdExileEffect()); ability.addTarget(new TargetPermanent(0, 1, filter)); this.addAbility(ability); } @@ -67,16 +65,55 @@ public final class PheliaExuberantShepherd extends CardImpl { } } +class PheliaExuberantShepherdExileEffect extends ExileTargetEffect { + + PheliaExuberantShepherdExileEffect() { + super(); + outcome = Outcome.Neutral; // quite contextual outcome. + staticText = "exile up to one other target nonland permanent. At the beginning of the next end step, " + + "return that card to the battlefield under its owner's control. If it entered under your control, " + + "put a +1/+1 counter on {this}."; + } + + private PheliaExuberantShepherdExileEffect(final PheliaExuberantShepherdExileEffect effect) { + super(effect); + } + + @Override + public PheliaExuberantShepherdExileEffect copy() { + return new PheliaExuberantShepherdExileEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + MageObject sourceObject = source.getSourceObject(game); + this.exileId = UUID.randomUUID(); + this.exileZone = sourceObject == null ? null : sourceObject.getIdName(); + // attempting to exile to the fresh exileId + boolean didSomething = super.apply(game, source); + // delayed trigger is created even if exiling failed. + didSomething |= new CreateDelayedTriggeredAbilityEffect( + new AtTheBeginOfNextEndStepDelayedTriggeredAbility( + new PheliaExuberantShepherdEffect(this.exileId)), false + ).apply(game, source); + return didSomething; + } +} + class PheliaExuberantShepherdEffect extends OneShotEffect { - PheliaExuberantShepherdEffect() { + private final UUID zoneId; // the exile zone's id for cards to return. + + PheliaExuberantShepherdEffect(UUID zoneId) { super(Outcome.Benefit); staticText = "return that card to the battlefield under its owner's control. " + "If it entered under your control, put a +1/+1 counter on {this}"; + this.zoneId = zoneId; } private PheliaExuberantShepherdEffect(final PheliaExuberantShepherdEffect effect) { super(effect); + this.zoneId = effect.zoneId; } @Override @@ -90,7 +127,6 @@ class PheliaExuberantShepherdEffect extends OneShotEffect { if (player == null) { return false; } - UUID zoneId = CardUtil.getExileZoneId(game, source.getSourceId(), source.getSourceObjectZoneChangeCounter()); ExileZone exileZone = game.getExile().getExileZone(zoneId); if (exileZone == null || exileZone.isEmpty()) { return false; diff --git a/Mage.Sets/src/mage/cards/p/PolisCrusher.java b/Mage.Sets/src/mage/cards/p/PolisCrusher.java index 00b0f5d917c..1b615461828 100644 --- a/Mage.Sets/src/mage/cards/p/PolisCrusher.java +++ b/Mage.Sets/src/mage/cards/p/PolisCrusher.java @@ -17,7 +17,7 @@ import mage.filter.FilterCard; import mage.filter.common.FilterEnchantmentCard; import mage.filter.common.FilterEnchantmentPermanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -52,7 +52,7 @@ public final class PolisCrusher extends CardImpl { // Whenever Polis Crusher deals combat damage to a player, if Polis Crusher is monstrous, destroy target enchantment that player controls. TriggeredAbility ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DestroyTargetEffect(), false, true); ability.addTarget(new TargetPermanent(filterPermanent)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, MonstrousCondition.instance, "Whenever {this} deals combat damage to a player, if {this} is monstrous, destroy target enchantment that player controls.")); diff --git a/Mage.Sets/src/mage/cards/q/QuestingBeast.java b/Mage.Sets/src/mage/cards/q/QuestingBeast.java index 5e8592460fa..87b9fa0c4a5 100644 --- a/Mage.Sets/src/mage/cards/q/QuestingBeast.java +++ b/Mage.Sets/src/mage/cards/q/QuestingBeast.java @@ -21,7 +21,7 @@ import mage.game.events.GameEvent; import mage.game.events.PreventDamageEvent; import mage.game.permanent.Permanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -57,7 +57,7 @@ public final class QuestingBeast extends CardImpl { // Whenever Questing Beast deals combat damage to an opponent, it deals that much damage to target planeswalker that player controls. Ability ability = new DealsDamageToOpponentTriggeredAbility(new DamageTargetEffect(SavedDamageValue.MUCH), false, true, true); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/r/Ratonhnhaketon.java b/Mage.Sets/src/mage/cards/r/Ratonhnhaketon.java new file mode 100644 index 00000000000..da46c679dc9 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/Ratonhnhaketon.java @@ -0,0 +1,152 @@ +package mage.cards.r; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.delayed.ReflexiveTriggeredAbility; +import mage.abilities.condition.common.SourceHasntDealtDamageThisGameCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.decorator.ConditionalRestrictionEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.combat.CantBeBlockedSourceEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.HexproofAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.FilterCard; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.AssassinMenaceToken; +import mage.game.permanent.token.Token; +import mage.players.Player; +import mage.target.common.TargetCardInYourGraveyard; +import mage.util.CardUtil; +import mage.watchers.common.DealtDamageThisGameWatcher; + +import java.util.Optional; +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class Ratonhnhaketon extends CardImpl { + + public Ratonhnhaketon(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}{U}{B}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.ASSASSIN); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // As long as Ratonhnhaketon hasn't dealt damage yet, it has hexproof and can't be blocked. + Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect( + new GainAbilitySourceEffect(HexproofAbility.getInstance()), + SourceHasntDealtDamageThisGameCondition.instance, + "as long as {this} hasn't dealt damage yet, it has hexproof" + )); + ability.addEffect(new ConditionalRestrictionEffect( + new CantBeBlockedSourceEffect(), + SourceHasntDealtDamageThisGameCondition.instance, + "and can't be blocked" + )); + this.addAbility(ability.addHint(SourceHasntDealtDamageThisGameCondition.getHint()), new DealtDamageThisGameWatcher()); + + // Whenever Ratonhnhaketon deals combat damage to a player, create a 1/1 black Assassin creature token with menace. When you do, return target Equipment card from your graveyard to the battlefield, then attach it to that token. + this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new RatonhnhaketonTokenEffect())); + } + + private Ratonhnhaketon(final Ratonhnhaketon card) { + super(card); + } + + @Override + public Ratonhnhaketon copy() { + return new Ratonhnhaketon(this); + } +} + +class RatonhnhaketonTokenEffect extends OneShotEffect { + + private static final FilterCard filter = new FilterCard("Equipment card from your graveyard"); + + static { + filter.add(SubType.EQUIPMENT.getPredicate()); + } + + RatonhnhaketonTokenEffect() { + super(Outcome.Benefit); + staticText = "create a 1/1 black Assassin creature token with menace. When you do, return " + + "target Equipment card from your graveyard to the battlefield, then attach it to that token"; + } + + private RatonhnhaketonTokenEffect(final RatonhnhaketonTokenEffect effect) { + super(effect); + } + + @Override + public RatonhnhaketonTokenEffect copy() { + return new RatonhnhaketonTokenEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Token token = new AssassinMenaceToken(); + token.putOntoBattlefield(1, game, source); + for (UUID tokenId : token.getLastAddedTokenIds()) { + Permanent permanent = game.getPermanent(tokenId); + if (permanent == null) { + continue; + } + ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility( + new RatonhnhaketonReturnEffect(tokenId), false + ); + ability.addTarget(new TargetCardInYourGraveyard(filter)); + game.fireReflexiveTriggeredAbility(ability, source); + } + return true; + } +} + +class RatonhnhaketonReturnEffect extends OneShotEffect { + + private final UUID tokenId; + + RatonhnhaketonReturnEffect(UUID tokenId) { + super(Outcome.Benefit); + staticText = "return target Equipment card from your graveyard to the battlefield, then attach it to that token"; + this.tokenId = tokenId; + } + + private RatonhnhaketonReturnEffect(final RatonhnhaketonReturnEffect effect) { + super(effect); + this.tokenId = effect.tokenId; + } + + @Override + public RatonhnhaketonReturnEffect copy() { + return new RatonhnhaketonReturnEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Card card = game.getCard(getTargetPointer().getFirst(game, source)); + if (player == null) { + return false; + } + player.moveCards(card, Zone.BATTLEFIELD, source, game); + Permanent permanent = CardUtil.getPermanentFromCardPutToBattlefield(card, game); + if (permanent == null) { + return false; + } + Optional.ofNullable(tokenId) + .map(game::getPermanent) + .ifPresent(p -> p.addAttachment(permanent.getId(), source, game)); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/r/ReluctantRoleModel.java b/Mage.Sets/src/mage/cards/r/ReluctantRoleModel.java new file mode 100644 index 00000000000..91e27171d9d --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/ReluctantRoleModel.java @@ -0,0 +1,95 @@ +package mage.cards.r; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.abilityword.SurvivalAbility; +import mage.abilities.common.DiesThisOrAnotherTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.counter.AddCounterChoiceSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.counters.Counter; +import mage.counters.CounterType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.permanent.CounterAnyPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ReluctantRoleModel extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledCreaturePermanent(); + + static { + filter.add(CounterAnyPredicate.instance); + } + + public ReluctantRoleModel(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SURVIVOR); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Survival -- At the beginning of your second main phase, if this creature is tapped, put a flying, lifelink, or +1/+1 counter on it. + this.addAbility(new SurvivalAbility(new AddCounterChoiceSourceEffect( + CounterType.FLYING, CounterType.LIFELINK, CounterType.P1P1 + ).setText("put a flying, lifelink, or +1/+1 counter on it"))); + + // Whenever this creature or another creature you control dies, if it had counters on it, put those counters on up to one target creature. + Ability ability = new DiesThisOrAnotherTriggeredAbility( + new ReluctantRoleModelEffect(), false, filter + ).setApplyFilterOnSource(true); + ability.addTarget(new TargetCreaturePermanent(0, 1)); + this.addAbility(ability); + } + + private ReluctantRoleModel(final ReluctantRoleModel card) { + super(card); + } + + @Override + public ReluctantRoleModel copy() { + return new ReluctantRoleModel(this); + } +} + +class ReluctantRoleModelEffect extends OneShotEffect { + + ReluctantRoleModelEffect() { + super(Outcome.Benefit); + staticText = "if it had counters on it, put those counters on up to one target creature"; + } + + private ReluctantRoleModelEffect(final ReluctantRoleModelEffect effect) { + super(effect); + } + + @Override + public ReluctantRoleModelEffect copy() { + return new ReluctantRoleModelEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = (Permanent) getValue("creatureDied"); + Permanent creature = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (permanent == null || creature == null) { + return false; + } + for (Counter counter : permanent.getCounters(game).values()) { + creature.addCounters(counter.copy(), source, game); + } + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/r/ResonanceTechnician.java b/Mage.Sets/src/mage/cards/r/ResonanceTechnician.java new file mode 100644 index 00000000000..92d8a5e82e8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/ResonanceTechnician.java @@ -0,0 +1,74 @@ +package mage.cards.r; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.common.TapVariableTargetCost; +import mage.abilities.dynamicvalue.common.GetXValue; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.keyword.InvestigateEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.constants.SubType; +import mage.filter.FilterSpell; +import mage.filter.common.FilterControlledArtifactPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.common.FilterInstantOrSorcerySpell; +import mage.filter.predicate.permanent.TappedPredicate; +import mage.target.TargetSpell; +import mage.target.targetadjustment.ManaValueTargetAdjuster; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ResonanceTechnician extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledArtifactPermanent("untapped artifacts you control"); + private static final FilterSpell filter2 = new FilterInstantOrSorcerySpell("instant or sorcery spell you control with mana value X"); + + static { + filter.add(TappedPredicate.UNTAPPED); + } + + public ResonanceTechnician(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U/R}{U/R}"); + + this.subtype.add(SubType.WEIRD); + this.subtype.add(SubType.DETECTIVE); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // When Resonance Technician enters the battlefield, you may discard a card. If you do, investigate twice. + this.addAbility(new EntersBattlefieldTriggeredAbility( + new DoIfCostPaid(new InvestigateEffect(2), new DiscardCardCost()) + )); + + // {T}, Tap X untapped artifacts you control: Copy target instant or sorcery spell you control with mana value X. You may choose new targets for the copy. + Ability ability = new SimpleActivatedAbility(new CopyTargetStackObjectEffect(), new TapSourceCost()); + ability.addCost(new TapVariableTargetCost(filter)); + ability.addTarget(new TargetSpell(filter2)); + ability.setTargetAdjuster(new ManaValueTargetAdjuster(GetXValue.instance, ComparisonType.EQUAL_TO)); + this.addAbility(ability); + } + + private ResonanceTechnician(final ResonanceTechnician card) { + super(card); + } + + @Override + public ResonanceTechnician copy() { + return new ResonanceTechnician(this); + } +} diff --git a/Mage.Sets/src/mage/cards/r/RiptideEntrancer.java b/Mage.Sets/src/mage/cards/r/RiptideEntrancer.java index 66e9db86583..aa21c7f85de 100644 --- a/Mage.Sets/src/mage/cards/r/RiptideEntrancer.java +++ b/Mage.Sets/src/mage/cards/r/RiptideEntrancer.java @@ -16,7 +16,7 @@ import mage.constants.Duration; import mage.constants.SubType; import mage.filter.common.FilterCreaturePermanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -39,7 +39,7 @@ public final class RiptideEntrancer extends CardImpl { Effect effect = new DoIfCostPaid(new GainControlTargetEffect(Duration.WhileOnBattlefield), new SacrificeSourceCost()); Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(effect, false, true); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); // Morph {U}{U} diff --git a/Mage.Sets/src/mage/cards/r/RiveteersAscendancy.java b/Mage.Sets/src/mage/cards/r/RiveteersAscendancy.java index 3876d87703f..0961a791324 100644 --- a/Mage.Sets/src/mage/cards/r/RiveteersAscendancy.java +++ b/Mage.Sets/src/mage/cards/r/RiveteersAscendancy.java @@ -16,8 +16,8 @@ import mage.filter.predicate.ObjectSourcePlayerPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetCardInYourGraveyard; +import mage.util.CardUtil; -import java.util.Objects; import java.util.UUID; /** @@ -59,18 +59,10 @@ enum RiveteersAscendancyPredicate implements ObjectSourcePlayerPredicate { @Override public boolean apply(ObjectSourcePlayer input, Game game) { - return input - .getObject() - .getManaValue() - < input - .getSource() - .getEffects() - .stream() - .map(effect -> effect.getValue("sacrificedPermanent")) - .filter(Objects::nonNull) - .map(Permanent.class::cast) - .mapToInt(MageObject::getManaValue) - .max() - .orElse(0); + return CardUtil + .getEffectValueFromAbility(input.getSource(), "sacrificedPermanent", Permanent.class) + .map(MageObject::getManaValue) + .filter(x -> input.getObject().getManaValue() < x) + .isPresent(); } } diff --git a/Mage.Sets/src/mage/cards/r/RustmouthOgre.java b/Mage.Sets/src/mage/cards/r/RustmouthOgre.java index e2b48e23a17..4707d7ef988 100644 --- a/Mage.Sets/src/mage/cards/r/RustmouthOgre.java +++ b/Mage.Sets/src/mage/cards/r/RustmouthOgre.java @@ -11,7 +11,7 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.filter.common.FilterArtifactPermanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -33,7 +33,7 @@ public final class RustmouthOgre extends CardImpl { // Whenever Rustmouth Ogre deals combat damage to a player, you may destroy target artifact that player controls. Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DestroyTargetEffect(), true, true); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/SchemaThief.java b/Mage.Sets/src/mage/cards/s/SchemaThief.java index c439e1bb4d1..6b1c81c4009 100644 --- a/Mage.Sets/src/mage/cards/s/SchemaThief.java +++ b/Mage.Sets/src/mage/cards/s/SchemaThief.java @@ -11,7 +11,7 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.filter.common.FilterArtifactPermanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -38,7 +38,7 @@ public final class SchemaThief extends CardImpl { // Whenever Schema Thief deals combat damage to a player, create a token that's a copy of target artifact that player controls. Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new CreateTokenCopyTargetEffect(), false, true); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/SchemingFence.java b/Mage.Sets/src/mage/cards/s/SchemingFence.java index ae9cff75262..a71d64c5199 100644 --- a/Mage.Sets/src/mage/cards/s/SchemingFence.java +++ b/Mage.Sets/src/mage/cards/s/SchemingFence.java @@ -19,7 +19,6 @@ import mage.target.TargetPermanent; import mage.target.common.TargetNonlandPermanent; import mage.util.CardUtil; -import java.util.Objects; import java.util.Optional; import java.util.UUID; @@ -215,12 +214,9 @@ class SchemingFenceManaEffect extends AsThoughEffectImpl implements AsThoughMana @Override public boolean applies(UUID objectId, Ability affectedAbility, Ability source, Game game, UUID playerId) { return source.isControlledBy(playerId) - && affectedAbility - .getEffects() - .stream() - .map(effect -> effect.getValue("schemingFence")) - .filter(Objects::nonNull) - .anyMatch(source.getSourceId()::equals); + && CardUtil.getEffectValueFromAbility(affectedAbility, "schemingFence", UUID.class) + .filter(source.getSourceId()::equals) + .isPresent(); } @Override diff --git a/Mage.Sets/src/mage/cards/s/ScionOfCalamity.java b/Mage.Sets/src/mage/cards/s/ScionOfCalamity.java index f22ce9b6086..f4191d15b57 100644 --- a/Mage.Sets/src/mage/cards/s/ScionOfCalamity.java +++ b/Mage.Sets/src/mage/cards/s/ScionOfCalamity.java @@ -11,7 +11,7 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.filter.common.FilterArtifactOrEnchantmentPermanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -36,7 +36,7 @@ public final class ScionOfCalamity extends CardImpl { // Whenever Scion of Calamity deals combat damage to a player, destroy target artifact or enchantment that player controls. Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DestroyTargetEffect(), false, true); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/ScionOfDarkness.java b/Mage.Sets/src/mage/cards/s/ScionOfDarkness.java index 7f6fb900001..4340d3a8624 100644 --- a/Mage.Sets/src/mage/cards/s/ScionOfDarkness.java +++ b/Mage.Sets/src/mage/cards/s/ScionOfDarkness.java @@ -14,7 +14,7 @@ import mage.constants.SubType; import mage.filter.FilterCard; import mage.filter.common.FilterCreatureCard; import mage.target.common.TargetCardInGraveyard; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -39,7 +39,7 @@ public final class ScionOfDarkness extends CardImpl { // Whenever Scion of Darkness deals combat damage to a player, you may put target creature card from that player's graveyard onto the battlefield under your control. Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect(), true, true); ability.addTarget(new TargetCardInGraveyard(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster(true)); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster(true)); this.addAbility(ability); // Cycling {3} diff --git a/Mage.Sets/src/mage/cards/s/SharpEyedRookie.java b/Mage.Sets/src/mage/cards/s/SharpEyedRookie.java index c164cb2ccb1..ac0ed0df52a 100644 --- a/Mage.Sets/src/mage/cards/s/SharpEyedRookie.java +++ b/Mage.Sets/src/mage/cards/s/SharpEyedRookie.java @@ -14,6 +14,7 @@ import mage.counters.CounterType; import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.util.CardUtil; import java.util.UUID; @@ -68,17 +69,13 @@ class SharpEyedRookieTriggeredAbility extends EntersBattlefieldAllTriggeredAbili @Override public boolean checkInterveningIfClause(Game game) { Permanent sourcePermanent = getSourcePermanentOrLKI(game); - Permanent permanentEntering = (Permanent) this - .getEffects() - .stream() - .map(effect -> effect.getValue("permanentEnteringBattlefield")) - .findFirst() - .orElse(null); return sourcePermanent != null - && permanentEntering != null && sourcePermanent.isCreature(game) - && permanentEntering.isCreature(game) - && (permanentEntering.getPower().getValue() > sourcePermanent.getPower().getValue() - || permanentEntering.getToughness().getValue() > sourcePermanent.getToughness().getValue()); + && CardUtil + .getEffectValueFromAbility(this, "permanentEnteringBattlefield", Permanent.class) + .filter(permanent -> permanent.isCreature(game)) + .filter(permanent -> sourcePermanent.getPower().getValue() < permanent.getPower().getValue() + || sourcePermanent.getToughness().getValue() < permanent.getToughness().getValue()) + .isPresent(); } } diff --git a/Mage.Sets/src/mage/cards/s/SigilOfSleep.java b/Mage.Sets/src/mage/cards/s/SigilOfSleep.java index e2d93bd8223..7856263da01 100644 --- a/Mage.Sets/src/mage/cards/s/SigilOfSleep.java +++ b/Mage.Sets/src/mage/cards/s/SigilOfSleep.java @@ -14,7 +14,7 @@ import mage.constants.SubType; import mage.filter.common.FilterCreaturePermanent; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -40,7 +40,7 @@ public final class SigilOfSleep extends CardImpl { Effect effect = new ReturnToHandTargetEffect(); ability = new DealsDamageToAPlayerAttachedTriggeredAbility(effect, "enchanted", false, true, false); ability.addTarget(new TargetCreaturePermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/SkirkCommando.java b/Mage.Sets/src/mage/cards/s/SkirkCommando.java index 1dd7cbb1ddd..14dc245e0ab 100644 --- a/Mage.Sets/src/mage/cards/s/SkirkCommando.java +++ b/Mage.Sets/src/mage/cards/s/SkirkCommando.java @@ -13,7 +13,7 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.filter.common.FilterCreaturePermanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -35,7 +35,7 @@ public final class SkirkCommando extends CardImpl { //Whenever Skirk Commando deals combat damage to a player, you may have it deal 2 damage to target creature that player controls. Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DamageTargetEffect(2), true, true); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); //Morph {2}{R} (You may cast this card face down as a 2/2 creature for 3. Turn it face up any time for its morph cost.) diff --git a/Mage.Sets/src/mage/cards/s/Skullsnatcher.java b/Mage.Sets/src/mage/cards/s/Skullsnatcher.java index 8a9a5332f67..8a82f7a47a4 100644 --- a/Mage.Sets/src/mage/cards/s/Skullsnatcher.java +++ b/Mage.Sets/src/mage/cards/s/Skullsnatcher.java @@ -16,7 +16,7 @@ import mage.filter.FilterCard; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.permanent.UnblockedPredicate; import mage.target.common.TargetCardInGraveyard; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -47,7 +47,7 @@ public final class Skullsnatcher extends CardImpl { Effect effect = new ExileTargetEffect(null, "", Zone.GRAVEYARD); Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(effect, false, true); ability.addTarget(new TargetCardInGraveyard(0, 2, filterGraveyardCard)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster(true)); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster(true)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/SnappingThragg.java b/Mage.Sets/src/mage/cards/s/SnappingThragg.java index e5849354032..476f684aceb 100644 --- a/Mage.Sets/src/mage/cards/s/SnappingThragg.java +++ b/Mage.Sets/src/mage/cards/s/SnappingThragg.java @@ -13,7 +13,7 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.filter.common.FilterCreaturePermanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -35,7 +35,7 @@ public final class SnappingThragg extends CardImpl { // Whenever Snapping Thragg deals combat damage to a player, you may have it deal 3 damage to target creature that player controls. Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DamageTargetEffect(3), true, true); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); // Morph {4}{R}{R} diff --git a/Mage.Sets/src/mage/cards/s/SparkMage.java b/Mage.Sets/src/mage/cards/s/SparkMage.java index 8eabdbbd9f1..f3b5b2acdbb 100644 --- a/Mage.Sets/src/mage/cards/s/SparkMage.java +++ b/Mage.Sets/src/mage/cards/s/SparkMage.java @@ -11,7 +11,7 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.filter.common.FilterCreaturePermanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -36,7 +36,7 @@ public final class SparkMage extends CardImpl { new DamageTargetEffect(1), true, true ).withRuleTextReplacement(false); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/SunderShaman.java b/Mage.Sets/src/mage/cards/s/SunderShaman.java index 6921a07b61d..8c97e3746c0 100644 --- a/Mage.Sets/src/mage/cards/s/SunderShaman.java +++ b/Mage.Sets/src/mage/cards/s/SunderShaman.java @@ -12,7 +12,7 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.filter.common.FilterArtifactOrEnchantmentPermanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -38,7 +38,7 @@ public final class SunderShaman extends CardImpl { // Whenever Sunder Shaman deals combat damage to a player, destroy target artifact or enchantment that player controls. Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DestroyTargetEffect(), false, true); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/t/ThroatSlitter.java b/Mage.Sets/src/mage/cards/t/ThroatSlitter.java index f887b058182..15c49b945eb 100644 --- a/Mage.Sets/src/mage/cards/t/ThroatSlitter.java +++ b/Mage.Sets/src/mage/cards/t/ThroatSlitter.java @@ -15,7 +15,7 @@ import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ColorPredicate; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -45,7 +45,7 @@ public final class ThroatSlitter extends CardImpl { // Whenever Throat Slitter deals combat damage to a player, destroy target nonblack creature that player controls. Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DestroyTargetEffect(), false, true); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/t/TimeReaper.java b/Mage.Sets/src/mage/cards/t/TimeReaper.java index d6a55ec7bcb..3d055d4bbef 100644 --- a/Mage.Sets/src/mage/cards/t/TimeReaper.java +++ b/Mage.Sets/src/mage/cards/t/TimeReaper.java @@ -15,7 +15,7 @@ import mage.filter.FilterCard; import mage.filter.predicate.Predicates; import mage.filter.predicate.card.FaceDownPredicate; import mage.target.common.TargetCardInExile; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -49,7 +49,7 @@ public final class TimeReaper extends CardImpl { Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new PutOnLibraryTargetEffect(false), false, true); ability.addEffect(new GainLifeEffect(3).concatBy("If you do,")); //I don't think the move can fail? If there's no target then the trigger won't happen ability.addTarget(new TargetCardInExile(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster(true)); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster(true)); ability.withFlavorWord("Consume Anomaly"); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/t/TinybonesThePickpocket.java b/Mage.Sets/src/mage/cards/t/TinybonesThePickpocket.java index 3a48422bda3..789c75a5332 100644 --- a/Mage.Sets/src/mage/cards/t/TinybonesThePickpocket.java +++ b/Mage.Sets/src/mage/cards/t/TinybonesThePickpocket.java @@ -16,7 +16,7 @@ import mage.filter.FilterCard; import mage.filter.common.FilterPermanentCard; import mage.filter.predicate.Predicates; import mage.target.common.TargetCardInGraveyard; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -48,7 +48,7 @@ public final class TinybonesThePickpocket extends CardImpl { OneShotEffect effect = new MayCastTargetCardEffect(CastManaAdjustment.AS_THOUGH_ANY_MANA_TYPE, false); Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(effect, false, true); ability.addTarget(new TargetCardInGraveyard(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster(true)); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster(true)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/t/TrygonPredator.java b/Mage.Sets/src/mage/cards/t/TrygonPredator.java index c3d22b61ee4..40cff196c1c 100644 --- a/Mage.Sets/src/mage/cards/t/TrygonPredator.java +++ b/Mage.Sets/src/mage/cards/t/TrygonPredator.java @@ -12,7 +12,7 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.filter.common.FilterArtifactOrEnchantmentPermanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -36,7 +36,7 @@ public final class TrygonPredator extends CardImpl { // Whenever Trygon Predator deals combat damage to a player, you may destroy target artifact or enchantment that player controls. Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DestroyTargetEffect(), true, true); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/w/WeatherseedTotem.java b/Mage.Sets/src/mage/cards/w/WeatherseedTotem.java index ff2009b7210..7a7a03a5c22 100644 --- a/Mage.Sets/src/mage/cards/w/WeatherseedTotem.java +++ b/Mage.Sets/src/mage/cards/w/WeatherseedTotem.java @@ -17,8 +17,8 @@ import mage.constants.Duration; import mage.constants.SubType; import mage.game.Game; import mage.game.permanent.token.custom.CreatureToken; +import mage.util.CardUtil; -import java.util.Objects; import java.util.UUID; /** @@ -65,11 +65,8 @@ enum WeatherseedTotemCondition implements Condition { @Override public boolean apply(Game game, Ability source) { - return source - .getEffects() - .stream() - .map(effect -> effect.getValue("permanentWasCreature")) - .filter(Objects::nonNull) - .anyMatch(Boolean.class::cast); + return CardUtil + .getEffectValueFromAbility(source, "permanentWasCreature", Boolean.class) + .orElse(false); } } diff --git a/Mage.Sets/src/mage/cards/w/WrexialTheRisenDeep.java b/Mage.Sets/src/mage/cards/w/WrexialTheRisenDeep.java index 15a2c841e0b..d4ccc426dc2 100644 --- a/Mage.Sets/src/mage/cards/w/WrexialTheRisenDeep.java +++ b/Mage.Sets/src/mage/cards/w/WrexialTheRisenDeep.java @@ -17,7 +17,7 @@ import mage.constants.SuperType; import mage.filter.FilterCard; import mage.filter.common.FilterInstantOrSorceryCard; import mage.target.common.TargetCardInGraveyard; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -50,7 +50,7 @@ public final class WrexialTheRisenDeep extends CardImpl { + ThatSpellGraveyardExileReplacementEffect.RULE_A); Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(effect, false, true); ability.addTarget(new TargetCardInGraveyard(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster(true)); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster(true)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/z/ZarethSanTheTrickster.java b/Mage.Sets/src/mage/cards/z/ZarethSanTheTrickster.java index a40f80a5084..057fe6af878 100644 --- a/Mage.Sets/src/mage/cards/z/ZarethSanTheTrickster.java +++ b/Mage.Sets/src/mage/cards/z/ZarethSanTheTrickster.java @@ -22,7 +22,7 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCardInGraveyard; import mage.target.common.TargetControlledPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -61,7 +61,7 @@ public final class ZarethSanTheTrickster extends CardImpl { // Whenever Zareth San deals combat damage to a player, you may put target permanent card from that player's graveyard onto the battlefield under your control. Ability ability2 = new DealsCombatDamageToAPlayerTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect(), true, true); ability2.addTarget(new TargetCardInGraveyard(filterCardGraveyard)); - ability2.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster(true)); + ability2.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster(true)); this.addAbility(ability2); } diff --git a/Mage.Sets/src/mage/cards/z/ZombieCannibal.java b/Mage.Sets/src/mage/cards/z/ZombieCannibal.java index d2bac983887..ad8c8915e03 100644 --- a/Mage.Sets/src/mage/cards/z/ZombieCannibal.java +++ b/Mage.Sets/src/mage/cards/z/ZombieCannibal.java @@ -12,7 +12,7 @@ import mage.constants.SubType; import mage.constants.Zone; import mage.filter.FilterCard; import mage.target.common.TargetCardInGraveyard; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; import java.util.UUID; @@ -34,7 +34,7 @@ public final class ZombieCannibal extends CardImpl { Effect effect = new ExileTargetEffect(null, "", Zone.GRAVEYARD); Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(effect, true, true); ability.addTarget(new TargetCardInGraveyard(filterGraveyardCard)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster(true)); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster(true)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/AssassinsCreed.java b/Mage.Sets/src/mage/sets/AssassinsCreed.java index 5925cca943d..56755d60e15 100644 --- a/Mage.Sets/src/mage/sets/AssassinsCreed.java +++ b/Mage.Sets/src/mage/sets/AssassinsCreed.java @@ -237,9 +237,9 @@ public final class AssassinsCreed extends ExpansionSet { cards.add(new SetCardInfo("Poison-Blade Mentor", 288, Rarity.UNCOMMON, mage.cards.p.PoisonBladeMentor.class)); cards.add(new SetCardInfo("Propaganda", 195, Rarity.UNCOMMON, mage.cards.p.Propaganda.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Propaganda", 85, Rarity.UNCOMMON, mage.cards.p.Propaganda.class, NON_FULL_USE_VARIOUS)); - //cards.add(new SetCardInfo("Ratonhnhake:ton", 150, Rarity.RARE, mage.cards.r.Ratonhnhaketon.class, NON_FULL_USE_VARIOUS)); - //cards.add(new SetCardInfo("Ratonhnhake:ton", 244, Rarity.RARE, mage.cards.r.Ratonhnhaketon.class, NON_FULL_USE_VARIOUS)); - //cards.add(new SetCardInfo("Ratonhnhake:ton", 62, Rarity.RARE, mage.cards.r.Ratonhnhakton.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Ratonhnhaketon", 150, Rarity.RARE, mage.cards.r.Ratonhnhaketon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Ratonhnhaketon", 244, Rarity.RARE, mage.cards.r.Ratonhnhaketon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Ratonhnhaketon", 62, Rarity.RARE, mage.cards.r.Ratonhnhaketon.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Raven Clan War-Axe", 297, Rarity.RARE, mage.cards.r.RavenClanWarAxe.class)); cards.add(new SetCardInfo("Reconnaissance", 179, Rarity.UNCOMMON, mage.cards.r.Reconnaissance.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Reconnaissance", 82, Rarity.UNCOMMON, mage.cards.r.Reconnaissance.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java b/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java index a789aee7419..76a45438046 100644 --- a/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java +++ b/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java @@ -206,9 +206,9 @@ public final class CommanderLegendsBattleForBaldursGate extends ExpansionSet { cards.add(new SetCardInfo("Cloudkill", 121, Rarity.UNCOMMON, mage.cards.c.Cloudkill.class)); cards.add(new SetCardInfo("Colossal Badger", 223, Rarity.COMMON, mage.cards.c.ColossalBadger.class)); cards.add(new SetCardInfo("Command Tower", 351, Rarity.COMMON, mage.cards.c.CommandTower.class)); - //cards.add(new SetCardInfo("Commander Liara Portyr", 270, Rarity.UNCOMMON, mage.cards.c.CommanderLiaraPortyr.class, NON_FULL_USE_VARIOUS)); - //cards.add(new SetCardInfo("Commander Liara Portyr", 418, Rarity.UNCOMMON, mage.cards.c.CommanderLiaraPortyr.class, NON_FULL_USE_VARIOUS)); - //cards.add(new SetCardInfo("Commander Liara Portyr", 529, Rarity.UNCOMMON, mage.cards.c.CommanderLiaraPortyr.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Commander Liara Portyr", 270, Rarity.UNCOMMON, mage.cards.c.CommanderLiaraPortyr.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Commander Liara Portyr", 418, Rarity.UNCOMMON, mage.cards.c.CommanderLiaraPortyr.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Commander Liara Portyr", 529, Rarity.UNCOMMON, mage.cards.c.CommanderLiaraPortyr.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Compulsive Research", 715, Rarity.COMMON, mage.cards.c.CompulsiveResearch.class)); cards.add(new SetCardInfo("Cone of Cold", 61, Rarity.UNCOMMON, mage.cards.c.ConeOfCold.class)); cards.add(new SetCardInfo("Consuming Aberration", 840, Rarity.RARE, mage.cards.c.ConsumingAberration.class)); @@ -571,8 +571,8 @@ public final class CommanderLegendsBattleForBaldursGate extends ExpansionSet { cards.add(new SetCardInfo("Mindblade Render", 762, Rarity.RARE, mage.cards.m.MindbladeRender.class)); cards.add(new SetCardInfo("Mindcrank", 866, Rarity.UNCOMMON, mage.cards.m.Mindcrank.class)); cards.add(new SetCardInfo("Minimus Containment", 34, Rarity.COMMON, mage.cards.m.MinimusContainment.class)); - //cards.add(new SetCardInfo("Minsc & Boo, Timeless Heroes", 285, Rarity.MYTHIC, mage.cards.m.MinscAndBooTimelessHeroes.class, NON_FULL_USE_VARIOUS)); - //cards.add(new SetCardInfo("Minsc & Boo, Timeless Heroes", 363, Rarity.MYTHIC, mage.cards.m.MinscAndBooTimelessHeroes.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Minsc & Boo, Timeless Heroes", 285, Rarity.MYTHIC, mage.cards.m.MinscBooTimelessHeroes.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Minsc & Boo, Timeless Heroes", 363, Rarity.MYTHIC, mage.cards.m.MinscBooTimelessHeroes.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Minthara, Merciless Soul", 286, Rarity.UNCOMMON, mage.cards.m.MintharaMercilessSoul.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Minthara, Merciless Soul", 432, Rarity.UNCOMMON, mage.cards.m.MintharaMercilessSoul.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Minthara, Merciless Soul", 543, Rarity.UNCOMMON, mage.cards.m.MintharaMercilessSoul.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage.Sets/src/mage/sets/DuskmournHouseOfHorror.java b/Mage.Sets/src/mage/sets/DuskmournHouseOfHorror.java index bbcb0411918..18abe25f7d0 100644 --- a/Mage.Sets/src/mage/sets/DuskmournHouseOfHorror.java +++ b/Mage.Sets/src/mage/sets/DuskmournHouseOfHorror.java @@ -278,6 +278,9 @@ public final class DuskmournHouseOfHorror extends ExpansionSet { cards.add(new SetCardInfo("Razorkin Needlehead", 153, Rarity.RARE, mage.cards.r.RazorkinNeedlehead.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Razorkin Needlehead", 347, Rarity.RARE, mage.cards.r.RazorkinNeedlehead.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Razortrap Gorge", 267, Rarity.COMMON, mage.cards.r.RazortrapGorge.class)); + cards.add(new SetCardInfo("Reluctant Role Model", 26, Rarity.RARE, mage.cards.r.ReluctantRoleModel.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Reluctant Role Model", 289, Rarity.RARE, mage.cards.r.ReluctantRoleModel.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Reluctant Role Model", 303, Rarity.RARE, mage.cards.r.ReluctantRoleModel.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Resurrected Cultist", 115, Rarity.COMMON, mage.cards.r.ResurrectedCultist.class)); cards.add(new SetCardInfo("Rip, Spawn Hunter", 228, Rarity.RARE, mage.cards.r.RipSpawnHunter.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Rip, Spawn Hunter", 362, Rarity.RARE, mage.cards.r.RipSpawnHunter.class, NON_FULL_USE_VARIOUS)); @@ -366,7 +369,9 @@ public final class DuskmournHouseOfHorror extends ExpansionSet { cards.add(new SetCardInfo("Valgavoth's Lair", 327, Rarity.RARE, mage.cards.v.ValgavothsLair.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Valgavoth's Onslaught", 204, Rarity.RARE, mage.cards.v.ValgavothsOnslaught.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Valgavoth's Onslaught", 324, Rarity.RARE, mage.cards.v.ValgavothsOnslaught.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Valgavoth, Terror Eater", 120, Rarity.MYTHIC, mage.cards.v.ValgavothTerrorEater.class)); + cards.add(new SetCardInfo("Valgavoth, Terror Eater", 120, Rarity.MYTHIC, mage.cards.v.ValgavothTerrorEater.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Valgavoth, Terror Eater", 352, Rarity.MYTHIC, mage.cards.v.ValgavothTerrorEater.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Valgavoth, Terror Eater", 407, Rarity.MYTHIC, mage.cards.v.ValgavothTerrorEater.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Vanish from Sight", 82, Rarity.COMMON, mage.cards.v.VanishFromSight.class)); cards.add(new SetCardInfo("Vengeful Possession", 162, Rarity.UNCOMMON, mage.cards.v.VengefulPossession.class)); cards.add(new SetCardInfo("Veteran Survivor", 40, Rarity.UNCOMMON, mage.cards.v.VeteranSurvivor.class)); diff --git a/Mage.Sets/src/mage/sets/EternalWeekend.java b/Mage.Sets/src/mage/sets/EternalWeekend.java index 093c5bd439c..fd66aed343f 100644 --- a/Mage.Sets/src/mage/sets/EternalWeekend.java +++ b/Mage.Sets/src/mage/sets/EternalWeekend.java @@ -26,6 +26,8 @@ public class EternalWeekend extends ExpansionSet { cards.add(new SetCardInfo("Gush", "2022a", Rarity.RARE, mage.cards.g.Gush.class, RETRO_ART)); cards.add(new SetCardInfo("Mental Misstep", "2023a", Rarity.RARE, mage.cards.m.MentalMisstep.class, RETRO_ART)); cards.add(new SetCardInfo("Ponder", "2022b", Rarity.RARE, mage.cards.p.Ponder.class, RETRO_ART)); + cards.add(new SetCardInfo("Tendrils of Agony", "2025a", Rarity.RARE, mage.cards.t.TendrilsOfAgony.class, RETRO_ART)); cards.add(new SetCardInfo("Tinker", "2024a", Rarity.MYTHIC, mage.cards.t.Tinker.class, RETRO_ART)); + cards.add(new SetCardInfo("Trinisphere", "2025b", Rarity.MYTHIC, mage.cards.t.Trinisphere.class, RETRO_ART)); } } diff --git a/Mage.Sets/src/mage/sets/RavnicaClueEdition.java b/Mage.Sets/src/mage/sets/RavnicaClueEdition.java index 9b71bfb42a0..6111eb31787 100644 --- a/Mage.Sets/src/mage/sets/RavnicaClueEdition.java +++ b/Mage.Sets/src/mage/sets/RavnicaClueEdition.java @@ -43,7 +43,7 @@ public final class RavnicaClueEdition extends ExpansionSet { cards.add(new SetCardInfo("Boros Garrison", 231, Rarity.COMMON, mage.cards.b.BorosGarrison.class)); cards.add(new SetCardInfo("Boros Guildgate", 232, Rarity.COMMON, mage.cards.b.BorosGuildgate.class)); cards.add(new SetCardInfo("Boros Signet", 220, Rarity.COMMON, mage.cards.b.BorosSignet.class)); - //cards.add(new SetCardInfo("Boros Strike-Captain", 25, Rarity.RARE, mage.cards.b.BorosStrikeCaptain.class)); + cards.add(new SetCardInfo("Boros Strike-Captain", 25, Rarity.RARE, mage.cards.b.BorosStrikeCaptain.class)); cards.add(new SetCardInfo("Breeding Pool", 275, Rarity.RARE, mage.cards.b.BreedingPool.class)); cards.add(new SetCardInfo("Candlestick", 8, Rarity.UNCOMMON, mage.cards.c.Candlestick.class)); cards.add(new SetCardInfo("Carnage Interpreter", 26, Rarity.RARE, mage.cards.c.CarnageInterpreter.class)); @@ -64,7 +64,7 @@ public final class RavnicaClueEdition extends ExpansionSet { cards.add(new SetCardInfo("Corpse Churn", 107, Rarity.COMMON, mage.cards.c.CorpseChurn.class)); cards.add(new SetCardInfo("Cosmotronic Wave", 129, Rarity.COMMON, mage.cards.c.CosmotronicWave.class)); cards.add(new SetCardInfo("Council's Judgment", 57, Rarity.RARE, mage.cards.c.CouncilsJudgment.class)); - //cards.add(new SetCardInfo("Covetous Elegy", 29, Rarity.RARE, mage.cards.c.CovetousElegy.class)); + cards.add(new SetCardInfo("Covetous Elegy", 29, Rarity.RARE, mage.cards.c.CovetousElegy.class)); cards.add(new SetCardInfo("Curse of Chains", 183, Rarity.COMMON, mage.cards.c.CurseOfChains.class)); cards.add(new SetCardInfo("Dagger Caster", 130, Rarity.UNCOMMON, mage.cards.d.DaggerCaster.class)); cards.add(new SetCardInfo("Daggerclaw Imp", 108, Rarity.UNCOMMON, mage.cards.d.DaggerclawImp.class)); @@ -107,7 +107,7 @@ public final class RavnicaClueEdition extends ExpansionSet { cards.add(new SetCardInfo("Fresh-Faced Recruit", 192, Rarity.COMMON, mage.cards.f.FreshFacedRecruit.class)); cards.add(new SetCardInfo("Frostburn Weird", 193, Rarity.COMMON, mage.cards.f.FrostburnWeird.class)); cards.add(new SetCardInfo("Fungal Rebirth", 163, Rarity.UNCOMMON, mage.cards.f.FungalRebirth.class)); - //cards.add(new SetCardInfo("Furious Spinesplitter", 33, Rarity.UNCOMMON, mage.cards.f.FuriousSpinesplitter.class)); + cards.add(new SetCardInfo("Furious Spinesplitter", 33, Rarity.UNCOMMON, mage.cards.f.FuriousSpinesplitter.class)); cards.add(new SetCardInfo("Giant Adephage", 164, Rarity.MYTHIC, mage.cards.g.GiantAdephage.class)); cards.add(new SetCardInfo("Gift of Strength", 165, Rarity.COMMON, mage.cards.g.GiftOfStrength.class)); cards.add(new SetCardInfo("Glorifier of Dusk", 62, Rarity.UNCOMMON, mage.cards.g.GlorifierOfDusk.class)); @@ -168,14 +168,14 @@ public final class RavnicaClueEdition extends ExpansionSet { cards.add(new SetCardInfo("Master Biomancer", 200, Rarity.MYTHIC, mage.cards.m.MasterBiomancer.class)); cards.add(new SetCardInfo("Mastermind Plum", 3, Rarity.RARE, mage.cards.m.MastermindPlum.class)); cards.add(new SetCardInfo("Mausoleum Turnkey", 116, Rarity.UNCOMMON, mage.cards.m.MausoleumTurnkey.class)); - //cards.add(new SetCardInfo("Memory Vampire", 38, Rarity.RARE, mage.cards.m.MemoryVampire.class)); + cards.add(new SetCardInfo("Memory Vampire", 38, Rarity.RARE, mage.cards.m.MemoryVampire.class)); cards.add(new SetCardInfo("Mighty Leap", 66, Rarity.COMMON, mage.cards.m.MightyLeap.class)); cards.add(new SetCardInfo("Mountain", 266, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mountain", 267, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mountain", 268, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mountain", 269, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Nissa's Judgment", 170, Rarity.UNCOMMON, mage.cards.n.NissasJudgment.class)); - //cards.add(new SetCardInfo("Ordruun Mentor", 39, Rarity.UNCOMMON, mage.cards.o.OrdruunMentor.class)); + cards.add(new SetCardInfo("Ordruun Mentor", 39, Rarity.UNCOMMON, mage.cards.o.OrdruunMentor.class)); cards.add(new SetCardInfo("Ornery Goblin", 143, Rarity.COMMON, mage.cards.o.OrneryGoblin.class)); cards.add(new SetCardInfo("Orzhov Basilica", 241, Rarity.COMMON, mage.cards.o.OrzhovBasilica.class)); cards.add(new SetCardInfo("Orzhov Guildgate", 242, Rarity.COMMON, mage.cards.o.OrzhovGuildgate.class)); @@ -210,7 +210,7 @@ public final class RavnicaClueEdition extends ExpansionSet { cards.add(new SetCardInfo("Reduce to Ashes", 145, Rarity.COMMON, mage.cards.r.ReduceToAshes.class)); cards.add(new SetCardInfo("Repeal", 94, Rarity.COMMON, mage.cards.r.Repeal.class)); cards.add(new SetCardInfo("Rescuer Sphinx", 95, Rarity.UNCOMMON, mage.cards.r.RescuerSphinx.class)); - //cards.add(new SetCardInfo("Resonance Technician", 41, Rarity.RARE, mage.cards.r.ResonanceTechnician.class)); + cards.add(new SetCardInfo("Resonance Technician", 41, Rarity.RARE, mage.cards.r.ResonanceTechnician.class)); cards.add(new SetCardInfo("Ribbons of Night", 120, Rarity.UNCOMMON, mage.cards.r.RibbonsOfNight.class)); cards.add(new SetCardInfo("Ripscale Predator", 146, Rarity.COMMON, mage.cards.r.RipscalePredator.class)); cards.add(new SetCardInfo("Roaming Ghostlight", 96, Rarity.COMMON, mage.cards.r.RoamingGhostlight.class)); diff --git a/Mage.Sets/src/mage/sets/SecretLairDrop.java b/Mage.Sets/src/mage/sets/SecretLairDrop.java index c6eb9f9e797..8c7c072c7b9 100644 --- a/Mage.Sets/src/mage/sets/SecretLairDrop.java +++ b/Mage.Sets/src/mage/sets/SecretLairDrop.java @@ -38,7 +38,7 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Reaper King", 9, Rarity.MYTHIC, mage.cards.r.ReaperKing.class)); cards.add(new SetCardInfo("Sliver Overlord", 10, Rarity.MYTHIC, mage.cards.s.SliverOverlord.class)); cards.add(new SetCardInfo("The Ur-Dragon", 11, Rarity.MYTHIC, mage.cards.t.TheUrDragon.class)); - cards.add(new SetCardInfo("Bitterblossom", 12, Rarity.MYTHIC, mage.cards.b.Bitterblossom.class)); + cards.add(new SetCardInfo("Bitterblossom", 12, Rarity.MYTHIC, mage.cards.b.Bitterblossom.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Goblin Bushwhacker", 17, Rarity.RARE, mage.cards.g.GoblinBushwhacker.class)); cards.add(new SetCardInfo("Goblin Sharpshooter", 18, Rarity.RARE, mage.cards.g.GoblinSharpshooter.class)); cards.add(new SetCardInfo("Goblin King", 19, Rarity.RARE, mage.cards.g.GoblinKing.class, NON_FULL_USE_VARIOUS)); @@ -101,7 +101,7 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Mogis, God of Slaughter", 78, Rarity.MYTHIC, mage.cards.m.MogisGodOfSlaughter.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Keranos, God of Storms", 79, Rarity.MYTHIC, mage.cards.k.KeranosGodOfStorms.class)); cards.add(new SetCardInfo("Nylea, God of the Hunt", 80, Rarity.MYTHIC, mage.cards.n.NyleaGodOfTheHunt.class)); - cards.add(new SetCardInfo("Xenagos, God of Revels", 81, Rarity.MYTHIC, mage.cards.x.XenagosGodOfRevels.class)); + cards.add(new SetCardInfo("Xenagos, God of Revels", 81, Rarity.MYTHIC, mage.cards.x.XenagosGodOfRevels.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Pharika, God of Affliction", 82, Rarity.MYTHIC, mage.cards.p.PharikaGodOfAffliction.class)); cards.add(new SetCardInfo("Lightning Bolt", 83, Rarity.RARE, mage.cards.l.LightningBolt.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Lightning Bolt", 84, Rarity.RARE, mage.cards.l.LightningBolt.class, NON_FULL_USE_VARIOUS)); @@ -170,9 +170,9 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Malik, Grim Manipulator", 147, Rarity.MYTHIC, mage.cards.m.MalikGrimManipulator.class)); cards.add(new SetCardInfo("Admonition Angel", 154, Rarity.MYTHIC, mage.cards.a.AdmonitionAngel.class)); cards.add(new SetCardInfo("Roil Elemental", 155, Rarity.RARE, mage.cards.r.RoilElemental.class)); - cards.add(new SetCardInfo("Zulaport Cutthroat", 156, Rarity.RARE, mage.cards.z.ZulaportCutthroat.class)); + cards.add(new SetCardInfo("Zulaport Cutthroat", 156, Rarity.RARE, mage.cards.z.ZulaportCutthroat.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Warren Instigator", 157, Rarity.MYTHIC, mage.cards.w.WarrenInstigator.class)); - cards.add(new SetCardInfo("Avenger of Zendikar", 158, Rarity.MYTHIC, mage.cards.a.AvengerOfZendikar.class)); + cards.add(new SetCardInfo("Avenger of Zendikar", 158, Rarity.MYTHIC, mage.cards.a.AvengerOfZendikar.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Demonlord Belzenlok", 159, Rarity.MYTHIC, mage.cards.d.DemonlordBelzenlok.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Demonlord Belzenlok", "159*", Rarity.MYTHIC, mage.cards.d.DemonlordBelzenlok.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Griselbrand", 160, Rarity.MYTHIC, mage.cards.g.Griselbrand.class, NON_FULL_USE_VARIOUS)); @@ -198,7 +198,7 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Decree of Pain", 187, Rarity.RARE, mage.cards.d.DecreeOfPain.class)); cards.add(new SetCardInfo("Gamble", 188, Rarity.RARE, mage.cards.g.Gamble.class)); cards.add(new SetCardInfo("Nature's Lore", 189, Rarity.RARE, mage.cards.n.NaturesLore.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Soul-Scar Mage", 190, Rarity.RARE, mage.cards.s.SoulScarMage.class)); + cards.add(new SetCardInfo("Soul-Scar Mage", 190, Rarity.RARE, mage.cards.s.SoulScarMage.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Dryad of the Ilysian Grove", 191, Rarity.RARE, mage.cards.d.DryadOfTheIlysianGrove.class)); cards.add(new SetCardInfo("Sakura-Tribe Elder", 192, Rarity.RARE, mage.cards.s.SakuraTribeElder.class)); cards.add(new SetCardInfo("Spell Queller", 193, Rarity.RARE, mage.cards.s.SpellQueller.class)); @@ -212,7 +212,7 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Chromatic Lantern", 202, Rarity.RARE, mage.cards.c.ChromaticLantern.class)); cards.add(new SetCardInfo("Commander's Sphere", 203, Rarity.RARE, mage.cards.c.CommandersSphere.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Darksteel Ingot", 204, Rarity.RARE, mage.cards.d.DarksteelIngot.class)); - cards.add(new SetCardInfo("Gilded Lotus", 205, Rarity.RARE, mage.cards.g.GildedLotus.class)); + cards.add(new SetCardInfo("Gilded Lotus", 205, Rarity.RARE, mage.cards.g.GildedLotus.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Exquisite Blood", 206, Rarity.RARE, mage.cards.e.ExquisiteBlood.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Night's Whisper", 207, Rarity.RARE, mage.cards.n.NightsWhisper.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Phyrexian Tower", 208, Rarity.RARE, mage.cards.p.PhyrexianTower.class)); @@ -223,7 +223,7 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Vorinclex, Voice of Hunger", 213, Rarity.MYTHIC, mage.cards.v.VorinclexVoiceOfHunger.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Heliod, Sun-Crowned", 214, Rarity.MYTHIC, mage.cards.h.HeliodSunCrowned.class)); cards.add(new SetCardInfo("Goblin Rabblemaster", 215, Rarity.RARE, mage.cards.g.GoblinRabblemaster.class)); - cards.add(new SetCardInfo("Monastery Swiftspear", 216, Rarity.RARE, mage.cards.m.MonasterySwiftspear.class)); + cards.add(new SetCardInfo("Monastery Swiftspear", 216, Rarity.RARE, mage.cards.m.MonasterySwiftspear.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Boros Charm", 217, Rarity.RARE, mage.cards.b.BorosCharm.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Gisela, Blade of Goldnight", 218, Rarity.MYTHIC, mage.cards.g.GiselaBladeOfGoldnight.class)); cards.add(new SetCardInfo("Frost Titan", 220, Rarity.MYTHIC, mage.cards.f.FrostTitan.class)); @@ -366,7 +366,7 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Cut // Ribbons", 367, Rarity.RARE, mage.cards.c.CutRibbons.class)); cards.add(new SetCardInfo("Teferi's Puzzle Box", 368, Rarity.RARE, mage.cards.t.TeferisPuzzleBox.class)); cards.add(new SetCardInfo("Generous Gift", 369, Rarity.RARE, mage.cards.g.GenerousGift.class)); - cards.add(new SetCardInfo("Chain Lightning", 370, Rarity.RARE, mage.cards.c.ChainLightning.class)); + cards.add(new SetCardInfo("Chain Lightning", 370, Rarity.RARE, mage.cards.c.ChainLightning.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Kodama's Reach", 371, Rarity.RARE, mage.cards.k.KodamasReach.class)); cards.add(new SetCardInfo("Heirloom Blade", 372, Rarity.RARE, mage.cards.h.HeirloomBlade.class)); cards.add(new SetCardInfo("Mulldrifter", 373, Rarity.RARE, mage.cards.m.Mulldrifter.class, NON_FULL_USE_VARIOUS)); @@ -472,7 +472,7 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Depala, Pilot Exemplar", 464, Rarity.RARE, mage.cards.d.DepalaPilotExemplar.class)); cards.add(new SetCardInfo("Nomad Outpost", 465, Rarity.RARE, mage.cards.n.NomadOutpost.class)); cards.add(new SetCardInfo("Island", 466, Rarity.LAND, mage.cards.basiclands.Island.class, FULL_ART_BFZ_VARIOUS)); - cards.add(new SetCardInfo("Concordant Crossroads", 467, Rarity.RARE, mage.cards.c.ConcordantCrossroads.class)); + cards.add(new SetCardInfo("Concordant Crossroads", 467, Rarity.RARE, mage.cards.c.ConcordantCrossroads.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ghost Quarter", 468, Rarity.RARE, mage.cards.g.GhostQuarter.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ash Barrens", 469, Rarity.RARE, mage.cards.a.AshBarrens.class)); cards.add(new SetCardInfo("Command Beacon", 470, Rarity.RARE, mage.cards.c.CommandBeacon.class, NON_FULL_USE_VARIOUS)); @@ -495,7 +495,7 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Mountain", 487, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Forest", 488, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Akroma, Angel of Wrath", 489, Rarity.MYTHIC, mage.cards.a.AkromaAngelOfWrath.class)); - cards.add(new SetCardInfo("Mikaeus, the Unhallowed", 490, Rarity.MYTHIC, mage.cards.m.MikaeusTheUnhallowed.class)); + cards.add(new SetCardInfo("Mikaeus, the Unhallowed", 490, Rarity.MYTHIC, mage.cards.m.MikaeusTheUnhallowed.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Glissa Sunseeker", 491, Rarity.RARE, mage.cards.g.GlissaSunseeker.class)); cards.add(new SetCardInfo("Olivia, Mobilized for War", 492, Rarity.MYTHIC, mage.cards.o.OliviaMobilizedForWar.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Kozilek, the Great Distortion", 493, Rarity.MYTHIC, mage.cards.k.KozilekTheGreatDistortion.class)); @@ -631,11 +631,11 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Basal Sliver", 629, Rarity.RARE, mage.cards.b.BasalSliver.class)); cards.add(new SetCardInfo("Dregscape Sliver", 631, Rarity.RARE, mage.cards.d.DregscapeSliver.class)); cards.add(new SetCardInfo("Leeching Sliver", 632, Rarity.RARE, mage.cards.l.LeechingSliver.class)); - cards.add(new SetCardInfo("Plague Sliver", 633, Rarity.RARE, mage.cards.p.PlagueSliver.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Plague Sliver", "633Ph", Rarity.RARE, mage.cards.p.PlagueSliver.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plague Sliver", 633, Rarity.RARE, mage.cards.p.PlagueSliver.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Syphon Sliver", 634, Rarity.RARE, mage.cards.s.SyphonSliver.class)); - cards.add(new SetCardInfo("Toxin Sliver", 635, Rarity.RARE, mage.cards.t.ToxinSliver.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Toxin Sliver", "635Ph", Rarity.RARE, mage.cards.t.ToxinSliver.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Toxin Sliver", 635, Rarity.RARE, mage.cards.t.ToxinSliver.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Belligerent Sliver", 636, Rarity.RARE, mage.cards.b.BelligerentSliver.class)); cards.add(new SetCardInfo("Blur Sliver", 637, Rarity.RARE, mage.cards.b.BlurSliver.class)); cards.add(new SetCardInfo("Fury Sliver", 638, Rarity.RARE, mage.cards.f.FurySliver.class)); @@ -657,8 +657,8 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Quick Sliver", 655, Rarity.RARE, mage.cards.q.QuickSliver.class)); cards.add(new SetCardInfo("Root Sliver", 656, Rarity.RARE, mage.cards.r.RootSliver.class)); cards.add(new SetCardInfo("Tempered Sliver", 657, Rarity.RARE, mage.cards.t.TemperedSliver.class)); - cards.add(new SetCardInfo("Virulent Sliver", 659, Rarity.RARE, mage.cards.v.VirulentSliver.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Virulent Sliver", "659Ph", Rarity.RARE, mage.cards.v.VirulentSliver.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Virulent Sliver", 659, Rarity.RARE, mage.cards.v.VirulentSliver.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Cloudshredder Sliver", 660, Rarity.RARE, mage.cards.c.CloudshredderSliver.class)); cards.add(new SetCardInfo("Crystalline Sliver", 661, Rarity.RARE, mage.cards.c.CrystallineSliver.class)); cards.add(new SetCardInfo("Frenetic Sliver", 662, Rarity.RARE, mage.cards.f.FreneticSliver.class)); @@ -680,8 +680,8 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Torbran, Thane of Red Fell", 678, Rarity.RARE, mage.cards.t.TorbranThaneOfRedFell.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ghost Quarter", 679, Rarity.RARE, mage.cards.g.GhostQuarter.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Shadowborn Apostle", 680, Rarity.RARE, mage.cards.s.ShadowbornApostle.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Shadowborn Apostle", 681, Rarity.RARE, mage.cards.s.ShadowbornApostle.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Shadowborn Apostle", "681Ph", Rarity.RARE, mage.cards.s.ShadowbornApostle.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Shadowborn Apostle", 681, Rarity.RARE, mage.cards.s.ShadowbornApostle.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Shadowborn Apostle", 682, Rarity.RARE, mage.cards.s.ShadowbornApostle.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Shadowborn Apostle", 683, Rarity.RARE, mage.cards.s.ShadowbornApostle.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Shadowborn Apostle", 684, Rarity.RARE, mage.cards.s.ShadowbornApostle.class, NON_FULL_USE_VARIOUS)); @@ -734,7 +734,7 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Seraph Sanctuary", 733, Rarity.RARE, mage.cards.s.SeraphSanctuary.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Grima Wormtongue", 734, Rarity.RARE, mage.cards.g.GrimaWormtongue.class)); cards.add(new SetCardInfo("Gaea's Blessing", 735, Rarity.RARE, mage.cards.g.GaeasBlessing.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Colossus Hammer", 736, Rarity.RARE, mage.cards.c.ColossusHammer.class)); + cards.add(new SetCardInfo("Colossus Hammer", 736, Rarity.RARE, mage.cards.c.ColossusHammer.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mountain Goat", 737, Rarity.RARE, mage.cards.m.MountainGoat.class)); cards.add(new SetCardInfo("Woodland Cemetery", 738, Rarity.RARE, mage.cards.w.WoodlandCemetery.class)); cards.add(new SetCardInfo("Isolated Chapel", 739, Rarity.RARE, mage.cards.i.IsolatedChapel.class)); @@ -811,17 +811,19 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Seven Dwarves", 813, Rarity.RARE, mage.cards.s.SevenDwarves.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Seven Dwarves", 814, Rarity.RARE, mage.cards.s.SevenDwarves.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Seven Dwarves", 815, Rarity.RARE, mage.cards.s.SevenDwarves.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Seven Dwarves", 816, Rarity.RARE, mage.cards.s.SevenDwarves.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Arcane Signet", 820, Rarity.RARE, mage.cards.a.ArcaneSignet.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Arcane Signet", "820*", Rarity.RARE, mage.cards.a.ArcaneSignet.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Echo of Eons", 821, Rarity.RARE, mage.cards.e.EchoOfEons.class, RETRO_ART)); cards.add(new SetCardInfo("Hive Mind", 822, Rarity.RARE, mage.cards.h.HiveMind.class, RETRO_ART)); cards.add(new SetCardInfo("Chaos Warp", 823, Rarity.RARE, mage.cards.c.ChaosWarp.class, RETRO_ART_USE_VARIOUS)); cards.add(new SetCardInfo("Evolving Wilds", 824, Rarity.RARE, mage.cards.e.EvolvingWilds.class, RETRO_ART_USE_VARIOUS)); - cards.add(new SetCardInfo("Goblin Bombardment", 825, Rarity.RARE, mage.cards.g.GoblinBombardment.class)); + cards.add(new SetCardInfo("Goblin Bombardment", 825, Rarity.RARE, mage.cards.g.GoblinBombardment.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Kezzerdrix", 826, Rarity.RARE, mage.cards.k.Kezzerdrix.class)); cards.add(new SetCardInfo("Norin the Wary", 827, Rarity.RARE, mage.cards.n.NorinTheWary.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Norin the Wary", "827b", Rarity.RARE, mage.cards.n.NorinTheWary.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Keen Duelist", 828, Rarity.RARE, mage.cards.k.KeenDuelist.class)); + cards.add(new SetCardInfo("Fatestitcher", 835, Rarity.RARE, mage.cards.f.Fatestitcher.class, RETRO_ART)); cards.add(new SetCardInfo("Champion of the Perished", 837, Rarity.RARE, mage.cards.c.ChampionOfThePerished.class, RETRO_ART)); cards.add(new SetCardInfo("Corpse Connoisseur", 838, Rarity.RARE, mage.cards.c.CorpseConnoisseur.class, RETRO_ART)); cards.add(new SetCardInfo("Cryptbreaker", 839, Rarity.RARE, mage.cards.c.Cryptbreaker.class, RETRO_ART)); @@ -831,13 +833,16 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Haakon, Stromgald Scourge", 843, Rarity.RARE, mage.cards.h.HaakonStromgaldScourge.class, RETRO_ART)); cards.add(new SetCardInfo("Headless Rider", 844, Rarity.RARE, mage.cards.h.HeadlessRider.class, RETRO_ART)); cards.add(new SetCardInfo("Liliana's Standard Bearer", 845, Rarity.RARE, mage.cards.l.LilianasStandardBearer.class, RETRO_ART)); + cards.add(new SetCardInfo("Mikaeus, the Unhallowed", 846, Rarity.MYTHIC, mage.cards.m.MikaeusTheUnhallowed.class, RETRO_ART_USE_VARIOUS)); cards.add(new SetCardInfo("Pontiff of Blight", 848, Rarity.RARE, mage.cards.p.PontiffOfBlight.class, RETRO_ART)); cards.add(new SetCardInfo("Ravenous Rotbelly", 849, Rarity.RARE, mage.cards.r.RavenousRotbelly.class, RETRO_ART)); cards.add(new SetCardInfo("Relentless Dead", 850, Rarity.MYTHIC, mage.cards.r.RelentlessDead.class, RETRO_ART)); + cards.add(new SetCardInfo("Rotting Regisaur", 852, Rarity.RARE, mage.cards.r.RottingRegisaur.class, RETRO_ART)); cards.add(new SetCardInfo("Tomb Tyrant", 854, Rarity.RARE, mage.cards.t.TombTyrant.class, RETRO_ART)); cards.add(new SetCardInfo("Tormod, the Desecrator", 855, Rarity.RARE, mage.cards.t.TormodTheDesecrator.class, RETRO_ART)); cards.add(new SetCardInfo("Vindictive Lich", 856, Rarity.RARE, mage.cards.v.VindictiveLich.class, RETRO_ART_USE_VARIOUS)); cards.add(new SetCardInfo("Diregraf Captain", 858, Rarity.RARE, mage.cards.d.DiregrafCaptain.class, RETRO_ART)); + cards.add(new SetCardInfo("Havengul Lich", 859, Rarity.MYTHIC, mage.cards.h.HavengulLich.class, RETRO_ART)); cards.add(new SetCardInfo("Nekusar, the Mindrazer", 860, Rarity.MYTHIC, mage.cards.n.NekusarTheMindrazer.class, RETRO_ART_USE_VARIOUS)); cards.add(new SetCardInfo("Varina, Lich Queen", 861, Rarity.MYTHIC, mage.cards.v.VarinaLichQueen.class, RETRO_ART_USE_VARIOUS)); cards.add(new SetCardInfo("Wilhelt, the Rotcleaver", 862, Rarity.MYTHIC, mage.cards.w.WilheltTheRotcleaver.class, RETRO_ART)); @@ -859,11 +864,13 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Minsc & Boo, Timeless Heroes", 879, Rarity.MYTHIC, mage.cards.m.MinscBooTimelessHeroes.class)); cards.add(new SetCardInfo("Stuffy Doll", 880, Rarity.RARE, mage.cards.s.StuffyDoll.class)); cards.add(new SetCardInfo("Silence", 881, Rarity.RARE, mage.cards.s.Silence.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Winds of Abandon", 882, Rarity.RARE, mage.cards.w.WindsOfAbandon.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Culling the Weak", 883, Rarity.RARE, mage.cards.c.CullingTheWeak.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Fatal Push", 884, Rarity.RARE, mage.cards.f.FatalPush.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Young Wolf", 885, Rarity.RARE, mage.cards.y.YoungWolf.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Solve the Equation", 886, Rarity.RARE, mage.cards.s.SolveTheEquation.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Enduring Ideal", 887, Rarity.RARE, mage.cards.e.EnduringIdeal.class)); + cards.add(new SetCardInfo("Changeling Outcast", 894, Rarity.RARE, mage.cards.c.ChangelingOutcast.class)); cards.add(new SetCardInfo("Helpful Hunter", 895, Rarity.RARE, mage.cards.h.HelpfulHunter.class)); cards.add(new SetCardInfo("Spirited Companion", 896, Rarity.RARE, mage.cards.s.SpiritedCompanion.class)); cards.add(new SetCardInfo("The Scarab God", 900, Rarity.MYTHIC, mage.cards.t.TheScarabGod.class)); @@ -874,6 +881,7 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Ignoble Hierarch", 906, Rarity.RARE, mage.cards.i.IgnobleHierarch.class)); cards.add(new SetCardInfo("Seedborn Muse", 907, Rarity.RARE, mage.cards.s.SeedbornMuse.class)); cards.add(new SetCardInfo("Arcane Signet", 908, Rarity.RARE, mage.cards.a.ArcaneSignet.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Gilded Lotus", 909, Rarity.RARE, mage.cards.g.GildedLotus.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sol Ring", 910, Rarity.RARE, mage.cards.s.SolRing.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Elspeth, Knight-Errant", 1001, Rarity.MYTHIC, mage.cards.e.ElspethKnightErrant.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Patron Wizard", 1002, Rarity.RARE, mage.cards.p.PatronWizard.class)); @@ -896,10 +904,10 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Idyllic Tutor", 1020, Rarity.RARE, mage.cards.i.IdyllicTutor.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Swords to Plowshares", 1021, Rarity.RARE, mage.cards.s.SwordsToPlowshares.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Solve the Equation", 1022, Rarity.RARE, mage.cards.s.SolveTheEquation.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Praetor's Grasp", 1023, Rarity.RARE, mage.cards.p.PraetorsGrasp.class)); + cards.add(new SetCardInfo("Praetor's Grasp", 1023, Rarity.RARE, mage.cards.p.PraetorsGrasp.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Veil of Summer", 1024, Rarity.RARE, mage.cards.v.VeilOfSummer.class)); cards.add(new SetCardInfo("Merciless Executioner", 1025, Rarity.RARE, mage.cards.m.MercilessExecutioner.class)); - cards.add(new SetCardInfo("Aggravated Assault", 1026, Rarity.RARE, mage.cards.a.AggravatedAssault.class)); + cards.add(new SetCardInfo("Aggravated Assault", 1026, Rarity.RARE, mage.cards.a.AggravatedAssault.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Krenko, Tin Street Kingpin", 1027, Rarity.RARE, mage.cards.k.KrenkoTinStreetKingpin.class)); cards.add(new SetCardInfo("Zurgo Helmsmasher", 1028, Rarity.MYTHIC, mage.cards.z.ZurgoHelmsmasher.class)); cards.add(new SetCardInfo("Skysovereign, Consul Flagship", 1029, Rarity.MYTHIC, mage.cards.s.SkysovereignConsulFlagship.class)); @@ -972,7 +980,7 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Deepglow Skate", 1093, Rarity.RARE, mage.cards.d.DeepglowSkate.class)); cards.add(new SetCardInfo("Tireless Tracker", 1094, Rarity.RARE, mage.cards.t.TirelessTracker.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Contagion Engine", 1095, Rarity.RARE, mage.cards.c.ContagionEngine.class)); - cards.add(new SetCardInfo("Sword of Truth and Justice", 1096, Rarity.MYTHIC, mage.cards.s.SwordOfTruthAndJustice.class)); + cards.add(new SetCardInfo("Sword of Truth and Justice", 1096, Rarity.MYTHIC, mage.cards.s.SwordOfTruthAndJustice.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Laboratory Maniac", 1097, Rarity.RARE, mage.cards.l.LaboratoryManiac.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Stitcher's Supplier", 1098, Rarity.RARE, mage.cards.s.StitchersSupplier.class)); cards.add(new SetCardInfo("Beast Whisperer", 1099, Rarity.RARE, mage.cards.b.BeastWhisperer.class)); @@ -1168,7 +1176,7 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Grand Abolisher", 1285, Rarity.RARE, mage.cards.g.GrandAbolisher.class)); cards.add(new SetCardInfo("Selfless Savior", 1286, Rarity.RARE, mage.cards.s.SelflessSavior.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Akroma, Angel of Fury", 1287, Rarity.MYTHIC, mage.cards.a.AkromaAngelOfFury.class)); - cards.add(new SetCardInfo("Umezawa's Jitte", 1288, Rarity.RARE, mage.cards.u.UmezawasJitte.class)); + cards.add(new SetCardInfo("Umezawa's Jitte", 1288, Rarity.RARE, mage.cards.u.UmezawasJitte.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Linvala, Keeper of Silence", 1289, Rarity.MYTHIC, mage.cards.l.LinvalaKeeperOfSilence.class)); cards.add(new SetCardInfo("Sunblast Angel", 1290, Rarity.RARE, mage.cards.s.SunblastAngel.class)); cards.add(new SetCardInfo("Emeria, the Sky Ruin", 1291, Rarity.RARE, mage.cards.e.EmeriaTheSkyRuin.class)); @@ -1346,7 +1354,7 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Fynn, the Fangbearer", 1449, Rarity.RARE, mage.cards.f.FynnTheFangbearer.class)); cards.add(new SetCardInfo("Brion Stoutarm", 1450, Rarity.RARE, mage.cards.b.BrionStoutarm.class)); cards.add(new SetCardInfo("Samut, Voice of Dissent", 1451, Rarity.MYTHIC, mage.cards.s.SamutVoiceOfDissent.class)); - cards.add(new SetCardInfo("Marchesa, the Black Rose", 1452, Rarity.RARE, mage.cards.m.MarchesaTheBlackRose.class)); + cards.add(new SetCardInfo("Marchesa, the Black Rose", 1452, Rarity.RARE, mage.cards.m.MarchesaTheBlackRose.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ajani Goldmane", 1453, Rarity.MYTHIC, mage.cards.a.AjaniGoldmane.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ajani Goldmane", "1453b", Rarity.MYTHIC, mage.cards.a.AjaniGoldmane.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Jace Beleren", 1454, Rarity.MYTHIC, mage.cards.j.JaceBeleren.class, NON_FULL_USE_VARIOUS)); @@ -1527,7 +1535,7 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Anowon, the Ruin Thief", "1568*", Rarity.MYTHIC, mage.cards.a.AnowonTheRuinThief.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Grenzo, Dungeon Warden", 1569, Rarity.RARE, mage.cards.g.GrenzoDungeonWarden.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Grenzo, Dungeon Warden", "1569*", Rarity.RARE, mage.cards.g.GrenzoDungeonWarden.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Blade of Selves", 1570, Rarity.RARE, mage.cards.b.BladeOfSelves.class)); + cards.add(new SetCardInfo("Blade of Selves", 1570, Rarity.RARE, mage.cards.b.BladeOfSelves.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Conqueror's Flail", 1571, Rarity.RARE, mage.cards.c.ConquerorsFlail.class)); cards.add(new SetCardInfo("Darksteel Plate", 1572, Rarity.RARE, mage.cards.d.DarksteelPlate.class)); cards.add(new SetCardInfo("Deathrender", 1573, Rarity.RARE, mage.cards.d.Deathrender.class)); @@ -1700,7 +1708,7 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Shivan Dragon", 1709, Rarity.RARE, mage.cards.s.ShivanDragon.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Elves of Deep Shadow", 1710, Rarity.RARE, mage.cards.e.ElvesOfDeepShadow.class)); cards.add(new SetCardInfo("Good-Fortune Unicorn", 1711, Rarity.RARE, mage.cards.g.GoodFortuneUnicorn.class)); - cards.add(new SetCardInfo("Coat of Arms", 1712, Rarity.RARE, mage.cards.c.CoatOfArms.class)); + cards.add(new SetCardInfo("Coat of Arms", 1712, Rarity.RARE, mage.cards.c.CoatOfArms.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Dictate of Erebos", 1713, Rarity.RARE, mage.cards.d.DictateOfErebos.class)); cards.add(new SetCardInfo("Fecundity", 1714, Rarity.RARE, mage.cards.f.Fecundity.class)); cards.add(new SetCardInfo("Mayhem Devil", 1715, Rarity.RARE, mage.cards.m.MayhemDevil.class)); @@ -1737,7 +1745,7 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Black Panther, Wakandan King", 1747, Rarity.MYTHIC, mage.cards.b.BlackPantherWakandanKing.class)); cards.add(new SetCardInfo("Secure the Wastes", 1748, Rarity.RARE, mage.cards.s.SecureTheWastes.class)); cards.add(new SetCardInfo("Primal Vigor", 1749, Rarity.RARE, mage.cards.p.PrimalVigor.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Heroic Intervention", 1750, Rarity.RARE, mage.cards.h.HeroicIntervention.class)); + cards.add(new SetCardInfo("Heroic Intervention", 1750, Rarity.RARE, mage.cards.h.HeroicIntervention.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Karn's Bastion", 1751, Rarity.RARE, mage.cards.k.KarnsBastion.class)); cards.add(new SetCardInfo("Deadly Rollick", 1754, Rarity.RARE, mage.cards.d.DeadlyRollick.class)); cards.add(new SetCardInfo("Saw in Half", 1755, Rarity.RARE, mage.cards.s.SawInHalf.class)); @@ -1799,7 +1807,7 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Twinflame", 1810, Rarity.RARE, mage.cards.t.Twinflame.class)); cards.add(new SetCardInfo("Genesis Chamber", 1811, Rarity.RARE, mage.cards.g.GenesisChamber.class)); cards.add(new SetCardInfo("Silence", 1816, Rarity.RARE, mage.cards.s.Silence.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Winds of Abandon", 1817, Rarity.RARE, mage.cards.w.WindsOfAbandon.class)); + cards.add(new SetCardInfo("Winds of Abandon", 1817, Rarity.RARE, mage.cards.w.WindsOfAbandon.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Culling the Weak", 1818, Rarity.RARE, mage.cards.c.CullingTheWeak.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Fatal Push", 1819, Rarity.RARE, mage.cards.f.FatalPush.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Young Wolf", 1820, Rarity.RARE, mage.cards.y.YoungWolf.class, NON_FULL_USE_VARIOUS)); @@ -1834,6 +1842,21 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Crib Swap", 1850, Rarity.UNCOMMON, mage.cards.c.CribSwap.class)); cards.add(new SetCardInfo("Homeward Path", 1851, Rarity.RARE, mage.cards.h.HomewardPath.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Go-Shintai of Life's Origin", 1853, Rarity.MYTHIC, mage.cards.g.GoShintaiOfLifesOrigin.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Day of Judgment", 1858, Rarity.RARE, mage.cards.d.DayOfJudgment.class)); + cards.add(new SetCardInfo("Temporal Extortion", 1859, Rarity.RARE, mage.cards.t.TemporalExtortion.class)); + cards.add(new SetCardInfo("Toxic Deluge", 1860, Rarity.RARE, mage.cards.t.ToxicDeluge.class)); + cards.add(new SetCardInfo("Praetor's Grasp", 1861, Rarity.RARE, mage.cards.p.PraetorsGrasp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Star of Extinction", 1862, Rarity.RARE, mage.cards.s.StarOfExtinction.class)); + cards.add(new SetCardInfo("Staff of the Storyteller", 1863, Rarity.RARE, mage.cards.s.StaffOfTheStoryteller.class)); + cards.add(new SetCardInfo("Blade of Selves", 1864, Rarity.RARE, mage.cards.b.BladeOfSelves.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Umezawa's Jitte", 1865, Rarity.RARE, mage.cards.u.UmezawasJitte.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Colossus Hammer", 1866, Rarity.RARE, mage.cards.c.ColossusHammer.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Sword of Truth and Justice", 1867, Rarity.MYTHIC, mage.cards.s.SwordOfTruthAndJustice.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Prismatic Ending", 1868, Rarity.RARE, mage.cards.p.PrismaticEnding.class)); + cards.add(new SetCardInfo("Cyclonic Rift", 1869, Rarity.RARE, mage.cards.c.CyclonicRift.class)); + cards.add(new SetCardInfo("Damn", 1870, Rarity.RARE, mage.cards.d.Damn.class)); + cards.add(new SetCardInfo("Lightning Bolt", 1871, Rarity.RARE, mage.cards.l.LightningBolt.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Heroic Intervention", 1872, Rarity.RARE, mage.cards.h.HeroicIntervention.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Aesi, Tyrant of Gyre Strait", 1873, Rarity.MYTHIC, mage.cards.a.AesiTyrantOfGyreStrait.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Aesi, Tyrant of Gyre Strait", "1873b", Rarity.MYTHIC, mage.cards.a.AesiTyrantOfGyreStrait.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Anje Falkenrath", 1874, Rarity.MYTHIC, mage.cards.a.AnjeFalkenrath.class, NON_FULL_USE_VARIOUS)); @@ -1851,7 +1874,25 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Benevolent Hydra", 1889, Rarity.RARE, mage.cards.b.BenevolentHydra.class)); cards.add(new SetCardInfo("Forgotten Ancient", 1890, Rarity.RARE, mage.cards.f.ForgottenAncient.class)); cards.add(new SetCardInfo("Animar, Soul of Elements", 1891, Rarity.MYTHIC, mage.cards.a.AnimarSoulOfElements.class)); + cards.add(new SetCardInfo("Secret Rendezvous", 1892, Rarity.RARE, mage.cards.s.SecretRendezvous.class)); + cards.add(new SetCardInfo("Serenity", 1893, Rarity.RARE, mage.cards.s.Serenity.class)); cards.add(new SetCardInfo("Esika's Chariot", 1894, Rarity.RARE, mage.cards.e.EsikasChariot.class)); + cards.add(new SetCardInfo("Realms Uncharted", 1895, Rarity.RARE, mage.cards.r.RealmsUncharted.class)); + cards.add(new SetCardInfo("Morophon, the Boundless", 1896, Rarity.MYTHIC, mage.cards.m.MorophonTheBoundless.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Raise the Palisade", 1897, Rarity.RARE, mage.cards.r.RaiseThePalisade.class)); + cards.add(new SetCardInfo("Bitterblossom", 1898, Rarity.MYTHIC, mage.cards.b.Bitterblossom.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Taurean Mauler", 1899, Rarity.RARE, mage.cards.t.TaureanMauler.class)); + cards.add(new SetCardInfo("Avenger of Zendikar", 1900, Rarity.MYTHIC, mage.cards.a.AvengerOfZendikar.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Kindred Summons", 1901, Rarity.RARE, mage.cards.k.KindredSummons.class)); + cards.add(new SetCardInfo("Tendershoot Dryad", 1902, Rarity.RARE, mage.cards.t.TendershootDryad.class)); + cards.add(new SetCardInfo("Coat of Arms", 1903, Rarity.RARE, mage.cards.c.CoatOfArms.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Maskwood Nexus", 1904, Rarity.RARE, mage.cards.m.MaskwoodNexus.class)); + cards.add(new SetCardInfo("Sol Ring", 1905, Rarity.RARE, mage.cards.s.SolRing.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Shapeshifter", 1906, Rarity.RARE, mage.cards.s.Shapeshifter.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Shapeshifter", 1907, Rarity.RARE, mage.cards.s.Shapeshifter.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Shapeshifter", 1908, Rarity.RARE, mage.cards.s.Shapeshifter.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Shapeshifter", 1909, Rarity.RARE, mage.cards.s.Shapeshifter.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Rin and Seri, Inseparable", 1910, Rarity.MYTHIC, mage.cards.r.RinAndSeriInseparable.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Karmic Guide", 1911, Rarity.RARE, mage.cards.k.KarmicGuide.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ninja of the Deep Hours", 1912, Rarity.RARE, mage.cards.n.NinjaOfTheDeepHours.class)); cards.add(new SetCardInfo("Captain Sisay", 1913, Rarity.MYTHIC, mage.cards.c.CaptainSisay.class, NON_FULL_USE_VARIOUS)); @@ -1884,11 +1925,16 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Swamp", 1941, Rarity.LAND, mage.cards.basiclands.Swamp.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Mountain", 1942, Rarity.LAND, mage.cards.basiclands.Mountain.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Forest", 1943, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Morophon, the Boundless", 1944, Rarity.MYTHIC, mage.cards.m.MorophonTheBoundless.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Big Score", 1955, Rarity.RARE, mage.cards.b.BigScore.class)); cards.add(new SetCardInfo("Final Fortune", 1956, Rarity.RARE, mage.cards.f.FinalFortune.class)); cards.add(new SetCardInfo("Heat Shimmer", 1957, Rarity.RARE, mage.cards.h.HeatShimmer.class)); cards.add(new SetCardInfo("Roiling Vortex", 1958, Rarity.RARE, mage.cards.r.RoilingVortex.class)); cards.add(new SetCardInfo("Wheel of Misfortune", 1959, Rarity.RARE, mage.cards.w.WheelOfMisfortune.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Marwyn, the Nurturer", 1960, Rarity.RARE, mage.cards.m.MarwynTheNurturer.class)); + cards.add(new SetCardInfo("Liesa, Shroud of Dusk", 1961, Rarity.RARE, mage.cards.l.LiesaShroudOfDusk.class)); + cards.add(new SetCardInfo("Oloro, Ageless Ascetic", 1962, Rarity.MYTHIC, mage.cards.o.OloroAgelessAscetic.class)); + cards.add(new SetCardInfo("Sythis, Harvest's Hand", 1963, Rarity.RARE, mage.cards.s.SythisHarvestsHand.class)); cards.add(new SetCardInfo("Parhelion II", 1964, Rarity.RARE, mage.cards.p.ParhelionII.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Parhelion II", "1964b", Rarity.RARE, mage.cards.p.ParhelionII.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mechtitan Core", 1965, Rarity.RARE, mage.cards.m.MechtitanCore.class, NON_FULL_USE_VARIOUS)); @@ -1911,15 +1957,75 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Dragonlord Ojutai", "1973b", Rarity.MYTHIC, mage.cards.d.DragonlordOjutai.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Dragonlord Silumgar", 1974, Rarity.MYTHIC, mage.cards.d.DragonlordSilumgar.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Dragonlord Silumgar", "1974b", Rarity.MYTHIC, mage.cards.d.DragonlordSilumgar.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Deadly Dispute", 1980, Rarity.RARE, mage.cards.d.DeadlyDispute.class)); + cards.add(new SetCardInfo("Murderous Rider", 1981, Rarity.RARE, mage.cards.m.MurderousRider.class)); + cards.add(new SetCardInfo("Zulaport Cutthroat", 1982, Rarity.RARE, mage.cards.z.ZulaportCutthroat.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Aggravated Assault", 1983, Rarity.RARE, mage.cards.a.AggravatedAssault.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Desperate Ritual", 1984, Rarity.RARE, mage.cards.d.DesperateRitual.class)); + cards.add(new SetCardInfo("Agent of Treachery", 2005, Rarity.RARE, mage.cards.a.AgentOfTreachery.class)); + cards.add(new SetCardInfo("Priest of Forgotten Gods", 2006, Rarity.RARE, mage.cards.p.PriestOfForgottenGods.class)); + cards.add(new SetCardInfo("Treasonous Ogre", 2007, Rarity.RARE, mage.cards.t.TreasonousOgre.class)); + cards.add(new SetCardInfo("Uncivil Unrest", 2008, Rarity.RARE, mage.cards.u.UncivilUnrest.class)); + cards.add(new SetCardInfo("Marchesa, the Black Rose", 2009, Rarity.RARE, mage.cards.m.MarchesaTheBlackRose.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ashaya, Soul of the Wild", 2014, Rarity.MYTHIC, mage.cards.a.AshayaSoulOfTheWild.class)); cards.add(new SetCardInfo("Elvish Reclaimer", 2015, Rarity.RARE, mage.cards.e.ElvishReclaimer.class)); cards.add(new SetCardInfo("Harrow", 2016, Rarity.RARE, mage.cards.h.Harrow.class)); cards.add(new SetCardInfo("World Shaper", 2017, Rarity.RARE, mage.cards.w.WorldShaper.class)); cards.add(new SetCardInfo("Horn of Greed", 2018, Rarity.RARE, mage.cards.h.HornOfGreed.class)); + cards.add(new SetCardInfo("Goblin Bombardment", 2024, Rarity.RARE, mage.cards.g.GoblinBombardment.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Orcish Lumberjack", 2025, Rarity.RARE, mage.cards.o.OrcishLumberjack.class)); + cards.add(new SetCardInfo("Constant Mists", 2026, Rarity.RARE, mage.cards.c.ConstantMists.class)); + cards.add(new SetCardInfo("Song of the Dryads", 2027, Rarity.RARE, mage.cards.s.SongOfTheDryads.class)); + cards.add(new SetCardInfo("Consecrated Sphinx", 2028, Rarity.RARE, mage.cards.c.ConsecratedSphinx.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Resculpt", 2029, Rarity.RARE, mage.cards.r.Resculpt.class)); + cards.add(new SetCardInfo("Mirage Mirror", 2030, Rarity.RARE, mage.cards.m.MirageMirror.class)); + cards.add(new SetCardInfo("Scion of Draco", 2031, Rarity.MYTHIC, mage.cards.s.ScionOfDraco.class)); + cards.add(new SetCardInfo("Lava Dart", 2037, Rarity.RARE, mage.cards.l.LavaDart.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Monastery Swiftspear", 2038, Rarity.RARE, mage.cards.m.MonasterySwiftspear.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Soul-Scar Mage", 2039, Rarity.RARE, mage.cards.s.SoulScarMage.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Underworld Breach", 2040, Rarity.RARE, mage.cards.u.UnderworldBreach.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mishra's Bauble", 2041, Rarity.RARE, mage.cards.m.MishrasBauble.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Lava Dart", 2042, Rarity.RARE, mage.cards.l.LavaDart.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Monastery Swiftspear", 2043, Rarity.RARE, mage.cards.m.MonasterySwiftspear.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Soul-Scar Mage", 2044, Rarity.RARE, mage.cards.s.SoulScarMage.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Underworld Breach", 2045, Rarity.RARE, mage.cards.u.UnderworldBreach.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mishra's Bauble", 2046, Rarity.RARE, mage.cards.m.MishrasBauble.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Chain Lightning", 2047, Rarity.RARE, mage.cards.c.ChainLightning.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Dragon's Rage Channeler", 2048, Rarity.RARE, mage.cards.d.DragonsRageChanneler.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Lava Spike", 2049, Rarity.RARE, mage.cards.l.LavaSpike.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Rift Bolt", 2050, Rarity.RARE, mage.cards.r.RiftBolt.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Skewer the Critics", 2051, Rarity.RARE, mage.cards.s.SkewerTheCritics.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Chain Lightning", 2052, Rarity.RARE, mage.cards.c.ChainLightning.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Dragon's Rage Channeler", 2053, Rarity.RARE, mage.cards.d.DragonsRageChanneler.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Lava Spike", 2054, Rarity.RARE, mage.cards.l.LavaSpike.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Rift Bolt", 2055, Rarity.RARE, mage.cards.r.RiftBolt.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Skewer the Critics", 2056, Rarity.RARE, mage.cards.s.SkewerTheCritics.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Tireless Provisioner", 2057, Rarity.RARE, mage.cards.t.TirelessProvisioner.class)); + cards.add(new SetCardInfo("Sylvan Library", 2058, Rarity.RARE, mage.cards.s.SylvanLibrary.class)); + cards.add(new SetCardInfo("Ancient Greenwarden", 2059, Rarity.MYTHIC, mage.cards.a.AncientGreenwarden.class)); + cards.add(new SetCardInfo("Expressive Iteration", 2060, Rarity.RARE, mage.cards.e.ExpressiveIteration.class)); + cards.add(new SetCardInfo("Xenagos, God of Revels", 2061, Rarity.MYTHIC, mage.cards.x.XenagosGodOfRevels.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Lightning Greaves", 2062, Rarity.RARE, mage.cards.l.LightningGreaves.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Sol Ring", 2063, Rarity.RARE, mage.cards.s.SolRing.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Cultural Exchange", 2071, Rarity.RARE, mage.cards.c.CulturalExchange.class)); + cards.add(new SetCardInfo("Folio of Fancies", 2072, Rarity.RARE, mage.cards.f.FolioOfFancies.class)); + cards.add(new SetCardInfo("Concordant Crossroads", 2073, Rarity.RARE, mage.cards.c.ConcordantCrossroads.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Rites of Flourishing", 2074, Rarity.RARE, mage.cards.r.RitesOfFlourishing.class)); + cards.add(new SetCardInfo("Font of Mythos", 2075, Rarity.RARE, mage.cards.f.FontOfMythos.class)); + cards.add(new SetCardInfo("Plains", 2076, Rarity.LAND, mage.cards.basiclands.Plains.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Island", 2077, Rarity.LAND, mage.cards.basiclands.Island.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 2078, Rarity.LAND, mage.cards.basiclands.Swamp.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 2079, Rarity.LAND, mage.cards.basiclands.Mountain.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Forest", 2080, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Feed the Swarm", 7001, Rarity.RARE, mage.cards.f.FeedTheSwarm.class)); + cards.add(new SetCardInfo("Forge Anew", 7002, Rarity.RARE, mage.cards.f.ForgeAnew.class)); + cards.add(new SetCardInfo("Silence", 7003, Rarity.RARE, mage.cards.s.Silence.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Smothering Tithe", 7009, Rarity.RARE, mage.cards.s.SmotheringTithe.class)); cards.add(new SetCardInfo("Counterspell", 7010, Rarity.RARE, mage.cards.c.Counterspell.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Dismember", 7011, Rarity.RARE, mage.cards.d.Dismember.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Command Tower", 7012, Rarity.RARE, mage.cards.c.CommandTower.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Minds Aglow", 7028, Rarity.RARE, mage.cards.m.MindsAglow.class)); + cards.add(new SetCardInfo("Command Tower", 7029, Rarity.RARE, mage.cards.c.CommandTower.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Jace, the Mind Sculptor", 8001, Rarity.MYTHIC, mage.cards.j.JaceTheMindSculptor.class)); cards.add(new SetCardInfo("Doom Blade", 9990, Rarity.RARE, mage.cards.d.DoomBlade.class)); cards.add(new SetCardInfo("Massacre", 9991, Rarity.RARE, mage.cards.m.Massacre.class)); diff --git a/Mage.Sets/src/mage/sets/SecretLairShowdown.java b/Mage.Sets/src/mage/sets/SecretLairShowdown.java index 49044f8cb02..2d6802320d5 100644 --- a/Mage.Sets/src/mage/sets/SecretLairShowdown.java +++ b/Mage.Sets/src/mage/sets/SecretLairShowdown.java @@ -25,6 +25,7 @@ public class SecretLairShowdown extends ExpansionSet { cards.add(new SetCardInfo("Dark Ritual", 16, Rarity.RARE, mage.cards.d.DarkRitual.class)); cards.add(new SetCardInfo("Death's Shadow", 8, Rarity.RARE, mage.cards.d.DeathsShadow.class)); cards.add(new SetCardInfo("Dragonlord Silumgar", 9, Rarity.MYTHIC, mage.cards.d.DragonlordSilumgar.class)); + cards.add(new SetCardInfo("Echo of Death's Wail", 356, Rarity.RARE, mage.cards.e.EchoOfDeathsWail.class)); cards.add(new SetCardInfo("Eldritch Evolution", 5, Rarity.RARE, mage.cards.e.EldritchEvolution.class)); cards.add(new SetCardInfo("Explore", 12, Rarity.RARE, mage.cards.e.Explore.class)); cards.add(new SetCardInfo("Expressive Iteration", 13, Rarity.RARE, mage.cards.e.ExpressiveIteration.class)); @@ -35,10 +36,12 @@ public class SecretLairShowdown extends ExpansionSet { cards.add(new SetCardInfo("Goblin Guide", 23, Rarity.RARE, mage.cards.g.GoblinGuide.class)); cards.add(new SetCardInfo("Island", 32, Rarity.LAND, mage.cards.basiclands.Island.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Karn Liberated", 36, Rarity.MYTHIC, mage.cards.k.KarnLiberated.class)); + cards.add(new SetCardInfo("Laughing Jasper Flint", 44, Rarity.RARE, mage.cards.l.LaughingJasperFlint.class)); cards.add(new SetCardInfo("Lightning Bolt", 21, Rarity.RARE, mage.cards.l.LightningBolt.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Lightning Bolt", 37, Rarity.RARE, mage.cards.l.LightningBolt.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Living End", 30, Rarity.MYTHIC, mage.cards.l.LivingEnd.class)); cards.add(new SetCardInfo("Mayhem Devil", 28, Rarity.RARE, mage.cards.m.MayhemDevil.class)); + cards.add(new SetCardInfo("Mountain", 34, Rarity.LAND, mage.cards.basiclands.Mountain.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Murktide Regent", 17, Rarity.MYTHIC, mage.cards.m.MurktideRegent.class)); cards.add(new SetCardInfo("Nexus of Fate", 27, Rarity.RARE, mage.cards.n.NexusOfFate.class)); cards.add(new SetCardInfo("Plains", 31, Rarity.LAND, mage.cards.basiclands.Plains.class, FULL_ART_BFZ_VARIOUS)); @@ -49,14 +52,15 @@ public class SecretLairShowdown extends ExpansionSet { cards.add(new SetCardInfo("Relentless Rats", 10, Rarity.RARE, mage.cards.r.RelentlessRats.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Relentless Rats", 11, Rarity.RARE, mage.cards.r.RelentlessRats.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Seasoned Pyromancer", 24, Rarity.MYTHIC, mage.cards.s.SeasonedPyromancer.class)); + cards.add(new SetCardInfo("Shoot the Sheriff", 43, Rarity.RARE, mage.cards.s.ShootTheSheriff.class)); cards.add(new SetCardInfo("Sleight of Hand", 25, Rarity.RARE, mage.cards.s.SleightOfHand.class)); cards.add(new SetCardInfo("Spell Pierce", 18, Rarity.RARE, mage.cards.s.SpellPierce.class)); cards.add(new SetCardInfo("Springleaf Drum", 22, Rarity.RARE, mage.cards.s.SpringleafDrum.class)); cards.add(new SetCardInfo("Sudden Edict", 39, Rarity.RARE, mage.cards.s.SuddenEdict.class)); cards.add(new SetCardInfo("Supreme Verdict", 26, Rarity.RARE, mage.cards.s.SupremeVerdict.class)); + cards.add(new SetCardInfo("Swamp", 33, Rarity.LAND, mage.cards.basiclands.Swamp.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Swords to Plowshares", 20, Rarity.RARE, mage.cards.s.SwordsToPlowshares.class)); - cards.add(new SetCardInfo("Tribute to Horobi", 356, Rarity.RARE, mage.cards.t.TributeToHorobi.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Echo of Death's Wail", 356, Rarity.RARE, mage.cards.e.EchoOfDeathsWail.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Tribute to Horobi", 356, Rarity.RARE, mage.cards.t.TributeToHorobi.class)); cards.add(new SetCardInfo("Ugin, the Spirit Dragon", 6, Rarity.MYTHIC, mage.cards.u.UginTheSpiritDragon.class)); cards.add(new SetCardInfo("Unholy Heat", 4, Rarity.RARE, mage.cards.u.UnholyHeat.class)); cards.add(new SetCardInfo("Valakut, the Molten Pinnacle", 14, Rarity.RARE, mage.cards.v.ValakutTheMoltenPinnacle.class)); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/EvokeTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/EvokeTest.java index 2797e335221..6190386f55a 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/EvokeTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/EvokeTest.java @@ -42,7 +42,7 @@ public class EvokeTest extends CardTestPlayerBase { castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Shriekmaw"); setChoice(playerA, "Cast with Evoke alternative cost: {1}{B} (source: Shriekmaw"); - setChoice(playerA, "When this permanent enters the battlefield, if its evoke cost was paid, its controller sacrifices it."); // stack triggers + setChoice(playerA, "When this permanent enters, if its evoke cost was paid, its controller sacrifices it."); // stack triggers addTarget(playerA, "Silvercoat Lion"); // choice for Shriekmaw Destroy trigger castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Exhume"); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/bbd/ComboAttackTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/bbd/ComboAttackTest.java new file mode 100644 index 00000000000..2acc03e2f9c --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/bbd/ComboAttackTest.java @@ -0,0 +1,86 @@ +package org.mage.test.cards.single.bbd; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * @author xenohedron + */ +public class ComboAttackTest extends CardTestPlayerBase { + + /** + * {@link mage.cards.c.ComboAttack Combo Attack} {2}{G} + * Sorcery + * Two target creatures your team controls each deal damage equal to their power to target creature + */ + private static final String combo = "Combo Attack"; + + @Test + public void test_Normal() { + addCard(Zone.HAND, playerA, combo, 1); + addCard(Zone.BATTLEFIELD, playerA, "Memnite", 1); + addCard(Zone.BATTLEFIELD, playerA, "Runeclaw Bear", 1); + addCard(Zone.BATTLEFIELD, playerB, "Fortress Crab", 1); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 3); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, combo, "Memnite^Runeclaw Bear^Fortress Crab"); + + setStrictChooseMode(true); + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + assertGraveyardCount(playerA, combo, 1); + assertDamageReceived(playerB, "Fortress Crab", 3); + + } + + @Test + public void test_IllegalFirst() { + addCard(Zone.HAND, playerA, combo, 1); + addCard(Zone.BATTLEFIELD, playerA, "Memnite", 1); + addCard(Zone.BATTLEFIELD, playerA, "Runeclaw Bear", 1); + addCard(Zone.BATTLEFIELD, playerB, "Fortress Crab", 1); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 3); + addCard(Zone.HAND, playerB, "Unsummon"); + addCard(Zone.BATTLEFIELD, playerB, "Island"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, combo, "Memnite^Runeclaw Bear^Fortress Crab"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Unsummon", "Memnite", combo); + + setStrictChooseMode(true); + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + assertGraveyardCount(playerA, combo, 1); + assertGraveyardCount(playerB, "Unsummon", 1); + assertHandCount(playerA, "Memnite", 1); + assertDamageReceived(playerB, "Fortress Crab", 2); + + } + + @Test + public void test_IllegalSecond() { + addCard(Zone.HAND, playerA, combo, 1); + addCard(Zone.BATTLEFIELD, playerA, "Memnite", 1); + addCard(Zone.BATTLEFIELD, playerA, "Runeclaw Bear", 1); + addCard(Zone.BATTLEFIELD, playerB, "Fortress Crab", 1); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 3); + addCard(Zone.HAND, playerB, "Unsummon"); + addCard(Zone.BATTLEFIELD, playerB, "Island"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, combo, "Memnite^Runeclaw Bear^Fortress Crab"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Unsummon", "Runeclaw Bear", combo); + + setStrictChooseMode(true); + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + assertGraveyardCount(playerA, combo, 1); + assertGraveyardCount(playerB, "Unsummon", 1); + assertHandCount(playerA, "Runeclaw Bear", 1); + assertDamageReceived(playerB, "Fortress Crab", 1); + + } +} diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/blc/RapidAugmenterTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/blc/RapidAugmenterTest.java index 14a755f7eb0..d692e7c7e6f 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/blc/RapidAugmenterTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/blc/RapidAugmenterTest.java @@ -4,14 +4,9 @@ import mage.abilities.keyword.HasteAbility; import mage.constants.PhaseStep; import mage.constants.Zone; import mage.counters.CounterType; -import mage.game.permanent.Permanent; -import org.junit.Assert; import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; -import static junit.framework.TestCase.assertEquals; -import static org.junit.Assert.fail; - /** * @author Susucr */ @@ -131,7 +126,7 @@ public class RapidAugmenterTest extends CardTestPlayerBase { castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ephemerate", true); addTarget(playerA, "Memnite"); - setChoice(playerA, "Whenever another creature you control you control enters"); // order triggers (doesnt matter the order but a choice must be made) + setChoice(playerA, "Whenever another creature you control enters"); // order triggers (doesnt matter the order but a choice must be made) attack(1, playerA, rapidAugmenter, playerB); // Rapid Augmenter can't be blocked, Alpine Watchdog wont take damage diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/lrw/MulldrifterTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/lrw/MulldrifterTest.java index f8590a7dc9a..2c48a315486 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/lrw/MulldrifterTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/lrw/MulldrifterTest.java @@ -51,7 +51,7 @@ public class MulldrifterTest extends CardTestPlayerBase { castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mulldrifter"); setChoice(playerA, "Cast with Evoke alternative cost: {2}{U} (source: Mulldrifter"); setStopAt(1, PhaseStep.BEGIN_COMBAT); - setChoice(playerA, "When this permanent enters the battlefield, if its evoke cost was paid, its controller sacrifices it"); // stack triggers + setChoice(playerA, "When this permanent enters, if its evoke cost was paid, its controller sacrifices it"); // stack triggers execute(); @@ -67,7 +67,7 @@ public class MulldrifterTest extends CardTestPlayerBase { public void testMulldrifterFlickered() { setStrictChooseMode(true); - // {4}{U} When Mulldrifter enters the battlefield, draw two cards. Evoke {2}{U} + // {4}{U} When Mulldrifter enters, draw two cards. Evoke {2}{U} addCard(Zone.BATTLEFIELD, playerA, "Mulldrifter"); // 2/2 addCard(Zone.BATTLEFIELD, playerA, "Merfolk Looter"); // 1/1 addCard(Zone.BATTLEFIELD, playerA, "Island", 5); @@ -86,4 +86,4 @@ public class MulldrifterTest extends CardTestPlayerBase { assertGraveyardCount(playerA, "Ghostly Flicker", 1); assertHandCount(playerA, 2); // should have drawn 2 cards } -} \ No newline at end of file +} diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/mh3/PheliaExuberantShepherdTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/mh3/PheliaExuberantShepherdTest.java index 1abb61f00cf..64b36e9b337 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/mh3/PheliaExuberantShepherdTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/mh3/PheliaExuberantShepherdTest.java @@ -149,4 +149,35 @@ public class PheliaExuberantShepherdTest extends CardTestPlayerBase { assertPermanentCount(playerA, "Memnite", 1); } + // bug: return trigger should not return cards exiled the turn before and not + // returned due to a Stifle effect + @Test + public void test_Stifle() { + setStrictChooseMode(true); + + addCard(Zone.BATTLEFIELD, playerA, phelia, 1); + addCard(Zone.BATTLEFIELD, playerA, "Memnite", 1); + addCard(Zone.BATTLEFIELD, playerA, "Ornithopter", 1); + addCard(Zone.HAND, playerB, "Stifle", 1); + addCard(Zone.BATTLEFIELD, playerB, "Island", 1); + + attack(1, playerA, phelia, playerB); + addTarget(playerA, "Memnite"); + + castSpell(1, PhaseStep.END_TURN, playerB, "Stifle", "stack ability (At the beginning"); + + checkExileCount("Memnite still exiled", 2, PhaseStep.POSTCOMBAT_MAIN, playerA, "Memnite", 1); + + attack(3, playerA, phelia, playerB); + addTarget(playerA, "Ornithopter"); + + // end of turn trigger: Ornithopter returns. + + setStopAt(4, PhaseStep.UPKEEP); + execute(); + + assertPowerToughness(playerA, phelia, 2 + 1, 2 + 1); + assertExileCount(playerA, "Memnite", 1); + assertPermanentCount(playerA, "Ornithopter", 1); + } } diff --git a/Mage/src/main/java/mage/abilities/common/AttacksWithCreaturesTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/AttacksWithCreaturesTriggeredAbility.java index a818d19153c..36f5196c1d5 100644 --- a/Mage/src/main/java/mage/abilities/common/AttacksWithCreaturesTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/AttacksWithCreaturesTriggeredAbility.java @@ -1,5 +1,6 @@ package mage.abilities.common; +import mage.MageItem; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; import mage.constants.Zone; @@ -23,6 +24,7 @@ public class AttacksWithCreaturesTriggeredAbility extends TriggeredAbilityImpl { // retrieve the number of attackers in triggered effects with getValue public static final String VALUEKEY_NUMBER_ATTACKERS = "number_attackers"; + public static final String VALUEKEY_NUMBER_DEFENDING_PLAYERS = "number_defending_players"; private final FilterPermanent filter; private final int minAttackers; @@ -91,6 +93,17 @@ public class AttacksWithCreaturesTriggeredAbility extends TriggeredAbilityImpl { return false; } getEffects().setValue(VALUEKEY_NUMBER_ATTACKERS, attackers.size()); + getEffects().setValue( + VALUEKEY_NUMBER_DEFENDING_PLAYERS, + attackers.stream() + .map(MageItem::getId) + .map(game.getCombat()::getDefenderId) + .distinct() + .map(game::getPlayer) + .filter(Objects::nonNull) + .mapToInt(x -> 1) + .sum() + ); if (setTargetPointer) { getEffects().setTargetPointer(new FixedTargets(new ArrayList<>(attackers), game)); } diff --git a/Mage/src/main/java/mage/abilities/condition/common/EvokedCondition.java b/Mage/src/main/java/mage/abilities/condition/common/EvokedCondition.java index fda6bed36b4..46c9a79e924 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/EvokedCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/EvokedCondition.java @@ -1,5 +1,3 @@ - - package mage.abilities.condition.common; import mage.abilities.Ability; @@ -9,17 +7,21 @@ import mage.game.Game; import mage.util.CardUtil; /** - * Checks if a the spell was cast with the alternate evoke costs + * Checks if a the spell was cast with the alternate evoke costs * * @author LevelX2 */ public enum EvokedCondition implements Condition { - instance; @Override public boolean apply(Game game, Ability source) { return CardUtil.checkSourceCostsTagExists(game, source, EvokeAbility.getActivationKey()); } + + @Override + public String toString() { + return "its evoke cost was paid"; + } } diff --git a/Mage/src/main/java/mage/abilities/condition/common/SourceHasntDealtDamageThisGameCondition.java b/Mage/src/main/java/mage/abilities/condition/common/SourceHasntDealtDamageThisGameCondition.java new file mode 100644 index 00000000000..bd34c678443 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/condition/common/SourceHasntDealtDamageThisGameCondition.java @@ -0,0 +1,34 @@ +package mage.abilities.condition.common; + +import mage.abilities.Ability; +import mage.abilities.condition.Condition; +import mage.abilities.hint.ConditionHint; +import mage.abilities.hint.Hint; +import mage.game.Game; +import mage.watchers.common.DealtDamageThisGameWatcher; + +/** + * requires DealtDamageThisGameWatcher + * + * @author TheElk801 + */ +public enum SourceHasntDealtDamageThisGameCondition implements Condition { + instance; + private static final Hint hint = new ConditionHint( + instance, "This creature hasn't dealt damage yet this game" + ); + + public static Hint getHint() { + return hint; + } + + @Override + public boolean apply(Game game, Ability source) { + return DealtDamageThisGameWatcher.checkCreature(game, source); + } + + @Override + public String toString() { + return "{this} hasn't dealt damage yet"; + } +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/ExileTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ExileTargetEffect.java index 8c404a46482..edc5433bba3 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ExileTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ExileTargetEffect.java @@ -12,9 +12,6 @@ import mage.game.permanent.Permanent; import mage.game.stack.Spell; import mage.game.stack.StackObject; import mage.players.Player; -import mage.target.Target; -import mage.target.targetpointer.FirstTargetPointer; -import mage.target.targetpointer.SecondTargetPointer; import mage.util.CardUtil; import java.util.LinkedHashSet; @@ -27,8 +24,8 @@ import java.util.UUID; public class ExileTargetEffect extends OneShotEffect { private final Zone onlyFromZone; - private String exileZone = null; - private UUID exileId = null; + protected String exileZone = null; + protected UUID exileId = null; private boolean toSourceExileZone = false; // exile the targets to a source object specific exile zone (takes care of zone change counter) private boolean withName = true; // for face down - allows to hide card name in game logs before real face down apply diff --git a/Mage/src/main/java/mage/abilities/keyword/ConspireAbility.java b/Mage/src/main/java/mage/abilities/keyword/ConspireAbility.java index 1fd68ab47dc..6349655d944 100644 --- a/Mage/src/main/java/mage/abilities/keyword/ConspireAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/ConspireAbility.java @@ -21,7 +21,6 @@ import mage.players.Player; import mage.target.common.TargetControlledPermanent; import mage.util.CardUtil; -import java.util.Objects; import java.util.UUID; /* @@ -188,13 +187,9 @@ class ConspireTriggeredAbility extends CastSourceTriggeredAbility { return false; } Spell spell = game.getStack().getSpell(event.getSourceId()); - return spell != null - && spell - .getSpellAbility() - .getAllEffects() - .stream() - .map(effect -> effect.getValue("ConspireActivation" + conspireId + addedById)) - .anyMatch(Objects::nonNull); + return spell != null && CardUtil.getEffectValueFromAbility( + spell.getSpellAbility(), "ConspireActivation" + conspireId + addedById, Boolean.class + ).orElse(false); } @Override diff --git a/Mage/src/main/java/mage/abilities/keyword/EvokeAbility.java b/Mage/src/main/java/mage/abilities/keyword/EvokeAbility.java index c14e5336849..4ca62852bbc 100644 --- a/Mage/src/main/java/mage/abilities/keyword/EvokeAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/EvokeAbility.java @@ -1,12 +1,10 @@ package mage.abilities.keyword; -import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.EvokedCondition; import mage.abilities.costs.AlternativeSourceCostsImpl; import mage.abilities.costs.Cost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.SacrificeSourceEffect; /** @@ -24,11 +22,9 @@ public class EvokeAbility extends AlternativeSourceCostsImpl { public EvokeAbility(Cost cost) { super(EVOKE_KEYWORD, REMINDER_TEXT, cost); - Ability ability = new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new SacrificeSourceEffect(true)), - EvokedCondition.instance, "When this permanent enters the battlefield, if its evoke cost was paid, its controller sacrifices it."); - ability.setRuleVisible(false); - addSubAbility(ability); + this.addSubAbility(new EntersBattlefieldTriggeredAbility( + new SacrificeSourceEffect(true).setText("its controller sacrifices it") + ).setTriggerPhrase("When this permanent enters, ").withInterveningIf(EvokedCondition.instance).setRuleVisible(false)); } private EvokeAbility(final EvokeAbility ability) { @@ -40,7 +36,7 @@ public class EvokeAbility extends AlternativeSourceCostsImpl { return new EvokeAbility(this); } - public static String getActivationKey(){ + public static String getActivationKey() { return getActivationKey(EVOKE_KEYWORD); } } diff --git a/Mage/src/main/java/mage/abilities/keyword/EvolveAbility.java b/Mage/src/main/java/mage/abilities/keyword/EvolveAbility.java index 09fb8dee62a..a80bb2c43ce 100644 --- a/Mage/src/main/java/mage/abilities/keyword/EvolveAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/EvolveAbility.java @@ -10,6 +10,7 @@ import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; +import mage.util.CardUtil; /** * FAQ 2013/01/11 @@ -75,18 +76,14 @@ public class EvolveAbility extends EntersBattlefieldAllTriggeredAbility { @Override public boolean checkInterveningIfClause(Game game) { Permanent sourcePermanent = getSourcePermanentOrLKI(game); - Permanent permanentEntering = (Permanent) this - .getEffects() - .stream() - .map(effect -> effect.getValue("permanentEnteringBattlefield")) - .findFirst() - .orElse(null); return sourcePermanent != null - && permanentEntering != null && sourcePermanent.isCreature(game) - && permanentEntering.isCreature(game) - && (permanentEntering.getPower().getValue() > sourcePermanent.getPower().getValue() - || permanentEntering.getToughness().getValue() > sourcePermanent.getToughness().getValue()); + && CardUtil + .getEffectValueFromAbility(this, "permanentEnteringBattlefield", Permanent.class) + .filter(permanent -> permanent.isCreature(game)) + .filter(permanent -> sourcePermanent.getPower().getValue() < permanent.getPower().getValue() + || sourcePermanent.getToughness().getValue() < permanent.getToughness().getValue()) + .isPresent(); } @Override diff --git a/Mage/src/main/java/mage/abilities/keyword/GiftAbility.java b/Mage/src/main/java/mage/abilities/keyword/GiftAbility.java index 7070eb9bd89..f0909d8cb47 100644 --- a/Mage/src/main/java/mage/abilities/keyword/GiftAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/GiftAbility.java @@ -6,7 +6,6 @@ import mage.abilities.StaticAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.GiftWasPromisedCondition; import mage.abilities.costs.*; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.constants.GiftType; @@ -53,11 +52,10 @@ public class GiftAbility extends StaticAbility implements OptionalAdditionalSour this.rule = additionalCost.getName() + ' ' + additionalCost.getReminderText(); this.setRuleAtTheTop(true); if (card.isPermanent()) { - this.addSubAbility(new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new PromiseGiftEffect(giftType)), - GiftWasPromisedCondition.TRUE, "When this permanent enters, " + - "if the gift was promised, they " + giftType.getDescription() + '.' - ).setRuleVisible(false)); + this.addSubAbility(new EntersBattlefieldTriggeredAbility(new PromiseGiftEffect(giftType)) + .setTriggerPhrase("When this permanent enters, ") + .withInterveningIf(GiftWasPromisedCondition.TRUE) + .setRuleVisible(false)); } else { card.getSpellAbility().addEffect(new PromiseGiftEffect(giftType)); } @@ -154,6 +152,7 @@ class PromiseGiftEffect extends OneShotEffect { PromiseGiftEffect(GiftType giftType) { super(Outcome.Benefit); this.giftType = giftType; + staticText = "they " + giftType.getDescription(); } private PromiseGiftEffect(final PromiseGiftEffect effect) { diff --git a/Mage/src/main/java/mage/abilities/keyword/OffspringAbility.java b/Mage/src/main/java/mage/abilities/keyword/OffspringAbility.java index 9888c995dde..8be10098297 100644 --- a/Mage/src/main/java/mage/abilities/keyword/OffspringAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/OffspringAbility.java @@ -7,7 +7,6 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.Condition; import mage.abilities.costs.*; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenCopyTargetEffect; import mage.constants.Outcome; @@ -43,10 +42,8 @@ public class OffspringAbility extends StaticAbility implements OptionalAdditiona this.additionalCost.setRepeatable(false); this.rule = additionalCost.getName() + ' ' + additionalCost.getReminderText(); this.setRuleAtTheTop(true); - this.addSubAbility(new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new OffspringEffect()), OffspringCondition.instance, - "When this creature enters, if its offspring cost was paid, create a 1/1 token copy of it." - ).setRuleVisible(false)); + this.addSubAbility(new EntersBattlefieldTriggeredAbility(new OffspringEffect()) + .withInterveningIf(OffspringCondition.instance).setRuleVisible(false)); } private OffspringAbility(final OffspringAbility ability) { @@ -96,6 +93,7 @@ class OffspringEffect extends OneShotEffect { OffspringEffect() { super(Outcome.Benefit); + staticText = "create a 1/1 token copy of it"; } private OffspringEffect(final OffspringEffect effect) { @@ -127,6 +125,6 @@ enum OffspringCondition implements Condition { @Override public String toString() { - return "Offspring cost was paid"; + return "its offspring cost was paid"; } } diff --git a/Mage/src/main/java/mage/abilities/keyword/RavenousAbility.java b/Mage/src/main/java/mage/abilities/keyword/RavenousAbility.java index 77cbbdc64e0..5d98d9b150b 100644 --- a/Mage/src/main/java/mage/abilities/keyword/RavenousAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/RavenousAbility.java @@ -4,7 +4,6 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.Condition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect; @@ -18,13 +17,8 @@ public class RavenousAbility extends EntersBattlefieldAbility { public RavenousAbility() { super(new EntersBattlefieldWithXCountersEffect(CounterType.P1P1.createInstance())); - Ability ability = new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1)), - RavenousAbilityCondition.instance, "When this creature enters, " + - "if X is 5 or more, draw a card" - ); - ability.setRuleVisible(false); - this.addSubAbility(ability); + this.addSubAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1)) + .withInterveningIf(RavenousAbilityCondition.instance).setRuleVisible(false)); } private RavenousAbility(final RavenousAbility ability) { @@ -50,4 +44,9 @@ enum RavenousAbilityCondition implements Condition { public boolean apply(Game game, Ability source) { return GetXValue.instance.calculate(game, source, null) >= 5; } + + @Override + public String toString() { + return "X is 5 or more"; + } } diff --git a/Mage/src/main/java/mage/game/command/emblems/LolthSpiderQueenEmblem.java b/Mage/src/main/java/mage/game/command/emblems/LolthSpiderQueenEmblem.java index b45be6875a4..9e775d88d92 100644 --- a/Mage/src/main/java/mage/game/command/emblems/LolthSpiderQueenEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/LolthSpiderQueenEmblem.java @@ -3,7 +3,6 @@ package mage.game.command.emblems; import mage.abilities.Ability; import mage.abilities.common.OneOrMoreCombatDamagePlayerTriggeredAbility; import mage.abilities.condition.Condition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.constants.Outcome; @@ -25,13 +24,9 @@ public final class LolthSpiderQueenEmblem extends Emblem { // −8: You get an emblem with "Whenever an opponent is dealt combat damage by one or more creatures you control, if that player lost less than 8 life this turn, they lose life equal to the difference." public LolthSpiderQueenEmblem() { super("Emblem Lolth"); - this.getAbilities().add(new ConditionalInterveningIfTriggeredAbility( - new OneOrMoreCombatDamagePlayerTriggeredAbility( - Zone.COMMAND, new LolthSpiderQueenEmblemEffect(), StaticFilters.FILTER_PERMANENT_CREATURES, SetTargetPointer.PLAYER, false - ), LolthSpiderQueenEmblemCondition.instance, "Whenever an opponent " + - "is dealt combat damage by one or more creatures you control, " + - "if that player lost less than 8 life this turn, they lose life equal to the difference." - )); + this.getAbilities().add(new OneOrMoreCombatDamagePlayerTriggeredAbility( + Zone.COMMAND, new LolthSpiderQueenEmblemEffect(), StaticFilters.FILTER_PERMANENT_CREATURES, SetTargetPointer.PLAYER, false + ).withInterveningIf(LolthSpiderQueenEmblemCondition.instance).setTriggerPhrase("Whenever an opponent is dealt combat damage by one or more creatures you control, ")); } private LolthSpiderQueenEmblem(final LolthSpiderQueenEmblem card) { @@ -61,12 +56,18 @@ enum LolthSpiderQueenEmblemCondition implements Condition { PlayerLostLifeWatcher watcher = game.getState().getWatcher(PlayerLostLifeWatcher.class); return player != null && watcher != null && watcher.getLifeLost(player.getId()) < 8; } + + @Override + public String toString() { + return "that player lost less than 8 life this turn"; + } } class LolthSpiderQueenEmblemEffect extends OneShotEffect { LolthSpiderQueenEmblemEffect() { super(Outcome.Benefit); + staticText = "they lose life equal to the difference"; } private LolthSpiderQueenEmblemEffect(final LolthSpiderQueenEmblemEffect effect) { diff --git a/Mage/src/main/java/mage/game/command/emblems/RadiationEmblem.java b/Mage/src/main/java/mage/game/command/emblems/RadiationEmblem.java index 9c2fcd54a1a..7f72bf4b36c 100644 --- a/Mage/src/main/java/mage/game/command/emblems/RadiationEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/RadiationEmblem.java @@ -1,10 +1,9 @@ package mage.game.command.emblems; import mage.abilities.Ability; -import mage.abilities.triggers.BeginningOfFirstMainTriggeredAbility; import mage.abilities.condition.Condition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.OneShotEffect; +import mage.abilities.triggers.BeginningOfFirstMainTriggeredAbility; import mage.cards.Cards; import mage.cards.FrameStyle; import mage.cards.repository.TokenInfo; @@ -31,12 +30,9 @@ public class RadiationEmblem extends Emblem { super("Radiation"); this.frameStyle = FrameStyle.M15_NORMAL; - this.getAbilities().add(new ConditionalInterveningIfTriggeredAbility( - new BeginningOfFirstMainTriggeredAbility(Zone.ALL, TargetController.YOU, new RadiationEffect(), false), - RadiationCondition.instance, - "At the beginning of your precombat main phase, if you have any rad counters, " - + "mill that many cards. For each nonland card milled this way, you lose 1 life and a rad counter." - )); + this.getAbilities().add(new BeginningOfFirstMainTriggeredAbility( + Zone.ALL, TargetController.YOU, new RadiationEffect(), false + ).withInterveningIf(RadiationCondition.instance).setTriggerPhrase("At the beginning of each player's precombat main phase, ")); TokenInfo foundInfo = TokenRepository.instance.findPreferredTokenInfoForXmage(TokenRepository.XMAGE_IMAGE_NAME_RADIATION, null); if (foundInfo != null) { @@ -69,6 +65,11 @@ enum RadiationCondition implements Condition { Player player = game.getPlayer(source.getControllerId()); return player != null && player.getCountersCount(CounterType.RAD) > 0; } + + @Override + public String toString() { + return "that player has one or more rad counters"; + } } /** diff --git a/Mage/src/main/java/mage/game/permanent/token/AshiokWickedManipulatorNightmareToken.java b/Mage/src/main/java/mage/game/permanent/token/AshiokWickedManipulatorNightmareToken.java index 4e2812f731c..afa3fcf91cd 100644 --- a/Mage/src/main/java/mage/game/permanent/token/AshiokWickedManipulatorNightmareToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/AshiokWickedManipulatorNightmareToken.java @@ -1,12 +1,11 @@ package mage.game.permanent.token; import mage.MageInt; -import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.abilities.condition.common.WasCardExiledThisTurnCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.hint.ConditionHint; import mage.abilities.hint.Hint; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.constants.CardType; import mage.constants.SubType; import mage.counters.CounterType; @@ -22,21 +21,16 @@ public final class AshiokWickedManipulatorNightmareToken extends TokenImpl { * /!\ You need to add CardsExiledThisTurnWatcher to any card using this token */ public AshiokWickedManipulatorNightmareToken() { - super("Nightmare Token", "1/1 black Nightmare creature tokens with \"At the beginning of combat on your turn, if a card was put into exile this turn, put a +1/+1 counter on this creature.\""); + super("Nightmare Token", "1/1 black Nightmare creature token with \"At the beginning of combat on your turn, if a card was put into exile this turn, put a +1/+1 counter on this token.\""); cardType.add(CardType.CREATURE); color.setBlack(true); subtype.add(SubType.NIGHTMARE); power = new MageInt(1); toughness = new MageInt(1); - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new BeginningOfCombatTriggeredAbility( - new AddCountersSourceEffect(CounterType.P1P1.createInstance()) - ), - WasCardExiledThisTurnCondition.instance, - "At the beginning of combat on your turn, if a card was put into exile " - + "this turn, put a +1/+1 counter on this creature." - ).addHint(hint)); + this.addAbility(new BeginningOfCombatTriggeredAbility( + new AddCountersSourceEffect(CounterType.P1P1.createInstance()) + ).withInterveningIf(WasCardExiledThisTurnCondition.instance).addHint(hint)); } private AshiokWickedManipulatorNightmareToken(final AshiokWickedManipulatorNightmareToken token) { diff --git a/Mage/src/main/java/mage/game/permanent/token/DragonMenaceAndStealArtifactToken.java b/Mage/src/main/java/mage/game/permanent/token/DragonMenaceAndStealArtifactToken.java index 09906bdad14..6b47dd7b914 100644 --- a/Mage/src/main/java/mage/game/permanent/token/DragonMenaceAndStealArtifactToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/DragonMenaceAndStealArtifactToken.java @@ -11,7 +11,7 @@ import mage.constants.Duration; import mage.constants.SubType; import mage.filter.common.FilterArtifactPermanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster; +import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster; public class DragonMenaceAndStealArtifactToken extends TokenImpl { @@ -31,7 +31,7 @@ public class DragonMenaceAndStealArtifactToken extends TokenImpl { Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new GainControlTargetEffect(Duration.EndOfGame), false, true); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster()); + ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster()); addAbility(ability); } diff --git a/Mage/src/main/java/mage/game/permanent/token/YoungHeroRoleToken.java b/Mage/src/main/java/mage/game/permanent/token/YoungHeroRoleToken.java index d73aaf07a81..04eeb1a0090 100644 --- a/Mage/src/main/java/mage/game/permanent/token/YoungHeroRoleToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/YoungHeroRoleToken.java @@ -5,7 +5,6 @@ import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.SourceMatchesFilterCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; @@ -23,7 +22,7 @@ import mage.target.common.TargetCreaturePermanent; */ public final class YoungHeroRoleToken extends TokenImpl { - private static final FilterPermanent filter = new FilterCreaturePermanent(); + private static final FilterPermanent filter = new FilterCreaturePermanent("its toughness is 3 or less"); static { filter.add(new ToughnessPredicate(ComparisonType.FEWER_THAN, 4)); @@ -45,10 +44,10 @@ public final class YoungHeroRoleToken extends TokenImpl { // Enchanted creature has "Whenever this creature attacks, if its toughness is 3 or less, put a +1/+1 counter on it." this.addAbility(new SimpleStaticAbility(new GainAbilityAttachedEffect( - new ConditionalInterveningIfTriggeredAbility( - new AttacksTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance())), - condition, "Whenever this creature attacks, if its toughness is 3 or less, put a +1/+1 counter on it." - ), AttachmentType.AURA + new AttacksTriggeredAbility( + new AddCountersSourceEffect(CounterType.P1P1.createInstance()) + .setText("put a +1/+1 counter on it") + ).withInterveningIf(condition), AttachmentType.AURA ))); } diff --git a/Mage/src/main/java/mage/target/targetadjustment/DamagedPlayerControlsTargetAdjuster.java b/Mage/src/main/java/mage/target/targetadjustment/ThatPlayerControlsTargetAdjuster.java similarity index 80% rename from Mage/src/main/java/mage/target/targetadjustment/DamagedPlayerControlsTargetAdjuster.java rename to Mage/src/main/java/mage/target/targetadjustment/ThatPlayerControlsTargetAdjuster.java index 73694ca6d41..eacea107664 100644 --- a/Mage/src/main/java/mage/target/targetadjustment/DamagedPlayerControlsTargetAdjuster.java +++ b/Mage/src/main/java/mage/target/targetadjustment/ThatPlayerControlsTargetAdjuster.java @@ -1,7 +1,6 @@ package mage.target.targetadjustment; import mage.abilities.Ability; -import mage.abilities.common.OneOrMoreDamagePlayerTriggeredAbility; import mage.filter.Filter; import mage.filter.predicate.card.OwnerIdPredicate; import mage.filter.predicate.permanent.ControllerIdPredicate; @@ -17,20 +16,20 @@ import java.util.UUID; /** * @author notgreat */ -public class DamagedPlayerControlsTargetAdjuster extends GenericTargetAdjuster { +public class ThatPlayerControlsTargetAdjuster extends GenericTargetAdjuster { private final boolean owner; /** * Use with {@link mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility} with setTargetPointer enabled, - * or {@link OneOrMoreDamagePlayerTriggeredAbility} with "SetTargetPointer.PLAYER" or similar. - * Adjusts the target to only target something the damaged player controls (or owns with alternative constructor) - * And then removes the effects' target pointer that the triggered ability set + * or {@link mage.abilities.common.OneOrMoreDamagePlayerTriggeredAbility} with "SetTargetPointer.PLAYER" or similar. + * Adjusts the target to only target something the damaged/attacked/etc. player controls (or owns with alternative constructor) + * And then removes the effects' target pointer that the triggered ability set, replacing it with the standard {@link FirstTargetPointer} */ - public DamagedPlayerControlsTargetAdjuster() { + public ThatPlayerControlsTargetAdjuster() { this(false); } - public DamagedPlayerControlsTargetAdjuster(boolean owner) { + public ThatPlayerControlsTargetAdjuster(boolean owner) { this.owner = owner; } diff --git a/Mage/src/main/java/mage/watchers/common/DealtDamageThisGameWatcher.java b/Mage/src/main/java/mage/watchers/common/DealtDamageThisGameWatcher.java new file mode 100644 index 00000000000..a537a64c7b5 --- /dev/null +++ b/Mage/src/main/java/mage/watchers/common/DealtDamageThisGameWatcher.java @@ -0,0 +1,52 @@ +package mage.watchers.common; + +import mage.MageObjectReference; +import mage.abilities.Ability; +import mage.constants.WatcherScope; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.watchers.Watcher; + +import java.util.HashSet; +import java.util.Set; + +/** + * @author TheElk801 + */ +public class DealtDamageThisGameWatcher extends Watcher { + + private final Set damagers = new HashSet<>(); + + public DealtDamageThisGameWatcher() { + super(WatcherScope.GAME); + } + + @Override + public void watch(GameEvent event, Game game) { + switch (event.getType()) { + case BEGINNING_PHASE_PRE: + // keep the stored values from getting too big, especially since it doesn't reset between games + damagers.removeIf(mor -> !mor.zoneCounterIsCurrent(game)); + return; + case DAMAGED_PERMANENT: + case DAMAGED_PLAYER: + break; + default: + return; + } + Permanent permanent = game.getPermanent(event.getSourceId()); + if (permanent != null) { + damagers.add(new MageObjectReference(permanent, game)); + } + } + + public static boolean checkCreature(Game game, Ability source) { + return game + .getState() + .getWatcher(DealtDamageThisGameWatcher.class) + .damagers + .stream() + .noneMatch(mor -> mor.refersTo(source.getSourcePermanentOrLKI(game), game)); + } +} diff --git a/Mage/src/main/resources/brackets/infinite-combos.txt b/Mage/src/main/resources/brackets/infinite-combos.txt new file mode 100644 index 00000000000..4f7fcae51af --- /dev/null +++ b/Mage/src/main/resources/brackets/infinite-combos.txt @@ -0,0 +1,9 @@ +# Infinite x2 cards combos list for commander brackets score system +# Format: card_name_1@card_name_2 - must be sorted by name, xmage compatible without non-ascii chars +# Data source: xxx +# Generated xxx +Bloodchief Ascension@Mindcrank +Zaxara, the Exemplary@Freed from the Real +Brallin, Skyshark Rider@Ophidian Eye +Krosan Restorer@Ashaya, Soul of the Wild +# TODO: generate it \ No newline at end of file diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index ba9c72b27a8..21675cca7f4 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -53980,282 +53980,424 @@ Jukai Liberator|Alchemy: Kamigawa|27|R|{2}{G}|Creature - Snake Ninja|3|3|Ninjuts Runaway Growth|Alchemy: Kamigawa|28|R|{3}{G}|Enchantment - Aura|||Starting intensity 1$Enchant land$Whenever enchanted land is tapped for mana, its controller adds an additional amount of {G} equal to Runaway Growth's intensity. Then Runaway Growth intensifies by 1.| Forceful Cultivator|Alchemy: Kamigawa|29|M|{2}{G}{G}|Creature - Snake Shaman|2|3|This spell costs {2} less to cast if there are no land cards in your hand.$When Forceful Cultivator enters the battlefield, search your library for a basic land card, put that card onto the battlefield tapped, then shuffle.| Imperial Blademaster|Alchemy: Kamigawa|30|R|{1}{R}{W}|Creature - Human Samurai|2|3|Double strike$Whenever a Samurai or Warrior you control attacks alone, draft a card from Imperial Blademaster's spellbook.| -Acrobatic Cheerleader|Duskmourn: House of Horror|1|C|{1}{W}|Creature - Human Survivor|2|2|Survival -- At the beginning of your second main phase, if Acrobatic Cheerleader is tapped, put a flying counter on it. This ability triggers only once.| -Cult Healer|Duskmourn: House of Horror|2|C|{2}{W}|Creature - Human Doctor|3|3|Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, Cult Healer gains lifelink until end of turn.| -Dazzling Theater // Prop Room|Duskmourn: House of Horror|3|R|{3}{W}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Creature spells you cast have convoke.$Prop Room${2}{W}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Untap each creature you control during each other player's untap step.| -Dollmaker's Shop // Porcelain Gallery|Duskmourn: House of Horror|4|M|{1}{W}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Whenever one or more non-Toy creatures you control attack a player, create a 1/1 white Toy artifact creature token.$Porcelain Gallery${4}{W}{W}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Creatures you control have base power and toughness each equal to the number of creatures you control.| +Acrobatic Cheerleader|Duskmourn: House of Horror|1|C|{1}{W}|Creature - Human Survivor|2|2|Survival -- At the beginning of your second main phase, if this creature is tapped, put a flying counter on it. This ability triggers only once.| +Cult Healer|Duskmourn: House of Horror|2|C|{2}{W}|Creature - Human Doctor|3|3|Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, this creature gains lifelink until end of turn.| +Dazzling Theater // Prop Room|Duskmourn: House of Horror|3|R|{3}{W}|Enchantment - Room|||Creature spells you cast have convoke.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Prop Room${2}{W}$Enchantment -- Room$Untap each creature you control during each other player's untap step.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Dollmaker's Shop // Porcelain Gallery|Duskmourn: House of Horror|4|M|{1}{W}|Enchantment - Room|||Whenever one or more non-Toy creatures you control attack a player, create a 1/1 white Toy artifact creature token.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Porcelain Gallery${4}{W}{W}$Enchantment -- Room$Creatures you control have base power and toughness each equal to the number of creatures you control.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| Emerge from the Cocoon|Duskmourn: House of Horror|5|C|{4}{W}|Sorcery|||Return target creature card from your graveyard to the battlefield. You gain 3 life.| Enduring Innocence|Duskmourn: House of Horror|6|R|{1}{W}{W}|Enchantment Creature - Sheep Glimmer|2|1|Lifelink$Whenever one or more other creatures you control with power 2 or less enter, draw a card. This ability triggers only once each turn.$When Enduring Innocence dies, if it was a creature, return it to the battlefield under its owner's control. It's an enchantment.| Ethereal Armor|Duskmourn: House of Horror|7|U|{W}|Enchantment - Aura|||Enchant creature$Enchanted creature gets +1/+1 for each enchantment you control and has first strike.| Exorcise|Duskmourn: House of Horror|8|U|{1}{W}|Sorcery|||Exile target artifact, enchantment, or creature with power 4 or greater.| -Fear of Abduction|Duskmourn: House of Horror|9|U|{4}{W}{W}|Enchantment Creature - Nightmare|5|5|As an additional cost to cast this spell, exile a creature you control.$Flying$When Fear of Abduction enters, exile target creature an opponent controls.$When Fear of Abduction leaves the battlefield, put each card exiled with it into its owner's hand.| -Fear of Immobility|Duskmourn: House of Horror|10|C|{4}{W}|Enchantment Creature - Nightmare|4|4|When Fear of Immobility enters, tap up to one target creature. If an opponent controls that creature, put a stun counter on it.| -Fear of Surveillance|Duskmourn: House of Horror|11|C|{1}{W}|Enchantment Creature - Nightmare|2|2|Vigilance$Whenever Fear of Surveillance attacks, surveil 1.| -Friendly Ghost|Duskmourn: House of Horror|12|C|{3}{W}|Creature - Spirit|2|4|Flying$When Friendly Ghost enters, target creature gets +2/+4 until end of turn.| -Ghostly Dancers|Duskmourn: House of Horror|13|R|{3}{W}{W}|Creature - Spirit|2|5|Flying$When Ghostly Dancers enters, return an enchantment card from your graveyard to your hand or unlock a locked door of a Room you control.$Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, create a 3/1 white Spirit creature token with flying.| -Glimmer Seeker|Duskmourn: House of Horror|14|U|{2}{W}|Creature - Human Survivor|3|3|Survival -- At the beginning of your second main phase, if Glimmer Seeker is tapped, draw a card if you control a Glimmer creature. If you don't control a Glimmer creature, create a 1/1 white Glimmer enchantment creature token.| -Grand Entryway // Elegant Rotunda|Duskmourn: House of Horror|15|C|{1}{W}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, create a 1/1 white Glimmer enchantment creature token.$Elegant Rotunda${2}{W}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, put a +1/+1 counter on each of up to two target creatures.| -Hardened Escort|Duskmourn: House of Horror|16|C|{2}{W}|Creature - Human Soldier|2|4|Whenever Hardened Escort attacks, another target creature you control gets +1/+0 and gains indestructible until end of turn.| +Fear of Abduction|Duskmourn: House of Horror|9|U|{4}{W}{W}|Enchantment Creature - Nightmare|5|5|As an additional cost to cast this spell, exile a creature you control.$Flying$When this creature enters, exile target creature an opponent controls.$When this creature leaves the battlefield, put each card exiled with it into its owner's hand.| +Fear of Immobility|Duskmourn: House of Horror|10|C|{4}{W}|Enchantment Creature - Nightmare|4|4|When this creature enters, tap up to one target creature. If an opponent controls that creature, put a stun counter on it.| +Fear of Surveillance|Duskmourn: House of Horror|11|C|{1}{W}|Enchantment Creature - Nightmare|2|2|Vigilance$Whenever this creature attacks, surveil 1.| +Friendly Ghost|Duskmourn: House of Horror|12|C|{3}{W}|Creature - Spirit|2|4|Flying$When this creature enters, target creature gets +2/+4 until end of turn.| +Ghostly Dancers|Duskmourn: House of Horror|13|R|{3}{W}{W}|Creature - Spirit|2|5|Flying$When this creature enters, return an enchantment card from your graveyard to your hand or unlock a locked door of a Room you control.$Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, create a 3/1 white Spirit creature token with flying.| +Glimmer Seeker|Duskmourn: House of Horror|14|U|{2}{W}|Creature - Human Survivor|3|3|Survival -- At the beginning of your second main phase, if this creature is tapped, draw a card if you control a Glimmer creature. If you don't control a Glimmer creature, create a 1/1 white Glimmer enchantment creature token.| +Grand Entryway // Elegant Rotunda|Duskmourn: House of Horror|15|C|{1}{W}|Enchantment - Room|||When you unlock this door, create a 1/1 white Glimmer enchantment creature token.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Elegant Rotunda${2}{W}$Enchantment -- Room$When you unlock this door, put a +1/+1 counter on each of up to two target creatures.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Hardened Escort|Duskmourn: House of Horror|16|C|{2}{W}|Creature - Human Soldier|2|4|Whenever this creature attacks, another target creature you control gets +1/+0 and gains indestructible until end of turn.| Jump Scare|Duskmourn: House of Horror|17|C|{W}|Instant|||Until end of turn, target creature gets +2/+2, gains flying, and becomes a Horror enchantment creature in addition to its other types.| -Leyline of Hope|Duskmourn: House of Horror|18|R|{2}{W}{W}|Enchantment|||If Leyline of Hope is in your opening hand, you may begin the game with it on the battlefield.$If you would gain life, you gain that much life plus 1 instead.$As long as you have at least 7 life more than your starting life total, creatures you control get +2/+2.| +Leyline of Hope|Duskmourn: House of Horror|18|R|{2}{W}{W}|Enchantment|||If this card is in your opening hand, you may begin the game with it on the battlefield.$If you would gain life, you gain that much life plus 1 instead.$As long as you have at least 7 life more than your starting life total, creatures you control get +2/+2.| Lionheart Glimmer|Duskmourn: House of Horror|19|U|{3}{W}{W}|Enchantment Creature - Cat Glimmer|2|5|Ward {2}$Whenever you attack, creatures you control get +1/+1 until end of turn.| -Living Phone|Duskmourn: House of Horror|20|C|{2}{W}|Artifact Creature - Toy|2|1|When Living Phone dies, look at the top five cards of your library. You may reveal a creature card with power 2 or less from among them and put it into your hand. Put the rest on the bottom of your library in a random order.| +Living Phone|Duskmourn: House of Horror|20|C|{2}{W}|Artifact Creature - Toy|2|1|When this creature dies, look at the top five cards of your library. You may reveal a creature card with power 2 or less from among them and put it into your hand. Put the rest on the bottom of your library in a random order.| Optimistic Scavenger|Duskmourn: House of Horror|21|U|{W}|Creature - Human Scout|1|1|Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, put a +1/+1 counter on target creature.| -Orphans of the Wheat|Duskmourn: House of Horror|22|U|{1}{W}|Creature - Human|2|1|Whenever Orphans of the Wheat attacks, tap any number of untapped creatures you control. Orphans of the Wheat gets +1/+1 until end of turn for each creature tapped this way.| -Overlord of the Mistmoors|Duskmourn: House of Horror|23|M|{5}{W}{W}|Enchantment Creature - Avatar Horror|6|6|Impending 4--{2}{W}{W}$Whenever Overlord of the Mistmoors enters or attacks, create two 2/1 white Insect creature tokens with flying.| -Patched Plaything|Duskmourn: House of Horror|24|U|{2}{W}|Artifact Creature - Toy|4|3|Double strike$Patched Plaything enters with two -1/-1 counters on it if you cast it from your hand.| -Possessed Goat|Duskmourn: House of Horror|25|C|{W}|Creature - Goat|1|1|{3}, Discard a card: Put three +1/+1 counters on Possessed Goat and it becomes a black Demon in addition to its other colors and types. Activate only once.| -Reluctant Role Model|Duskmourn: House of Horror|26|R|{1}{W}|Creature - Human Survivor|2|2|Survival -- At the beginning of your second main phase, if Reluctant Role Model is tapped, put a flying, lifelink, or +1/+1 counter on it.$Whenever Reluctant Role Model or another creature you control dies, if it had counters on it, put those counters on up to one target creature.| -Savior of the Small|Duskmourn: House of Horror|27|U|{3}{W}|Creature - Kor Survivor|3|4|Survival -- At the beginning of your second main phase, if Savior of the Small is tapped, return target creature card with mana value 3 or less from your graveyard to your hand.| +Orphans of the Wheat|Duskmourn: House of Horror|22|U|{1}{W}|Creature - Human|2|1|Whenever this creature attacks, tap any number of untapped creatures you control. This creature gets +1/+1 until end of turn for each creature tapped this way.| +Overlord of the Mistmoors|Duskmourn: House of Horror|23|M|{5}{W}{W}|Enchantment Creature - Avatar Horror|6|6|Impending 4--{2}{W}{W}$Whenever this permanent enters or attacks, create two 2/1 white Insect creature tokens with flying.| +Patched Plaything|Duskmourn: House of Horror|24|U|{2}{W}|Artifact Creature - Toy|4|3|Double strike$This creature enters with two -1/-1 counters on it if you cast it from your hand.| +Possessed Goat|Duskmourn: House of Horror|25|C|{W}|Creature - Goat|1|1|{3}, Discard a card: Put three +1/+1 counters on this creature and it becomes a black Demon in addition to its other colors and types. Activate only once.| +Reluctant Role Model|Duskmourn: House of Horror|26|R|{1}{W}|Creature - Human Survivor|2|2|Survival -- At the beginning of your second main phase, if this creature is tapped, put a flying, lifelink, or +1/+1 counter on it.$Whenever this creature or another creature you control dies, if it had counters on it, put those counters on up to one target creature.| +Savior of the Small|Duskmourn: House of Horror|27|U|{3}{W}|Creature - Kor Survivor|3|4|Survival -- At the beginning of your second main phase, if this creature is tapped, return target creature card with mana value 3 or less from your graveyard to your hand.| Seized from Slumber|Duskmourn: House of Horror|28|C|{4}{W}|Instant|||This spell costs {3} less to cast if it targets a tapped creature.$Destroy target creature.| -Shardmage's Rescue|Duskmourn: House of Horror|29|U|{W}|Enchantment - Aura|||Flash$Enchant creature you control$As long as Shardmage's Rescue entered this turn, enchanted creature has hexproof.$Enchanted creature gets +1/+1.| -Sheltered by Ghosts|Duskmourn: House of Horror|30|U|{1}{W}|Enchantment - Aura|||Enchant creature you control$When Sheltered by Ghosts enters, exile target nonland permanent an opponent controls until Sheltered by Ghosts leaves the battlefield.$Enchanted creature gets +1/+0 and has lifelink and ward {2}.| +Shardmage's Rescue|Duskmourn: House of Horror|29|U|{W}|Enchantment - Aura|||Flash$Enchant creature you control$As long as this Aura entered this turn, enchanted creature has hexproof.$Enchanted creature gets +1/+1.| +Sheltered by Ghosts|Duskmourn: House of Horror|30|U|{1}{W}|Enchantment - Aura|||Enchant creature you control$When this Aura enters, exile target nonland permanent an opponent controls until this Aura leaves the battlefield.$Enchanted creature gets +1/+0 and has lifelink and ward {2}.| Shepherding Spirits|Duskmourn: House of Horror|31|C|{4}{W}{W}|Creature - Spirit|4|5|Flying$Plainscycling {2}| Split Up|Duskmourn: House of Horror|32|R|{1}{W}{W}|Sorcery|||Choose one --$* Destroy all tapped creatures.$* Destroy all untapped creatures.| -Splitskin Doll|Duskmourn: House of Horror|33|U|{1}{W}|Artifact Creature - Toy|2|1|When Splitskin Doll enters, draw a card. Then discard a card unless you control another creature with power 2 or less.| -Surgical Suite // Hospital Room|Duskmourn: House of Horror|34|U|{1}{W}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, return target creature card with mana value 3 or less from your graveyard to the battlefield.$Hospital Room${3}{W}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Whenever you attack, put a +1/+1 counter on target attacking creature.| -Toby, Beastie Befriender|Duskmourn: House of Horror|35|R|{2}{W}|Legendary Creature - Human Wizard|1|1|When Toby, Beastie Befriender enters, create a 4/4 white Beast creature token with "This creature can't attack or block alone."$As long as you control four or more creature tokens, creature tokens you control have flying.| -Trapped in the Screen|Duskmourn: House of Horror|36|C|{2}{W}|Enchantment|||Ward {2}$When Trapped in the Screen enters, exile target artifact, creature, or enchantment an opponent controls until Trapped in the Screen leaves the battlefield.| -Unidentified Hovership|Duskmourn: House of Horror|37|R|{1}{W}{W}|Artifact - Vehicle|2|2|Flying$When Unidentified Hovership enters, exile up to one target creature with toughness 5 or less.$When Unidentified Hovership leaves the battlefield, the exiled card's owner manifests dread.$Crew 1| -Unsettling Twins|Duskmourn: House of Horror|38|C|{3}{W}|Creature - Human|2|2|When Unsettling Twins enters, manifest dread.| +Splitskin Doll|Duskmourn: House of Horror|33|U|{1}{W}|Artifact Creature - Toy|2|1|When this creature enters, draw a card. Then discard a card unless you control another creature with power 2 or less.| +Surgical Suite // Hospital Room|Duskmourn: House of Horror|34|U|{1}{W}|Enchantment - Room|||When you unlock this door, return target creature card with mana value 3 or less from your graveyard to the battlefield.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Hospital Room${3}{W}$Enchantment -- Room$Whenever you attack, put a +1/+1 counter on target attacking creature.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Toby, Beastie Befriender|Duskmourn: House of Horror|35|R|{2}{W}|Legendary Creature - Human Wizard|1|1|When Toby enters, create a 4/4 white Beast creature token with "This token can't attack or block alone."$As long as you control four or more creature tokens, creature tokens you control have flying.| +Trapped in the Screen|Duskmourn: House of Horror|36|C|{2}{W}|Enchantment|||Ward {2}$When this enchantment enters, exile target artifact, creature, or enchantment an opponent controls until this enchantment leaves the battlefield.| +Unidentified Hovership|Duskmourn: House of Horror|37|R|{1}{W}{W}|Artifact - Vehicle|2|2|Flying$When this Vehicle enters, exile up to one target creature with toughness 5 or less.$When this Vehicle leaves the battlefield, the exiled card's owner manifests dread.$Crew 1| +Unsettling Twins|Duskmourn: House of Horror|38|C|{3}{W}|Creature - Human|2|2|When this creature enters, manifest dread.| Unwanted Remake|Duskmourn: House of Horror|39|U|{W}|Instant|||Destroy target creature. Its controller manifests dread.| -Veteran Survivor|Duskmourn: House of Horror|40|U|{W}|Creature - Human Survivor|2|1|Survival -- At the beginning of your second main phase, if Veteran Survivor is tapped, exile up to one target card from a graveyard.$As long as there are three or more cards exiled with Veteran Survivor, it gets +3/+3 and has hexproof.| +Veteran Survivor|Duskmourn: House of Horror|40|U|{W}|Creature - Human Survivor|2|1|Survival -- At the beginning of your second main phase, if this creature is tapped, exile up to one target card from a graveyard.$As long as there are three or more cards exiled with this creature, it gets +3/+3 and has hexproof.| The Wandering Rescuer|Duskmourn: House of Horror|41|M|{3}{W}{W}|Legendary Creature - Human Samurai Noble|3|4|Flash$Convoke$Double strike$Other tapped creatures you control have hexproof.| Abhorrent Oculus|Duskmourn: House of Horror|42|M|{2}{U}|Creature - Eye|5|5|As an additional cost to cast this spell, exile six cards from your graveyard.$Flying$At the beginning of each opponent's upkeep, manifest dread.| -Bottomless Pool // Locker Room|Duskmourn: House of Horror|43|U|{U}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, return up to one target creature to its owner's hand.$Locker Room${4}{U}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Whenever one or more creatures you control deal combat damage to a player, draw a card.| -Central Elevator // Promising Stairs|Duskmourn: House of Horror|44|R|{3}{U}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, search your library for a Room card that doesn't have the same name as a Room you control, reveal it, put it into your hand, then shuffle.$Promising Stairs${2}{U}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$At the beginning of your upkeep, surveil 1. You win the game if there are eight or more different names among unlocked doors of Rooms you control.| -Clammy Prowler|Duskmourn: House of Horror|45|C|{3}{U}|Enchantment Creature - Horror|2|5|Whenever Clammy Prowler attacks, another target attacking creature can't be blocked this turn.| +Bottomless Pool // Locker Room|Duskmourn: House of Horror|43|U|{U}|Enchantment - Room|||When you unlock this door, return up to one target creature to its owner's hand.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Locker Room${4}{U}$Enchantment -- Room$Whenever one or more creatures you control deal combat damage to a player, draw a card.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Central Elevator // Promising Stairs|Duskmourn: House of Horror|44|R|{3}{U}|Enchantment - Room|||When you unlock this door, search your library for a Room card that doesn't have the same name as a Room you control, reveal it, put it into your hand, then shuffle.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Promising Stairs${2}{U}$Enchantment -- Room$At the beginning of your upkeep, surveil 1. You win the game if there are eight or more different names among unlocked doors of Rooms you control.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Clammy Prowler|Duskmourn: House of Horror|45|C|{3}{U}|Enchantment Creature - Horror|2|5|Whenever this creature attacks, another target attacking creature can't be blocked this turn.| Creeping Peeper|Duskmourn: House of Horror|46|C|{1}{U}|Creature - Eye|2|1|{T}: Add {U}. Spend this mana only to cast an enchantment spell, unlock a door, or turn a permanent face up.| -Cursed Windbreaker|Duskmourn: House of Horror|47|U|{2}{U}|Artifact - Equipment|||When Cursed Windbreaker enters, manifest dread, then attach Cursed Windbreaker to that creature.$Equipped creature has flying.$Equip {3}| +Cursed Windbreaker|Duskmourn: House of Horror|47|U|{2}{U}|Artifact - Equipment|||When this Equipment enters, manifest dread, then attach this Equipment to that creature.$Equipped creature has flying.$Equip {3}| Daggermaw Megalodon|Duskmourn: House of Horror|48|C|{4}{U}{U}|Creature - Shark|5|7|Vigilance$Islandcycling {2}| Don't Make a Sound|Duskmourn: House of Horror|49|C|{1}{U}|Instant|||Counter target spell unless its controller pays {2}. If they do, surveil 2.| Duskmourn's Domination|Duskmourn: House of Horror|50|U|{4}{U}{U}|Enchantment - Aura|||Enchant creature$You control enchanted creature.$Enchanted creature gets -3/-0 and loses all abilities.| Enduring Curiosity|Duskmourn: House of Horror|51|R|{2}{U}{U}|Enchantment Creature - Cat Glimmer|4|3|Flash$Whenever a creature you control deals combat damage to a player, draw a card.$When Enduring Curiosity dies, if it was a creature, return it to the battlefield under its owner's control. It's an enchantment.| Enter the Enigma|Duskmourn: House of Horror|52|C|{U}|Sorcery|||Target creature can't be blocked this turn.$Draw a card.| Entity Tracker|Duskmourn: House of Horror|53|R|{2}{U}|Creature - Human Scout|2|3|Flash$Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, draw a card.| -Erratic Apparition|Duskmourn: House of Horror|54|C|{2}{U}|Creature - Spirit|1|3|Flying, vigilance$Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, Erratic Apparition gets +1/+1 until end of turn.| -Fear of Failed Tests|Duskmourn: House of Horror|55|U|{4}{U}|Enchantment Creature - Nightmare|2|7|Whenever Fear of Failed Tests deals combat damage to a player, draw that many cards.| -Fear of Falling|Duskmourn: House of Horror|56|U|{3}{U}{U}|Enchantment Creature - Nightmare|4|4|Flying$Whenever Fear of Falling attacks, target creature defending player controls gets -2/-0 and loses flying until your next turn.| -Fear of Impostors|Duskmourn: House of Horror|57|U|{1}{U}{U}|Enchantment Creature - Nightmare|3|2|Flash$When Fear of Impostors enters, counter target spell. Its controller manifests dread.| +Erratic Apparition|Duskmourn: House of Horror|54|C|{2}{U}|Creature - Spirit|1|3|Flying, vigilance$Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, this creature gets +1/+1 until end of turn.| +Fear of Failed Tests|Duskmourn: House of Horror|55|U|{4}{U}|Enchantment Creature - Nightmare|2|7|Whenever this creature deals combat damage to a player, draw that many cards.| +Fear of Falling|Duskmourn: House of Horror|56|U|{3}{U}{U}|Enchantment Creature - Nightmare|4|4|Flying$Whenever this creature attacks, target creature defending player controls gets -2/-0 and loses flying until your next turn.| +Fear of Impostors|Duskmourn: House of Horror|57|U|{1}{U}{U}|Enchantment Creature - Nightmare|3|2|Flash$When this creature enters, counter target spell. Its controller manifests dread.| Fear of Isolation|Duskmourn: House of Horror|58|U|{1}{U}|Enchantment Creature - Nightmare|2|3|As an additional cost to cast this spell, return a permanent you control to its owner's hand.$Flying| -Floodpits Drowner|Duskmourn: House of Horror|59|U|{1}{U}|Creature - Merfolk|2|1|Flash$Vigilance$When Floodpits Drowner enters, tap target creature an opponent controls and put a stun counter on it.${1}{U}, {T}: Shuffle Floodpits Drowner and target creature with a stun counter on it into their owners' libraries.| +Floodpits Drowner|Duskmourn: House of Horror|59|U|{1}{U}|Creature - Merfolk|2|1|Flash$Vigilance$When this creature enters, tap target creature an opponent controls and put a stun counter on it.${1}{U}, {T}: Shuffle this creature and target creature with a stun counter on it into their owners' libraries.| Get Out|Duskmourn: House of Horror|60|U|{U}{U}|Instant|||Choose one --$* Counter target creature or enchantment spell.$* Return one or two target creatures and/or enchantments you own to your hand.| -Ghostly Keybearer|Duskmourn: House of Horror|61|U|{3}{U}|Creature - Spirit|3|3|Flying$Whenever Ghostly Keybearer deals combat damage to a player, unlock a locked door of up to one target Room you control.| +Ghostly Keybearer|Duskmourn: House of Horror|61|U|{3}{U}|Creature - Spirit|3|3|Flying$Whenever this creature deals combat damage to a player, unlock a locked door of up to one target Room you control.| Glimmerburst|Duskmourn: House of Horror|62|C|{3}{U}|Instant|||Draw two cards. Create a 1/1 white Glimmer enchantment creature token.| -Leyline of Transformation|Duskmourn: House of Horror|63|R|{2}{U}{U}|Enchantment|||If Leyline of Transformation is in your opening hand, you may begin the game with it on the battlefield.$As Leyline of Transformation enters, choose a creature type.$Creatures you control are the chosen type 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.| +Leyline of Transformation|Duskmourn: House of Horror|63|R|{2}{U}{U}|Enchantment|||If this card is in your opening hand, you may begin the game with it on the battlefield.$As this enchantment enters, choose a creature type.$Creatures you control are the chosen type 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.| Marina Vendrell's Grimoire|Duskmourn: House of Horror|64|R|{5}{U}|Legendary Artifact|||When Marina Vendrell's Grimoire enters, if you cast it, draw five cards.$You have no maximum hand size and don't lose the game for having 0 or less life.$Whenever you gain life, draw that many cards.$Whenever you lose life, discard that many cards. Then if you have no cards in hand, you lose the game.| -Meat Locker // Drowned Diner|Duskmourn: House of Horror|65|C|{2}{U}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, tap up to one target creature and put two stun counters on it.$Drowned Diner${3}{U}{U}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, draw three cards, then discard a card.| +Meat Locker // Drowned Diner|Duskmourn: House of Horror|65|C|{2}{U}|Enchantment - Room|||When you unlock this door, tap up to one target creature and put two stun counters on it.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Drowned Diner${3}{U}{U}$Enchantment -- Room$When you unlock this door, draw three cards, then discard a card.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| The Mindskinner|Duskmourn: House of Horror|66|R|{U}{U}{U}|Legendary Enchantment Creature - Nightmare|10|1|The Mindskinner can't be blocked.$If a source you control would deal damage to an opponent, prevent that damage and each opponent mills that many cards.| -Mirror Room // Fractured Realm|Duskmourn: House of Horror|67|M|{2}{U}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, create a token that's a copy of target creature you control, except it's a Reflection in addition to its other creature types.$Fractured Realm${5}{U}{U}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$If a triggered ability of a permanent you control triggers, that ability triggers an additional time.| -Overlord of the Floodpits|Duskmourn: House of Horror|68|M|{3}{U}{U}|Enchantment Creature - Avatar Horror|5|3|Impending 4--{1}{U}{U}$Flying$Whenever Overlord of the Floodpits enters or attacks, draw two cards, then discard a card.| +Mirror Room // Fractured Realm|Duskmourn: House of Horror|67|M|{2}{U}|Enchantment - Room|||When you unlock this door, create a token that's a copy of target creature you control, except it's a Reflection in addition to its other creature types.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Fractured Realm${5}{U}{U}$Enchantment -- Room$If a triggered ability of a permanent you control triggers, that ability triggers an additional time.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Overlord of the Floodpits|Duskmourn: House of Horror|68|M|{3}{U}{U}|Enchantment Creature - Avatar Horror|5|3|Impending 4--{1}{U}{U}$Flying$Whenever this permanent enters or attacks, draw two cards, then discard a card.| Paranormal Analyst|Duskmourn: House of Horror|69|U|{1}{U}|Creature - Human Detective|1|3|Whenever you manifest dread, put a card you put into your graveyard this way into your hand.| -Piranha Fly|Duskmourn: House of Horror|70|C|{1}{U}|Creature - Fish Insect|2|1|Flying$Piranha Fly enters tapped.| +Piranha Fly|Duskmourn: House of Horror|70|C|{1}{U}|Creature - Fish Insect|2|1|Flying$This creature enters tapped.| Scrabbling Skullcrab|Duskmourn: House of Horror|71|U|{U}|Creature - Crab Skeleton|0|3|Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, target player mills two cards.| -Silent Hallcreeper|Duskmourn: House of Horror|72|R|{1}{U}|Enchantment Creature - Horror|1|1|Silent Hallcreeper can't be blocked.$Whenever Silent Hallcreeper deals combat damage to a player, choose one that hasn't been chosen --$* Put two +1/+1 counters on Silent Hallcreeper.$* Draw a card.$* Silent Hallcreeper becomes a copy of another target creature you control.| -Stalked Researcher|Duskmourn: House of Horror|73|C|{1}{U}|Creature - Human Wizard|3|3|Defender$Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, Stalked Researcher can attack this turn as though it didn't have defender.| -Stay Hidden, Stay Silent|Duskmourn: House of Horror|74|U|{1}{U}|Enchantment - Aura|||Enchant creature$When Stay Hidden, Stay Silent enters, tap enchanted creature.$Enchanted creature doesn't untap during its controller's untap step.${4}{U}{U}: Shuffle enchanted creature into its owner's library, then manifest dread. Activate only as a sorcery.| +Silent Hallcreeper|Duskmourn: House of Horror|72|R|{1}{U}|Enchantment Creature - Horror|1|1|This creature can't be blocked.$Whenever this creature deals combat damage to a player, choose one that hasn't been chosen --$* Put two +1/+1 counters on this creature.$* Draw a card.$* This creature becomes a copy of another target creature you control.| +Stalked Researcher|Duskmourn: House of Horror|73|C|{1}{U}|Creature - Human Wizard|3|3|Defender$Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, this creature can attack this turn as though it didn't have defender.| +Stay Hidden, Stay Silent|Duskmourn: House of Horror|74|U|{1}{U}|Enchantment - Aura|||Enchant creature$When this Aura enters, tap enchanted creature.$Enchanted creature doesn't untap during its controller's untap step.${4}{U}{U}: Shuffle enchanted creature into its owner's library, then manifest dread. Activate only as a sorcery.| The Tale of Tamiyo|Duskmourn: House of Horror|75|R|{2}{U}|Legendary Enchantment - Saga|||(As this Saga enters and after your draw step, add a lore counter. Sacrifice after IV.)$I, II, III -- Mill two cards. If two cards that share a card type were milled this way, draw a card and repeat this process.$IV -- Exile any number of target instant, sorcery, and/or Tamiyo planeswalker cards from your graveyard. Copy them. You may cast any number of the copies.| -Tunnel Surveyor|Duskmourn: House of Horror|76|C|{2}{U}|Creature - Human Detective|2|2|When Tunnel Surveyor enters, create a 1/1 white Glimmer enchantment creature token.| +Tunnel Surveyor|Duskmourn: House of Horror|76|C|{2}{U}|Creature - Human Detective|2|2|When this creature enters, create a 1/1 white Glimmer enchantment creature token.| Twist Reality|Duskmourn: House of Horror|77|C|{1}{U}{U}|Instant|||Choose one --$* Counter target spell.$* Manifest dread.| Unable to Scream|Duskmourn: House of Horror|78|C|{U}|Enchantment - Aura|||Enchant creature$Enchanted creature loses all abilities and is a Toy artifact creature with base power and toughness 0/2 in addition to its other types.$As long as enchanted creature is face down, it can't be turned face up.| -Underwater Tunnel // Slimy Aquarium|Duskmourn: House of Horror|79|C|{U}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, surveil 2.$Slimy Aquarium${3}{U}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, manifest dread, then put a +1/+1 counter on that creature.| +Underwater Tunnel // Slimy Aquarium|Duskmourn: House of Horror|79|C|{U}|Enchantment - Room|||When you unlock this door, surveil 2.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Slimy Aquarium${3}{U}$Enchantment -- Room$When you unlock this door, manifest dread, then put a +1/+1 counter on that creature.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| Unnerving Grasp|Duskmourn: House of Horror|80|U|{2}{U}|Sorcery|||Return up to one target nonland permanent to its owner's hand. Manifest dread.| -Unwilling Vessel|Duskmourn: House of Horror|81|U|{2}{U}|Creature - Human Wizard|3|2|Vigilance$Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, put a possession counter on Unwilling Vessel.$When Unwilling Vessel dies, create an X/X blue Spirit creature token with flying, where X is the number of counters on Unwilling Vessel.| -Vanish from Sight|Duskmourn: House of Horror|82|C|{3}{U}|Instant|||Target nonland permanent's owner puts it on the top or bottom of their library. Surveil 1.| -Appendage Amalgam|Duskmourn: House of Horror|83|C|{2}{B}|Enchantment Creature - Horror|3|2|Flash$Whenever Appendage Amalgam attacks, surveil 1.| +Unwilling Vessel|Duskmourn: House of Horror|81|U|{2}{U}|Creature - Human Wizard|3|2|Vigilance$Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, put a possession counter on this creature.$When this creature dies, create an X/X blue Spirit creature token with flying, where X is the number of counters on this creature.| +Vanish from Sight|Duskmourn: House of Horror|82|C|{3}{U}|Instant|||Target nonland permanent's owner puts it on their choice of the top or bottom of their library. Surveil 1.| +Appendage Amalgam|Duskmourn: House of Horror|83|C|{2}{B}|Enchantment Creature - Horror|3|2|Flash$Whenever this creature attacks, surveil 1.| Balemurk Leech|Duskmourn: House of Horror|84|C|{1}{B}|Creature - Leech|2|2|Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, each opponent loses 1 life.| -Cackling Slasher|Duskmourn: House of Horror|85|C|{3}{B}|Creature - Human Assassin|3|3|Deathtouch$Cackling Slasher enters with a +1/+1 counter on it if a creature died this turn.| +Cackling Slasher|Duskmourn: House of Horror|85|C|{3}{B}|Creature - Human Assassin|3|3|Deathtouch$This creature enters with a +1/+1 counter on it if a creature died this turn.| Come Back Wrong|Duskmourn: House of Horror|86|R|{2}{B}|Sorcery|||Destroy target creature. If a creature card is put into a graveyard this way, return it to the battlefield under your control. Sacrifice it at the beginning of your next end step.| Commune with Evil|Duskmourn: House of Horror|87|U|{2}{B}|Sorcery|||Look at the top four cards of your library. Put one of them into your hand and the rest into your graveyard. You gain 3 life.| -Cracked Skull|Duskmourn: House of Horror|88|C|{2}{B}|Enchantment - Aura|||Enchant creature$When Cracked Skull enters, look at target player's hand. You may choose a nonland card from it. That player discards that card.$When enchanted creature is dealt damage, destroy it.| -Cynical Loner|Duskmourn: House of Horror|89|U|{1}{B}|Creature - Human Survivor|3|1|Cynical Loner can't be blocked by Glimmers.$Survival -- At the beginning of your second main phase, if Cynical Loner is tapped, you may search your library for a card, put it into your graveyard, then shuffle.| -Dashing Bloodsucker|Duskmourn: House of Horror|90|U|{3}{B}|Creature - Vampire Warrior|2|5|Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, Dashing Bloodsucker gets +2/+0 and gains lifelink until end of turn.| -Defiled Crypt // Cadaver Lab|Duskmourn: House of Horror|91|U|{3}{B}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Whenever one or more cards leave your graveyard, create a 2/2 black Horror enchantment creature token. This ability triggers only once each turn.$Cadaver Lab${B}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, return target creature card from your graveyard to your hand.| +Cracked Skull|Duskmourn: House of Horror|88|C|{2}{B}|Enchantment - Aura|||Enchant creature$When this Aura enters, look at target player's hand. You may choose a nonland card from it. That player discards that card.$When enchanted creature is dealt damage, destroy it.| +Cynical Loner|Duskmourn: House of Horror|89|U|{1}{B}|Creature - Human Survivor|3|1|This creature can't be blocked by Glimmers.$Survival -- At the beginning of your second main phase, if this creature is tapped, you may search your library for a card, put it into your graveyard, then shuffle.| +Dashing Bloodsucker|Duskmourn: House of Horror|90|U|{3}{B}|Creature - Vampire Warrior|2|5|Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, this creature gets +2/+0 and gains lifelink until end of turn.| +Defiled Crypt // Cadaver Lab|Duskmourn: House of Horror|91|U|{3}{B}|Enchantment - Room|||Whenever one or more cards leave your graveyard, create a 2/2 black Horror enchantment creature token. This ability triggers only once each turn.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Cadaver Lab${B}$Enchantment -- Room$When you unlock this door, return target creature card from your graveyard to your hand.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| Demonic Counsel|Duskmourn: House of Horror|92|R|{1}{B}|Sorcery|||Search your library for a Demon card, reveal it, put it into your hand, then shuffle.$Delirium -- If there are four or more card types among cards in your graveyard, instead search your library for any card, put it into your hand, then shuffle.| -Derelict Attic // Widow's Walk|Duskmourn: House of Horror|93|C|{2}{B}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, you draw two cards and you lose 2 life.$Widow's Walk${3}{B}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Whenever a creature you control attacks alone, it gets +1/+0 and gains deathtouch until end of turn.| -Doomsday Excruciator|Duskmourn: House of Horror|94|R|{B}{B}{B}{B}{B}{B}|Creature - Demon|6|6|Flying$When Doomsday Excruciator enters, if it was cast, each player exiles all but the bottom six cards of their library face down.$At the beginning of your upkeep, draw a card.| +Derelict Attic // Widow's Walk|Duskmourn: House of Horror|93|C|{2}{B}|Enchantment - Room|||When you unlock this door, you draw two cards and you lose 2 life.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Widow's Walk${3}{B}$Enchantment -- Room$Whenever a creature you control attacks alone, it gets +1/+0 and gains deathtouch until end of turn.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Doomsday Excruciator|Duskmourn: House of Horror|94|R|{B}{B}{B}{B}{B}{B}|Creature - Demon|6|6|Flying$When this creature enters, if it was cast, each player exiles all but the bottom six cards of their library face down.$At the beginning of your upkeep, draw a card.| Enduring Tenacity|Duskmourn: House of Horror|95|R|{2}{B}{B}|Enchantment Creature - Snake Glimmer|4|3|Whenever you gain life, target opponent loses that much life.$When Enduring Tenacity dies, if it was a creature, return it to the battlefield under its owner's control. It's an enchantment.| -Fanatic of the Harrowing|Duskmourn: House of Horror|96|C|{3}{B}|Creature - Human Cleric|2|2|When Fanatic of the Harrowing enters, each player discards a card. If you discarded a card this way, draw a card.| -Fear of Lost Teeth|Duskmourn: House of Horror|97|C|{B}|Enchantment Creature - Nightmare|1|1|When Fear of Lost Teeth dies, it deals 1 damage to any target and you gain 1 life.| -Fear of the Dark|Duskmourn: House of Horror|98|C|{4}{B}|Enchantment Creature - Nightmare|5|5|Whenever Fear of the Dark attacks, if defending player controls no Glimmer creatures, it gains menace and deathtouch until end of turn.| +Fanatic of the Harrowing|Duskmourn: House of Horror|96|C|{3}{B}|Creature - Human Cleric|2|2|When this creature enters, each player discards a card. If you discarded a card this way, draw a card.| +Fear of Lost Teeth|Duskmourn: House of Horror|97|C|{B}|Enchantment Creature - Nightmare|1|1|When this creature dies, it deals 1 damage to any target and you gain 1 life.| +Fear of the Dark|Duskmourn: House of Horror|98|C|{4}{B}|Enchantment Creature - Nightmare|5|5|Whenever this creature attacks, if defending player controls no Glimmer creatures, it gains menace and deathtouch until end of turn.| Final Vengeance|Duskmourn: House of Horror|99|C|{B}|Sorcery|||As an additional cost to cast this spell, sacrifice a creature or enchantment.$Exile target creature.| -Funeral Room // Awakening Hall|Duskmourn: House of Horror|100|M|{2}{B}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life.$Awakening Hall${6}{B}{B}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, return all creature cards from your graveyard to the battlefield.| +Funeral Room // Awakening Hall|Duskmourn: House of Horror|100|M|{2}{B}|Enchantment - Room|||Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Awakening Hall${6}{B}{B}$Enchantment -- Room$When you unlock this door, return all creature cards from your graveyard to the battlefield.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| Give In to Violence|Duskmourn: House of Horror|101|C|{1}{B}|Instant|||Target creature gets +2/+2 and gains lifelink until end of turn.| Grievous Wound|Duskmourn: House of Horror|102|R|{3}{B}{B}|Enchantment - Aura|||Enchant player$Enchanted player can't gain life.$Whenever enchanted player is dealt damage, they lose half their life, rounded up.| -Innocuous Rat|Duskmourn: House of Horror|103|C|{1}{B}|Creature - Rat|1|1|When Innocuous Rat dies, manifest dread.| -Killer's Mask|Duskmourn: House of Horror|104|U|{2}{B}|Artifact - Equipment|||When Killer's Mask enters, manifest dread, then attach Killer's Mask to that creature.$Equipped creature has menace.$Equip {2}| +Innocuous Rat|Duskmourn: House of Horror|103|C|{1}{B}|Creature - Rat|1|1|When this creature dies, manifest dread.| +Killer's Mask|Duskmourn: House of Horror|104|U|{2}{B}|Artifact - Equipment|||When this Equipment enters, manifest dread, then attach this Equipment to that creature.$Equipped creature has menace.$Equip {2}| Let's Play a Game|Duskmourn: House of Horror|105|U|{3}{B}|Sorcery|||Delirium -- Choose one. If there are four or more card types among cards in your graveyard, choose one or more instead.$* Creatures your opponents control get -1/-1 until end of turn.$* Each opponent discards two cards.$* Each opponent loses 3 life and you gain 3 life.| -Leyline of the Void|Duskmourn: House of Horror|106|R|{2}{B}{B}|Enchantment|||If Leyline of the Void is in your opening hand, you may begin the game with it on the battlefield.$If a card would be put into an opponent's graveyard from anywhere, exile it instead.| +Leyline of the Void|Duskmourn: House of Horror|106|R|{2}{B}{B}|Enchantment|||If this card is in your opening hand, you may begin the game with it on the battlefield.$If a card would be put into an opponent's graveyard from anywhere, exile it instead.| Live or Die|Duskmourn: House of Horror|107|U|{3}{B}{B}|Instant|||Choose one --$* Return target creature card from your graveyard to the battlefield.$* Destroy target creature.| -Meathook Massacre II|Duskmourn: House of Horror|108|M|{X}{X}{B}{B}{B}{B}|Legendary Enchantment|||When Meathook Massacre II enters, each player sacrifices X creatures.$Whenever a creature you control dies, you may pay 3 life. If you do, return that card under your control with a finality counter on it.$Whenever a creature an opponent controls dies, they may pay 3 life. If they don't, return that card under your control with a finality counter on it.| -Miasma Demon|Duskmourn: House of Horror|109|U|{4}{B}{B}|Creature - Demon|5|4|Flying$When Miasma Demon enters, you may discard any number of cards. When you do, up to that many target creatures each get -2/-2 until end of turn.| +Meathook Massacre II|Duskmourn: House of Horror|108|M|{X}{X}{B}{B}{B}{B}|Legendary Enchantment|||When Meathook Massacre II enters, each player sacrifices X creatures of their choice.$Whenever a creature you control dies, you may pay 3 life. If you do, return that card under your control with a finality counter on it.$Whenever a creature an opponent controls dies, they may pay 3 life. If they don't, return that card under your control with a finality counter on it.| +Miasma Demon|Duskmourn: House of Horror|109|U|{4}{B}{B}|Creature - Demon|5|4|Flying$When this creature enters, you may discard any number of cards. When you do, up to that many target creatures each get -2/-2 until end of turn.| Murder|Duskmourn: House of Horror|110|C|{1}{B}{B}|Instant|||Destroy target creature.| -Nowhere to Run|Duskmourn: House of Horror|111|U|{1}{B}|Enchantment|||Flash$When Nowhere to Run enters, target creature an opponent controls gets -3/-3 until end of turn.$Creatures your opponents control can be the targets of spells and abilities as though they didn't have hexproof. Ward abilities of those creatures don't trigger.| -Osseous Sticktwister|Duskmourn: House of Horror|112|U|{1}{B}|Artifact Creature - Scarecrow|2|2|Lifelink$Delirium -- At the beginning of your end step, if there are four or more card types among cards in your graveyard, each opponent may sacrifice a nonland permanent or discard a card. Then Osseous Sticktwister deals damage equal to its power to each opponent who didn't sacrifice a permanent or discard a card this way.| -Overlord of the Balemurk|Duskmourn: House of Horror|113|M|{3}{B}{B}|Enchantment Creature - Avatar Horror|5|5|Impending 5--{1}{B}$Whenever Overlord of the Balemurk enters or attacks, mill four cards, then you may return a non-Avatar creature card or a planeswalker card from your graveyard to your hand.| -Popular Egotist|Duskmourn: House of Horror|114|U|{2}{B}|Creature - Human Rogue|3|2|{1}{B}, Sacrifice another creature or enchantment: Popular Egotist gains indestructible until end of turn. Tap it.$Whenever you sacrifice a permanent, target opponent loses 1 life and you gain 1 life.| -Resurrected Cultist|Duskmourn: House of Horror|115|C|{2}{B}|Creature - Human Cleric|4|1|Delirium -- {2}{B}{B}: Return Resurrected Cultist from your graveyard to the battlefield with a finality counter on it. Activate only if there are four or more card types among cards in your graveyard and only as a sorcery.| +Nowhere to Run|Duskmourn: House of Horror|111|U|{1}{B}|Enchantment|||Flash$When this enchantment enters, target creature an opponent controls gets -3/-3 until end of turn.$Creatures your opponents control can be the targets of spells and abilities as though they didn't have hexproof. Ward abilities of those creatures don't trigger.| +Osseous Sticktwister|Duskmourn: House of Horror|112|U|{1}{B}|Artifact Creature - Scarecrow|2|2|Lifelink$Delirium -- At the beginning of your end step, if there are four or more card types among cards in your graveyard, each opponent may sacrifice a nonland permanent of their choice or discard a card. Then this creature deals damage equal to its power to each opponent who didn't sacrifice a permanent or discard a card this way.| +Overlord of the Balemurk|Duskmourn: House of Horror|113|M|{3}{B}{B}|Enchantment Creature - Avatar Horror|5|5|Impending 5--{1}{B}$Whenever this permanent enters or attacks, mill four cards, then you may return a non-Avatar creature card or a planeswalker card from your graveyard to your hand.| +Popular Egotist|Duskmourn: House of Horror|114|U|{2}{B}|Creature - Human Rogue|3|2|{1}{B}, Sacrifice another creature or enchantment: This creature gains indestructible until end of turn. Tap it.$Whenever you sacrifice a permanent, target opponent loses 1 life and you gain 1 life.| +Resurrected Cultist|Duskmourn: House of Horror|115|C|{2}{B}|Creature - Human Cleric|4|1|Delirium -- {2}{B}{B}: Return this card from your graveyard to the battlefield with a finality counter on it. Activate only if there are four or more card types among cards in your graveyard and only as a sorcery.| Spectral Snatcher|Duskmourn: House of Horror|116|C|{4}{B}{B}|Creature - Spirit|6|5|Ward--Discard a card.$Swampcycling {2}| -Sporogenic Infection|Duskmourn: House of Horror|117|U|{1}{B}|Enchantment - Aura|||Enchant creature$When Sporogenic Infection enters, target player sacrifices a creature other than enchanted creature.$When enchanted creature is dealt damage, destroy it.| -Unholy Annex // Ritual Chamber|Duskmourn: House of Horror|118|R|{2}{B}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$At the beginning of your end step, draw a card. If you control a Demon, each opponent loses 2 life and you gain 2 life. Otherwise, you lose 2 life.$Ritual Chamber${3}{B}{B}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, create a 6/6 black Demon creature token with flying.| -Unstoppable Slasher|Duskmourn: House of Horror|119|R|{2}{B}|Creature - Zombie Assassin|2|3|Deathtouch$Whenever Unstoppable Slasher deals combat damage to a player, they lose half their life, rounded up.$When Unstoppable Slasher dies, if it had no counters on it, return it to the battlefield tapped under its owner's control with two stun counters on it.| +Sporogenic Infection|Duskmourn: House of Horror|117|U|{1}{B}|Enchantment - Aura|||Enchant creature$When this Aura enters, target player sacrifices a creature of their choice other than enchanted creature.$When enchanted creature is dealt damage, destroy it.| +Unholy Annex // Ritual Chamber|Duskmourn: House of Horror|118|R|{2}{B}|Enchantment - Room|||At the beginning of your end step, draw a card. If you control a Demon, each opponent loses 2 life and you gain 2 life. Otherwise, you lose 2 life.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Ritual Chamber${3}{B}{B}$Enchantment -- Room$When you unlock this door, create a 6/6 black Demon creature token with flying.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Unstoppable Slasher|Duskmourn: House of Horror|119|R|{2}{B}|Creature - Zombie Assassin|2|3|Deathtouch$Whenever this creature deals combat damage to a player, they lose half their life, rounded up.$When this creature dies, if it had no counters on it, return it to the battlefield tapped under its owner's control with two stun counters on it.| Valgavoth, Terror Eater|Duskmourn: House of Horror|120|M|{6}{B}{B}{B}|Legendary Creature - Elder Demon|9|9|Flying, lifelink$Ward--Sacrifice three nonland permanents.$If a card you didn't control would be put into an opponent's graveyard from anywhere, exile it instead.$During your turn, you may play cards exiled with Valgavoth. If you cast a spell this way, pay life equal to its mana value rather than pay its mana cost.| -Valgavoth's Faithful|Duskmourn: House of Horror|121|U|{B}|Creature - Human Cleric|1|1|{3}{B}, Sacrifice Valgavoth's Faithful: Return target creature card from your graveyard to the battlefield. Activate only as a sorcery.| -Vile Mutilator|Duskmourn: House of Horror|122|U|{5}{B}{B}|Creature - Demon|6|5|As an additional cost to cast this spell, sacrifice a creature or enchantment.$Flying, trample$When Vile Mutilator enters, each opponent sacrifices a nontoken enchantment, then sacrifices a nontoken creature.| +Valgavoth's Faithful|Duskmourn: House of Horror|121|U|{B}|Creature - Human Cleric|1|1|{3}{B}, Sacrifice this creature: Return target creature card from your graveyard to the battlefield. Activate only as a sorcery.| +Vile Mutilator|Duskmourn: House of Horror|122|U|{5}{B}{B}|Creature - Demon|6|5|As an additional cost to cast this spell, sacrifice a creature or enchantment.$Flying, trample$When this creature enters, each opponent sacrifices a nontoken enchantment of their choice, then sacrifices a nontoken creature of their choice.| Winter's Intervention|Duskmourn: House of Horror|123|C|{1}{B}|Instant|||Winter's Intervention deals 2 damage to target creature. You gain 2 life.| Withering Torment|Duskmourn: House of Horror|124|U|{2}{B}|Instant|||Destroy target creature or enchantment. You lose 2 life.| Bedhead Beastie|Duskmourn: House of Horror|125|C|{4}{R}{R}|Creature - Beast|5|6|Menace$Mountaincycling {2}| Betrayer's Bargain|Duskmourn: House of Horror|126|U|{1}{R}|Instant|||As an additional cost to cast this spell, sacrifice a creature or enchantment or pay {2}.$Betrayer's Bargain deals 5 damage to target creature. If that creature would die this turn, exile it instead.| -Boilerbilges Ripper|Duskmourn: House of Horror|127|C|{4}{R}|Creature - Human Assassin|4|4|When Boilerbilges Ripper enters, you may sacrifice another creature or enchantment. When you do, Boilerbilges Ripper deals 2 damage to any target.| -Chainsaw|Duskmourn: House of Horror|128|R|{1}{R}|Artifact - Equipment|||When Chainsaw enters, it deals 3 damage to up to one target creature.$Whenever one or more creatures die, put a rev counter on Chainsaw.$Equipped creature gets +X/+0, where X is the number of rev counters on Chainsaw.$Equip {3}| -Charred Foyer // Warped Space|Duskmourn: House of Horror|129|M|{3}{R}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$At the beginning of your upkeep, exile the top card of your library. You may play that card this turn.$Warped Space${4}{R}{R}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Once each turn, you may pay {0} rather than pay the mana cost for a spell you cast from exile.| -Clockwork Percussionist|Duskmourn: House of Horror|130|C|{R}|Artifact Creature - Monkey Toy|1|1|Haste$When Clockwork Percussionist dies, exile the top card of your library. You may play it until the end of your next turn.| -Cursed Recording|Duskmourn: House of Horror|131|R|{2}{R}{R}|Artifact|||Whenever you cast an instant or sorcery spell, put a time counter on Cursed Recording. Then if there are seven or more time counters on it, remove those counters and it deals 20 damage to you.${T}: When you next cast an instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy.| +Boilerbilges Ripper|Duskmourn: House of Horror|127|C|{4}{R}|Creature - Human Assassin|4|4|When this creature enters, you may sacrifice another creature or enchantment. When you do, this creature deals 2 damage to any target.| +Chainsaw|Duskmourn: House of Horror|128|R|{1}{R}|Artifact - Equipment|||When this Equipment enters, it deals 3 damage to up to one target creature.$Whenever one or more creatures die, put a rev counter on this Equipment.$Equipped creature gets +X/+0, where X is the number of rev counters on this Equipment.$Equip {3}| +Charred Foyer // Warped Space|Duskmourn: House of Horror|129|M|{3}{R}|Enchantment - Room|||At the beginning of your upkeep, exile the top card of your library. You may play it this turn.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Warped Space${4}{R}{R}$Enchantment -- Room$Once each turn, you may pay {0} rather than pay the mana cost for a spell you cast from exile.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Clockwork Percussionist|Duskmourn: House of Horror|130|C|{R}|Artifact Creature - Monkey Toy|1|1|Haste$When this creature dies, exile the top card of your library. You may play it until the end of your next turn.| +Cursed Recording|Duskmourn: House of Horror|131|R|{2}{R}{R}|Artifact|||Whenever you cast an instant or sorcery spell, put a time counter on this artifact. Then if there are seven or more time counters on it, remove those counters and it deals 20 damage to you.${T}: When you next cast an instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy.| Diversion Specialist|Duskmourn: House of Horror|132|U|{3}{R}|Creature - Human Warrior|4|3|Menace${1}, Sacrifice another creature or enchantment: Exile the top card of your library. You may play it this turn.| Enduring Courage|Duskmourn: House of Horror|133|R|{2}{R}{R}|Enchantment Creature - Dog Glimmer|3|3|Whenever another creature you control enters, it gets +2/+0 and gains haste until end of turn.$When Enduring Courage dies, if it was a creature, return it to the battlefield under its owner's control. It's an enchantment.| -Fear of Being Hunted|Duskmourn: House of Horror|134|U|{1}{R}{R}|Enchantment Creature - Nightmare|4|2|Haste$Fear of Being Hunted must be blocked if able.| -Fear of Burning Alive|Duskmourn: House of Horror|135|U|{4}{R}{R}|Enchantment Creature - Nightmare|4|4|When Fear of Burning Alive enters, it deals 4 damage to each opponent.$Delirium -- Whenever a source you control deals noncombat damage to an opponent, if there are four or more card types among cards in your graveyard, Fear of Burning Alive deals that amount of damage to target creature that player controls.| -Fear of Missing Out|Duskmourn: House of Horror|136|R|{1}{R}|Enchantment Creature - Nightmare|2|3|When Fear of Missing Out enters, discard a card, then draw a card.$Delirium -- Whenever Fear of Missing Out attacks for the first time each turn, if there are four or more card types among cards in your graveyard, untap target creature. After this phase, there is an additional combat phase.| -Glassworks // Shattered Yard|Duskmourn: House of Horror|137|C|{2}{R}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, this Room deals 4 damage to target creature an opponent controls.$Shattered Yard${4}{R}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$At the beginning of your end step, this Room deals 1 damage to each opponent.| +Fear of Being Hunted|Duskmourn: House of Horror|134|U|{1}{R}{R}|Enchantment Creature - Nightmare|4|2|Haste$This creature must be blocked if able.| +Fear of Burning Alive|Duskmourn: House of Horror|135|U|{4}{R}{R}|Enchantment Creature - Nightmare|4|4|When this creature enters, it deals 4 damage to each opponent.$Delirium -- Whenever a source you control deals noncombat damage to an opponent, if there are four or more card types among cards in your graveyard, this creature deals that amount of damage to target creature that player controls.| +Fear of Missing Out|Duskmourn: House of Horror|136|R|{1}{R}|Enchantment Creature - Nightmare|2|3|When this creature enters, discard a card, then draw a card.$Delirium -- Whenever this creature attacks for the first time each turn, if there are four or more card types among cards in your graveyard, untap target creature. After this phase, there is an additional combat phase.| +Glassworks // Shattered Yard|Duskmourn: House of Horror|137|C|{2}{R}|Enchantment - Room|||When you unlock this door, this Room deals 4 damage to target creature an opponent controls.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Shattered Yard${4}{R}$Enchantment -- Room$At the beginning of your end step, this Room deals 1 damage to each opponent.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| Grab the Prize|Duskmourn: House of Horror|138|C|{1}{R}|Sorcery|||As an additional cost to cast this spell, discard a card.$Draw two cards. If the discarded card wasn't a land card, Grab the Prize deals 2 damage to each opponent.| -Hand That Feeds|Duskmourn: House of Horror|139|C|{1}{R}|Creature - Mutant|2|2|Delirium -- Whenever Hand That Feeds attacks while there are four or more card types among cards in your graveyard, it gets +2/+0 and gains menace until end of turn.| +Hand That Feeds|Duskmourn: House of Horror|139|C|{1}{R}|Creature - Mutant|2|2|Delirium -- Whenever this creature attacks while there are four or more card types among cards in your graveyard, it gets +2/+0 and gains menace until end of turn.| Impossible Inferno|Duskmourn: House of Horror|140|C|{4}{R}|Instant|||Impossible Inferno deals 6 damage to target creature.$Delirium -- If there are four or more card types among cards in your graveyard, exile the top card of your library. You may play it until the end of your next turn.| -Infernal Phantom|Duskmourn: House of Horror|141|U|{3}{R}|Creature - Spirit|2|3|Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, Infernal Phantom gets +2/+0 until end of turn.$When Infernal Phantom dies, it deals damage equal to its power to any target.| +Infernal Phantom|Duskmourn: House of Horror|141|U|{3}{R}|Creature - Spirit|2|3|Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, this creature gets +2/+0 until end of turn.$When this creature dies, it deals damage equal to its power to any target.| Irreverent Gremlin|Duskmourn: House of Horror|142|U|{1}{R}|Creature - Gremlin|2|2|Menace$Whenever another creature you control with power 2 or less enters, you may discard a card. If you do, draw a card. Do this only once each turn.| -Leyline of Resonance|Duskmourn: House of Horror|143|R|{2}{R}{R}|Enchantment|||If Leyline of Resonance is in your opening hand, you may begin the game with it on the battlefield.$Whenever you cast an instant or sorcery spell that targets only a single creature you control, copy that spell. You may choose new targets for the copy.| +A-Leyline of Resonance|Duskmourn: House of Horror|A-143|R|{2}{R}{R}|Enchantment|||If this card is in your opening hand, you may begin the game with it on the battlefield.$Whenever you cast an instant or sorcery spell that targets only a single creature you control, you may pay {1}. If you do, copy that spell. You may choose new targets for the copy.| +Leyline of Resonance|Duskmourn: House of Horror|143|R|{2}{R}{R}|Enchantment|||If this card is in your opening hand, you may begin the game with it on the battlefield.$Whenever you cast an instant or sorcery spell that targets only a single creature you control, copy that spell. You may choose new targets for the copy.| Most Valuable Slayer|Duskmourn: House of Horror|144|C|{3}{R}|Creature - Human Warrior|2|4|Whenever you attack, target attacking creature gets +1/+0 and gains first strike until end of turn.| -Norin, Swift Survivalist|Duskmourn: House of Horror|145|U|{R}|Legendary Creature - Human Coward|2|1|Norin, Swift Survivalist can't block.$Whenever a creature you control becomes blocked, you may exile it. You may play that card from exile this turn.| -Overlord of the Boilerbilges|Duskmourn: House of Horror|146|M|{4}{R}{R}|Enchantment Creature - Avatar Horror|5|5|Impending 4--{2}{R}{R}$Whenever Overlord of the Boilerbilges enters or attacks, it deals 4 damage to any target.| -Painter's Studio // Defaced Gallery|Duskmourn: House of Horror|147|U|{2}{R}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, exile the top two cards of your library. You may play them until the end of your next turn.$Defaced Gallery${1}{R}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Whenever you attack, attacking creatures you control get +1/+0 until end of turn.| -Piggy Bank|Duskmourn: House of Horror|148|U|{1}{R}|Artifact Creature - Boar Toy|3|2|When Piggy Bank dies, create a Treasure token.| +Norin, Swift Survivalist|Duskmourn: House of Horror|145|U|{R}|Legendary Creature - Human Coward|2|1|Norin can't block.$Whenever a creature you control becomes blocked, you may exile it. You may play that card from exile this turn.| +Overlord of the Boilerbilges|Duskmourn: House of Horror|146|M|{4}{R}{R}|Enchantment Creature - Avatar Horror|5|5|Impending 4--{2}{R}{R}$Whenever this permanent enters or attacks, it deals 4 damage to any target.| +Painter's Studio // Defaced Gallery|Duskmourn: House of Horror|147|U|{2}{R}|Enchantment - Room|||When you unlock this door, exile the top two cards of your library. You may play them until the end of your next turn.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Defaced Gallery${1}{R}$Enchantment -- Room$Whenever you attack, attacking creatures you control get +1/+0 until end of turn.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Piggy Bank|Duskmourn: House of Horror|148|U|{1}{R}|Artifact Creature - Boar Toy|3|2|When this creature dies, create a Treasure token.| Pyroclasm|Duskmourn: House of Horror|149|U|{1}{R}|Sorcery|||Pyroclasm deals 2 damage to each creature.| Ragged Playmate|Duskmourn: House of Horror|150|C|{1}{R}|Artifact Creature - Toy|2|2|{1}, {T}: Target creature with power 2 or less can't be blocked this turn.| -Rampaging Soulrager|Duskmourn: House of Horror|151|C|{2}{R}|Creature - Spirit|1|4|Rampaging Soulrager gets +3/+0 as long as there are two or more unlocked doors among Rooms you control.| +Rampaging Soulrager|Duskmourn: House of Horror|151|C|{2}{R}|Creature - Spirit|1|4|This creature gets +3/+0 as long as there are two or more unlocked doors among Rooms you control.| Razorkin Hordecaller|Duskmourn: House of Horror|152|U|{4}{R}|Creature - Human Clown Berserker|4|4|Haste$Whenever you attack, create a 1/1 red Gremlin creature token.| -Razorkin Needlehead|Duskmourn: House of Horror|153|R|{R}{R}|Creature - Human Assassin|2|2|Razorkin Needlehead has first strike during your turn.$Whenever an opponent draws a card, Razorkin Needlehead deals 1 damage to them.| +Razorkin Needlehead|Duskmourn: House of Horror|153|R|{R}{R}|Creature - Human Assassin|2|2|This creature has first strike during your turn.$Whenever an opponent draws a card, this creature deals 1 damage to them.| Ripchain Razorkin|Duskmourn: House of Horror|154|C|{3}{R}|Creature - Human Berserker|5|3|Reach${2}{R}, Sacrifice a land: Draw a card.| The Rollercrusher Ride|Duskmourn: House of Horror|155|M|{X}{2}{R}|Legendary Enchantment|||Delirium -- If a source you control would deal noncombat damage to a permanent or player while there are four or more card types among cards in your graveyard, it deals double that damage instead.$When The Rollercrusher Ride enters, it deals X damage to each of up to X target creatures.| Scorching Dragonfire|Duskmourn: House of Horror|156|C|{1}{R}|Instant|||Scorching Dragonfire deals 3 damage to target creature or planeswalker. If that creature or planeswalker would die this turn, exile it instead.| -Screaming Nemesis|Duskmourn: House of Horror|157|M|{2}{R}|Creature - Spirit|3|3|Haste$Whenever Screaming Nemesis is dealt damage, it deals that much damage to any other target. If a player is dealt damage this way, they can't gain life for the rest of the game.| -Ticket Booth // Tunnel of Hate|Duskmourn: House of Horror|158|C|{2}{R}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, manifest dread.$Tunnel of Hate${4}{R}{R}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Whenever you attack, target attacking creature gains double strike until end of turn.| +Screaming Nemesis|Duskmourn: House of Horror|157|M|{2}{R}|Creature - Spirit|3|3|Haste$Whenever this creature is dealt damage, it deals that much damage to any other target. If a player is dealt damage this way, they can't gain life for the rest of the game.| +Ticket Booth // Tunnel of Hate|Duskmourn: House of Horror|158|C|{2}{R}|Enchantment - Room|||When you unlock this door, manifest dread.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Tunnel of Hate${4}{R}{R}$Enchantment -- Room$Whenever you attack, target attacking creature gains double strike until end of turn.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| Trial of Agony|Duskmourn: House of Horror|159|U|{R}|Sorcery|||Choose two target creatures controlled by the same opponent. That player chooses one of those creatures. Trial of Agony deals 5 damage to that creature, and the other can't block this turn.| Turn Inside Out|Duskmourn: House of Horror|160|C|{R}|Instant|||Target creature gets +3/+0 until end of turn. When it dies this turn, manifest dread.| Untimely Malfunction|Duskmourn: House of Horror|161|U|{1}{R}|Instant|||Choose one --$* Destroy target artifact.$* Change the target of target spell or ability with a single target.$* One or two target creatures can't block this turn.| Vengeful Possession|Duskmourn: House of Horror|162|U|{2}{R}|Sorcery|||Gain control of target creature until end of turn. Untap it. It gains haste until end of turn. You may discard a card. If you do, draw a card.| -Vicious Clown|Duskmourn: House of Horror|163|C|{2}{R}|Creature - Human Clown|2|3|Whenever another creature you control with power 2 or less enters, Vicious Clown gets +2/+0 until end of turn.| +Vicious Clown|Duskmourn: House of Horror|163|C|{2}{R}|Creature - Human Clown|2|3|Whenever another creature you control with power 2 or less enters, this creature gets +2/+0 until end of turn.| Violent Urge|Duskmourn: House of Horror|164|U|{R}|Instant|||Target creature gets +1/+0 and gains first strike until end of turn.$Delirium -- If there are four or more card types among cards in your graveyard, that creature gains double strike until end of turn.| Waltz of Rage|Duskmourn: House of Horror|165|R|{3}{R}{R}|Sorcery|||Target creature you control deals damage equal to its power to each other creature. Until end of turn, whenever a creature you control dies, exile the top card of your library. You may play it until the end of your next turn.| -Altanak, the Thrice-Called|Duskmourn: House of Horror|166|U|{5}{G}{G}|Legendary Creature - Insect Beast|9|9|Trample$Whenever Altanak, the Thrice-Called becomes the target of a spell or ability an opponent controls, draw a card.${1}{G}, Discard Altanak, the Thrice-Called: Return target land card from your graveyard to the battlefield tapped.| -Anthropede|Duskmourn: House of Horror|167|C|{3}{G}|Creature - Insect|3|4|Reach$When Anthropede enters, you may discard a card or pay {2}. When you do, destroy target Room.| -Balustrade Wurm|Duskmourn: House of Horror|168|R|{3}{G}{G}|Creature - Wurm|5|5|This spell can't be countered.$Trample, haste$Delirium -- {2}{G}{G}: Return Balustrade Wurm from your graveyard to the battlefield with a finality counter on it. Activate only if there are four or more card types among cards in your graveyard and only as a sorcery.| -Bashful Beastie|Duskmourn: House of Horror|169|C|{4}{G}|Creature - Beast|5|4|When Bashful Beastie dies, manifest dread.| +Altanak, the Thrice-Called|Duskmourn: House of Horror|166|U|{5}{G}{G}|Legendary Creature - Insect Beast|9|9|Trample$Whenever Altanak becomes the target of a spell or ability an opponent controls, draw a card.${1}{G}, Discard this card: Return target land card from your graveyard to the battlefield tapped.| +Anthropede|Duskmourn: House of Horror|167|C|{3}{G}|Creature - Insect|3|4|Reach$When this creature enters, you may discard a card or pay {2}. When you do, destroy target Room.| +Balustrade Wurm|Duskmourn: House of Horror|168|R|{3}{G}{G}|Creature - Wurm|5|5|This spell can't be countered.$Trample, haste$Delirium -- {2}{G}{G}: Return this card from your graveyard to the battlefield with a finality counter on it. Activate only if there are four or more card types among cards in your graveyard and only as a sorcery.| +Bashful Beastie|Duskmourn: House of Horror|169|C|{4}{G}|Creature - Beast|5|4|When this creature dies, manifest dread.| Break Down the Door|Duskmourn: House of Horror|170|U|{2}{G}|Instant|||Choose one --$* Exile target artifact.$* Exile target enchantment.$* Manifest dread.| Cathartic Parting|Duskmourn: House of Horror|171|U|{1}{G}|Sorcery|||The owner of target artifact or enchantment an opponent controls shuffles it into their library. You may shuffle up to four target cards from your graveyard into your library.| -Cautious Survivor|Duskmourn: House of Horror|172|C|{3}{G}|Creature - Elf Survivor|4|4|Survival -- At the beginning of your second main phase, if Cautious Survivor is tapped, you gain 2 life.| +Cautious Survivor|Duskmourn: House of Horror|172|C|{3}{G}|Creature - Elf Survivor|4|4|Survival -- At the beginning of your second main phase, if this creature is tapped, you gain 2 life.| Coordinated Clobbering|Duskmourn: House of Horror|173|U|{G}|Sorcery|||Tap one or two target untapped creatures you control. They each deal damage equal to their power to target creature an opponent controls.| -Cryptid Inspector|Duskmourn: House of Horror|174|C|{2}{G}|Creature - Elf Warrior|2|3|Vigilance$Whenever a face-down permanent you control enters and whenever Cryptid Inspector or another permanent you control is turned face up, put a +1/+1 counter on Cryptid Inspector.| -Defiant Survivor|Duskmourn: House of Horror|175|U|{2}{G}|Creature - Human Survivor|3|2|Survival -- At the beginning of your second main phase, if Defiant Survivor is tapped, manifest dread.| +Cryptid Inspector|Duskmourn: House of Horror|174|C|{2}{G}|Creature - Elf Warrior|2|3|Vigilance$Whenever a face-down permanent you control enters and whenever this creature or another permanent you control is turned face up, put a +1/+1 counter on this creature.| +Defiant Survivor|Duskmourn: House of Horror|175|U|{2}{G}|Creature - Human Survivor|3|2|Survival -- At the beginning of your second main phase, if this creature is tapped, manifest dread.| Enduring Vitality|Duskmourn: House of Horror|176|R|{1}{G}{G}|Enchantment Creature - Elk Glimmer|3|3|Vigilance$Creatures you control have "{T}: Add one mana of any color."$When Enduring Vitality dies, if it was a creature, return it to the battlefield under its owner's control. It's an enchantment.| Fear of Exposure|Duskmourn: House of Horror|177|U|{2}{G}|Enchantment Creature - Nightmare|5|4|As an additional cost to cast this spell, tap two untapped creatures and/or lands you control.$Trample| -Flesh Burrower|Duskmourn: House of Horror|178|C|{1}{G}|Creature - Insect|2|2|Deathtouch$Whenever Flesh Burrower attacks, another target creature you control gains deathtouch until end of turn.| +Flesh Burrower|Duskmourn: House of Horror|178|C|{1}{G}|Creature - Insect|2|2|Deathtouch$Whenever this creature attacks, another target creature you control gains deathtouch until end of turn.| Frantic Strength|Duskmourn: House of Horror|179|C|{2}{G}|Enchantment - Aura|||Flash$Enchant creature$Enchanted creature gets +2/+2 and has trample.| -Grasping Longneck|Duskmourn: House of Horror|180|C|{2}{G}|Enchantment Creature - Horror|4|2|Reach$When Grasping Longneck dies, you gain 2 life.| -Greenhouse // Rickety Gazebo|Duskmourn: House of Horror|181|U|{2}{G}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Lands you control have "{T}: Add one mana of any color."$Rickety Gazebo${3}{G}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, mill four cards, then return up to two permanent cards from among them to your hand.| -Hauntwoods Shrieker|Duskmourn: House of Horror|182|M|{1}{G}{G}|Creature - Beast Mutant|3|3|Whenever Hauntwoods Shrieker attacks, manifest dread.${1}{G}: Reveal target face-down permanent. If it's a creature card, you may turn it face up.| -Hedge Shredder|Duskmourn: House of Horror|183|R|{2}{G}{G}|Artifact - Vehicle|5|5|Whenever Hedge Shredder attacks, you may mill two cards.$Whenever one or more land cards are put into your graveyard from your library, put them onto the battlefield tapped.$Crew 1| +Grasping Longneck|Duskmourn: House of Horror|180|C|{2}{G}|Enchantment Creature - Horror|4|2|Reach$When this creature dies, you gain 2 life.| +Greenhouse // Rickety Gazebo|Duskmourn: House of Horror|181|U|{2}{G}|Enchantment - Room|||Lands you control have "{T}: Add one mana of any color."$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Rickety Gazebo${3}{G}$Enchantment -- Room$When you unlock this door, mill four cards, then return up to two permanent cards from among them to your hand.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Hauntwoods Shrieker|Duskmourn: House of Horror|182|M|{1}{G}{G}|Creature - Beast Mutant|3|3|Whenever this creature attacks, manifest dread.${1}{G}: Reveal target face-down permanent. If it's a creature card, you may turn it face up.| +Hedge Shredder|Duskmourn: House of Horror|183|R|{2}{G}{G}|Artifact - Vehicle|5|5|Whenever this Vehicle attacks, you may mill two cards.$Whenever one or more land cards are put into your graveyard from your library, put them onto the battlefield tapped.$Crew 1| Horrid Vigor|Duskmourn: House of Horror|184|C|{1}{G}|Instant|||Target creature gains deathtouch and indestructible until end of turn.| -House Cartographer|Duskmourn: House of Horror|185|U|{1}{G}|Creature - Human Scout Survivor|2|2|Survival -- At the beginning of your second main phase, if House Cartographer is tapped, reveal cards from the top of your library until you reveal a land card. Put that card into your hand and the rest on the bottom of your library in a random order.| -Insidious Fungus|Duskmourn: House of Horror|186|U|{G}|Creature - Fungus|1|2|{2}, Sacrifice Insidious Fungus: Choose one --$* Destroy target artifact.$* Destroy target enchantment.$* Draw a card. Then you may put a land card from your hand onto the battlefield tapped.| -Kona, Rescue Beastie|Duskmourn: House of Horror|187|R|{3}{G}|Legendary Creature - Beast Survivor|4|3|Survival -- At the beginning of your second main phase, if Kona, Rescue Beastie is tapped, you may put a permanent card from your hand onto the battlefield.| -Leyline of Mutation|Duskmourn: House of Horror|188|R|{2}{G}{G}|Enchantment|||If Leyline of Mutation is in your opening hand, you may begin the game with it on the battlefield.$You may pay {W}{U}{B}{R}{G} rather than pay the mana cost for spells that you cast.| +House Cartographer|Duskmourn: House of Horror|185|U|{1}{G}|Creature - Human Scout Survivor|2|2|Survival -- At the beginning of your second main phase, if this creature is tapped, reveal cards from the top of your library until you reveal a land card. Put that card into your hand and the rest on the bottom of your library in a random order.| +Insidious Fungus|Duskmourn: House of Horror|186|U|{G}|Creature - Fungus|1|2|{2}, Sacrifice this creature: Choose one --$* Destroy target artifact.$* Destroy target enchantment.$* Draw a card. Then you may put a land card from your hand onto the battlefield tapped.| +Kona, Rescue Beastie|Duskmourn: House of Horror|187|R|{3}{G}|Legendary Creature - Beast Survivor|4|3|Survival -- At the beginning of your second main phase, if Kona is tapped, you may put a permanent card from your hand onto the battlefield.| +Leyline of Mutation|Duskmourn: House of Horror|188|R|{2}{G}{G}|Enchantment|||If this card is in your opening hand, you may begin the game with it on the battlefield.$You may pay {W}{U}{B}{R}{G} rather than pay the mana cost for spells you cast.| Manifest Dread|Duskmourn: House of Horror|189|C|{1}{G}|Sorcery|||Manifest dread.| -Moldering Gym // Weight Room|Duskmourn: House of Horror|190|C|{2}{G}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, search your library for a basic land card, put it onto the battlefield tapped, then shuffle.$Weight Room${5}{G}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, manifest dread, then put three +1/+1 counters on that creature.| +Moldering Gym // Weight Room|Duskmourn: House of Horror|190|C|{2}{G}|Enchantment - Room|||When you unlock this door, search your library for a basic land card, put it onto the battlefield tapped, then shuffle.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Weight Room${5}{G}$Enchantment -- Room$When you unlock this door, manifest dread, then put three +1/+1 counters on that creature.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| Monstrous Emergence|Duskmourn: House of Horror|191|C|{1}{G}|Sorcery|||As an additional cost to cast this spell, choose a creature you control or reveal a creature card from your hand.$Monstrous Emergence deals damage equal to the power of the creature you chose or the card you revealed to target creature.| -Omnivorous Flytrap|Duskmourn: House of Horror|192|R|{2}{G}|Creature - Plant|2|4|Delirium -- Whenever Omnivorous Flytrap enters or attacks, if there are four or more card types among cards in your graveyard, distribute two +1/+1 counters among one or two target creatures. Then if there are six or more card types among cards in your graveyard, double the number of +1/+1 counters on those creatures.| +Omnivorous Flytrap|Duskmourn: House of Horror|192|R|{2}{G}|Creature - Plant|2|4|Delirium -- Whenever this creature enters or attacks, if there are four or more card types among cards in your graveyard, distribute two +1/+1 counters among one or two target creatures. Then if there are six or more card types among cards in your graveyard, double the number of +1/+1 counters on those creatures.| Overgrown Zealot|Duskmourn: House of Horror|193|U|{1}{G}|Creature - Elf Druid|0|4|{T}: Add one mana of any color.${T}: Add two mana of any one color. Spend this mana only to turn permanents face up.| -Overlord of the Hauntwoods|Duskmourn: House of Horror|194|M|{3}{G}{G}|Enchantment Creature - Avatar Horror|6|5|Impending 4--{1}{G}{G}$Whenever Overlord of the Hauntwoods enters or attacks, create a tapped colorless land token named Everywhere that is every basic land type.| -Patchwork Beastie|Duskmourn: House of Horror|195|U|{G}|Artifact Creature - Beast|3|3|Delirium -- Patchwork Beastie can't attack or block unless there are four or more card types among cards in your graveyard.$At the beginning of your upkeep, you may mill a card.| -Rootwise Survivor|Duskmourn: House of Horror|196|U|{3}{G}{G}|Creature - Human Survivor|3|4|Haste$Survival -- At the beginning of your second main phase, if Rootwise Survivor is tapped, put three +1/+1 counters on up to one target land you control. That land becomes a 0/0 Elemental creature in addition to its other types. It gains haste until your next turn.| +Overlord of the Hauntwoods|Duskmourn: House of Horror|194|M|{3}{G}{G}|Enchantment Creature - Avatar Horror|6|5|Impending 4--{1}{G}{G}$Whenever this permanent enters or attacks, create a tapped colorless land token named Everywhere that is every basic land type.| +Patchwork Beastie|Duskmourn: House of Horror|195|U|{G}|Artifact Creature - Beast|3|3|Delirium -- This creature can't attack or block unless there are four or more card types among cards in your graveyard.$At the beginning of your upkeep, you may mill a card.| +Rootwise Survivor|Duskmourn: House of Horror|196|U|{3}{G}{G}|Creature - Human Survivor|3|4|Haste$Survival -- At the beginning of your second main phase, if this creature is tapped, put three +1/+1 counters on up to one target land you control. That land becomes a 0/0 Elemental creature in addition to its other types. It gains haste until your next turn.| Say Its Name|Duskmourn: House of Horror|197|C|{1}{G}|Sorcery|||Mill three cards. Then you may return a creature or land card from your graveyard to your hand.$Exile this card and two other cards named Say Its Name from your graveyard: Search your graveyard, hand, and/or library for a card named Altanak, the Thrice-Called and put it onto the battlefield. If you search your library this way, shuffle. Activate only as a sorcery.| Slavering Branchsnapper|Duskmourn: House of Horror|198|C|{4}{G}{G}|Creature - Lizard|7|6|Trample$Forestcycling {2}| -Spineseeker Centipede|Duskmourn: House of Horror|199|C|{2}{G}|Creature - Insect|2|1|When Spineseeker Centipede enters, search your library for a basic land card, reveal it, put it into your hand, then shuffle.$Delirium -- Spineseeker Centipede gets +1/+2 and has vigilance as long as there are four or more card types among cards in your graveyard.| -Threats Around Every Corner|Duskmourn: House of Horror|200|U|{3}{G}|Enchantment|||When Threats Around Every Corner enters, manifest dread.$Whenever a face-down permanent you control enters, search your library for a basic land card, put it onto the battlefield tapped, then shuffle.| -Twitching Doll|Duskmourn: House of Horror|201|R|{1}{G}|Artifact Creature - Spider Toy|2|2|{T}: Add one mana of any color. Put a nest counter on Twitching Doll.${T}, Sacrifice Twitching Doll: Create a 2/2 green Spider creature token with reach for each counter on Twitching Doll. Activate only as a sorcery.| -Tyvar, the Pummeler|Duskmourn: House of Horror|202|M|{1}{G}{G}|Legendary Creature - Elf Warrior|3|3|Tap another untapped creature you control: Tyvar, the Pummeler gains indestructible until end of turn. Tap it.${3}{G}{G}: Creatures you control get +X/+X until end of turn, where X is the greatest power among creatures you control.| +Spineseeker Centipede|Duskmourn: House of Horror|199|C|{2}{G}|Creature - Insect|2|1|When this creature enters, search your library for a basic land card, reveal it, put it into your hand, then shuffle.$Delirium -- This creature gets +1/+2 and has vigilance as long as there are four or more card types among cards in your graveyard.| +Threats Around Every Corner|Duskmourn: House of Horror|200|U|{3}{G}|Enchantment|||When this enchantment enters, manifest dread.$Whenever a face-down permanent you control enters, search your library for a basic land card, put it onto the battlefield tapped, then shuffle.| +Twitching Doll|Duskmourn: House of Horror|201|R|{1}{G}|Artifact Creature - Spider Toy|2|2|{T}: Add one mana of any color. Put a nest counter on this creature.${T}, Sacrifice this creature: Create a 2/2 green Spider creature token with reach for each counter on this creature. Activate only as a sorcery.| +Tyvar, the Pummeler|Duskmourn: House of Horror|202|M|{1}{G}{G}|Legendary Creature - Elf Warrior|3|3|Tap another untapped creature you control: Tyvar gains indestructible until end of turn. Tap it.${3}{G}{G}: Creatures you control get +X/+X until end of turn, where X is the greatest power among creatures you control.| Under the Skin|Duskmourn: House of Horror|203|U|{2}{G}|Sorcery|||Manifest dread.$You may return a permanent card from your graveyard to your hand.| Valgavoth's Onslaught|Duskmourn: House of Horror|204|R|{X}{X}{G}|Sorcery|||Manifest dread X times, then put X +1/+1 counters on each of those creatures.| -Walk-in Closet // Forgotten Cellar|Duskmourn: House of Horror|205|M|{2}{G}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$You may play lands from your graveyard.$Forgotten Cellar${3}{G}{G}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, you may cast spells from your graveyard this turn, and if a card would be put into your graveyard from anywhere this turn, exile it instead.| -Wary Watchdog|Duskmourn: House of Horror|206|C|{1}{G}|Creature - Dog|3|1|When Wary Watchdog enters or dies, surveil 1.| -Wickerfolk Thresher|Duskmourn: House of Horror|207|U|{3}{G}|Artifact Creature - Scarecrow|5|4|Delirium -- Whenever Wickerfolk Thresher attacks, if there are four or more card types among cards in your graveyard, look at the top card of your library. If it's a land card, you may put it onto the battlefield. If you don't put the card onto the battlefield, put it into your hand.| -Arabella, Abandoned Doll|Duskmourn: House of Horror|208|U|{R}{W}|Legendary Artifact Creature - Toy|1|3|Whenever Arabella, Abandoned Doll attacks, it deals X damage to each opponent and you gain X life, where X is the number of creatures you control with power 2 or less.| -Baseball Bat|Duskmourn: House of Horror|209|U|{G}{W}|Artifact - Equipment|||When Baseball Bat enters, attach it to target creature you control.$Equipped creature gets +1/+1.$Whenever equipped creature attacks, tap up to one target creature.$Equip {3}| +Walk-In Closet // Forgotten Cellar|Duskmourn: House of Horror|205|M|{2}{G}|Enchantment - Room|||You may play lands from your graveyard.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Forgotten Cellar${3}{G}{G}$Enchantment -- Room$When you unlock this door, you may cast spells from your graveyard this turn, and if a card would be put into your graveyard from anywhere this turn, exile it instead.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Wary Watchdog|Duskmourn: House of Horror|206|C|{1}{G}|Creature - Dog|3|1|When this creature enters or dies, surveil 1.| +Wickerfolk Thresher|Duskmourn: House of Horror|207|U|{3}{G}|Artifact Creature - Scarecrow|5|4|Delirium -- Whenever this creature attacks, if there are four or more card types among cards in your graveyard, look at the top card of your library. If it's a land card, you may put it onto the battlefield. If you don't put the card onto the battlefield, put it into your hand.| +Arabella, Abandoned Doll|Duskmourn: House of Horror|208|U|{R}{W}|Legendary Artifact Creature - Toy|1|3|Whenever Arabella attacks, it deals X damage to each opponent and you gain X life, where X is the number of creatures you control with power 2 or less.| +Baseball Bat|Duskmourn: House of Horror|209|U|{G}{W}|Artifact - Equipment|||When this Equipment enters, attach it to target creature you control.$Equipped creature gets +1/+1.$Whenever equipped creature attacks, tap up to one target creature.$Equip {3}| Beastie Beatdown|Duskmourn: House of Horror|210|U|{R}{G}|Sorcery|||Choose target creature you control and target creature an opponent controls.$Delirium -- If there are four or more card types among cards in your graveyard, put two +1/+1 counters on the creature you control.$The creature you control deals damage equal to its power to the creature an opponent controls.| -Broodspinner|Duskmourn: House of Horror|211|U|{B}{G}|Creature - Spider|2|3|Reach$When Broodspinner enters, surveil 2.${4}{B}{G}, {T}, Sacrifice Broodspinner: Create a number of 1/1 black and green Insect creature tokens with flying equal to the number of card types among cards in your graveyard.| -Disturbing Mirth|Duskmourn: House of Horror|212|U|{B}{R}|Enchantment|||When Disturbing Mirth enters, you may sacrifice another enchantment or creature. If you do, draw two cards.$When you sacrifice Disturbing Mirth, manifest dread.| +Broodspinner|Duskmourn: House of Horror|211|U|{B}{G}|Creature - Spider|2|3|Reach$When this creature enters, surveil 2.${4}{B}{G}, {T}, Sacrifice this creature: Create a number of 1/1 black and green Insect creature tokens with flying equal to the number of card types among cards in your graveyard.| +Disturbing Mirth|Duskmourn: House of Horror|212|U|{B}{R}|Enchantment|||When this enchantment enters, you may sacrifice another enchantment or creature. If you do, draw two cards.$When you sacrifice this enchantment, manifest dread.| Drag to the Roots|Duskmourn: House of Horror|213|U|{2}{B}{G}|Instant|||Delirium -- This spell costs {2} less to cast as long as there are four or more card types among cards in your graveyard.$Destroy target nonland permanent.| -Fear of Infinity|Duskmourn: House of Horror|214|U|{1}{U}{B}|Enchantment Creature - Nightmare|2|2|Flying, lifelink$Fear of Infinity can't block.$Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, you may return Fear of Infinity from your graveyard to your hand.| +Fear of Infinity|Duskmourn: House of Horror|214|U|{1}{U}{B}|Enchantment Creature - Nightmare|2|2|Flying, lifelink$This creature can't block.$Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, you may return this card from your graveyard to your hand.| Gremlin Tamer|Duskmourn: House of Horror|215|U|{W}{U}|Creature - Human Scout|2|2|Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, create a 1/1 red Gremlin creature token.| -Growing Dread|Duskmourn: House of Horror|216|U|{G}{U}|Enchantment|||Flash$When Growing Dread enters, manifest dread.$Whenever you turn a permanent face up, put a +1/+1 counter on it.| +Growing Dread|Duskmourn: House of Horror|216|U|{G}{U}|Enchantment|||Flash$When this enchantment enters, manifest dread.$Whenever you turn a permanent face up, put a +1/+1 counter on it.| Inquisitive Glimmer|Duskmourn: House of Horror|217|U|{W}{U}|Enchantment Creature - Fox Glimmer|2|3|Enchantment spells you cast cost {1} less to cast.$Unlock costs you pay cost {1} less.| -Intruding Soulrager|Duskmourn: House of Horror|218|U|{U}{R}|Creature - Spirit|2|2|Vigilance${T}, Sacrifice a Room: Intruding Soulrager deals 2 damage to each opponent. Draw a card.| +Intruding Soulrager|Duskmourn: House of Horror|218|U|{U}{R}|Creature - Spirit|2|2|Vigilance${T}, Sacrifice a Room: This creature deals 2 damage to each opponent. Draw a card.| The Jolly Balloon Man|Duskmourn: House of Horror|219|R|{1}{R}{W}|Legendary Creature - Human Clown|1|4|Haste${1}, {T}: Create a token that's a copy of another target creature you control, except it's a 1/1 red Balloon creature in addition to its other colors and types and it has flying and haste. Sacrifice it at the beginning of the next end step. Activate only as a sorcery.| Kaito, Bane of Nightmares|Duskmourn: House of Horror|220|M|{2}{U}{B}|Legendary Planeswalker - Kaito|4|Ninjutsu {1}{U}{B}$During your turn, as long as Kaito has one or more loyalty counters on him, he's a 3/4 Ninja creature and has hexproof.$+1: You get an emblem with "Ninjas you control get +1/+1."$0: Surveil 2. Then draw a card for each opponent who lost life this turn.$-2: Tap target creature. Put two stun counters on it.| Marina Vendrell|Duskmourn: House of Horror|221|R|{W}{U}{B}{R}{G}|Legendary Creature - Human Warlock|3|5|When Marina Vendrell enters, reveal the top seven cards of your library. Put all enchantment cards from among them into your hand and the rest on the bottom of your library in a random order.${T}: Lock or unlock a door of target Room you control. Activate only as a sorcery.| Midnight Mayhem|Duskmourn: House of Horror|222|U|{2}{R}{W}|Sorcery|||Create three 1/1 red Gremlin creature tokens. Gremlins you control gain menace, lifelink, and haste until end of turn.| -Nashi, Searcher in the Dark|Duskmourn: House of Horror|223|R|{U}{B}|Legendary Creature - Rat Ninja Wizard|2|2|Menace$Whenever Nashi, Searcher in the Dark deals combat damage to a player, you mill that many cards. You may put any number of legendary and/or enchantment cards from among them into your hand. If you put no cards into your hand this way, put a +1/+1 counter on Nashi.| -Niko, Light of Hope|Duskmourn: House of Horror|224|M|{2}{W}{U}|Legendary Creature - Human Wizard|3|4|When Niko, Light of Hope enters, create two Shard tokens.${2}, {T}: Exile target nonlegendary creature you control. Shards you control become copies of it until the beginning of the next end step. Return it to the battlefield under its owner's control at the beginning of the next end step.| +Nashi, Searcher in the Dark|Duskmourn: House of Horror|223|R|{U}{B}|Legendary Creature - Rat Ninja Wizard|2|2|Menace$Whenever Nashi deals combat damage to a player, you mill that many cards. You may put any number of legendary and/or enchantment cards from among them into your hand. If you put no cards into your hand this way, put a +1/+1 counter on Nashi.| +Niko, Light of Hope|Duskmourn: House of Horror|224|M|{2}{W}{U}|Legendary Creature - Human Wizard|3|4|When Niko enters, create two Shard tokens.${2}, {T}: Exile target nonlegendary creature you control. Shards you control become copies of it until the next end step. Return it to the battlefield under its owner's control at the beginning of the next end step.| Oblivious Bookworm|Duskmourn: House of Horror|225|U|{G}{U}|Creature - Human Wizard|2|3|At the beginning of your end step, you may draw a card. If you do, discard a card unless a permanent entered the battlefield face down under your control this turn or you turned a permanent face up this turn.| Peer Past the Veil|Duskmourn: House of Horror|226|R|{2}{R}{G}|Instant|||Discard your hand. Then draw X cards, where X is the number of card types among cards in your graveyard.| -Restricted Office // Lecture Hall|Duskmourn: House of Horror|227|R|{2}{W}{W}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, destroy all creatures with power 3 or greater.$Lecture Hall${5}{U}{U}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Other permanents you control have hexproof.| -Rip, Spawn Hunter|Duskmourn: House of Horror|228|R|{2}{G}{W}|Legendary Creature - Human Survivor|4|4|Survival -- At the beginning of your second main phase, if Rip, Spawn Hunter is tapped, reveal the top X cards of your library, where X is its power. Put any number of creature and/or Vehicle cards with different powers from among them into your hand. Put the rest on the bottom of your library in a random order.| +Restricted Office // Lecture Hall|Duskmourn: House of Horror|227|R|{2}{W}{W}|Enchantment - Room|||When you unlock this door, destroy all creatures with power 3 or greater.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Lecture Hall${5}{U}{U}$Enchantment -- Room$Other permanents you control have hexproof.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Rip, Spawn Hunter|Duskmourn: House of Horror|228|R|{2}{G}{W}|Legendary Creature - Human Survivor|4|4|Survival -- At the beginning of your second main phase, if Rip is tapped, reveal the top X cards of your library, where X is its power. Put any number of creature and/or Vehicle cards with different powers from among them into your hand. Put the rest on the bottom of your library in a random order.| Rite of the Moth|Duskmourn: House of Horror|229|U|{1}{W}{B}{B}|Sorcery|||Return target creature card from your graveyard to the battlefield with a finality counter on it.$Flashback {3}{W}{W}{B}| -Roaring Furnace // Steaming Sauna|Duskmourn: House of Horror|230|R|{1}{R}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, this Room deals damage equal to the number of cards in your hand to target creature an opponent controls.$Steaming Sauna${3}{U}{U}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$You have no maximum hand size.$At the beginning of your end step, draw a card.| -Sawblade Skinripper|Duskmourn: House of Horror|231|U|{1}{B}{R}|Creature - Human Assassin|3|2|Menace${2}, Sacrifice another creature or enchantment: Put a +1/+1 counter on Sawblade Skinripper.$At the beginning of your end step, if you sacrificed one or more permanents this turn, Sawblade Skinripper deals that much damage to any target.| -Shrewd Storyteller|Duskmourn: House of Horror|232|U|{1}{G}{W}|Creature - Human Survivor|3|3|Survival -- At the beginning of your second main phase, if Shrewd Storyteller is tapped, put a +1/+1 counter on target creature.| -Shroudstomper|Duskmourn: House of Horror|233|U|{3}{W}{W}{B}{B}|Creature - Elemental|5|5|Deathtouch$Whenever Shroudstomper enters or attacks, each opponent loses 2 life. You gain 2 life and draw a card.| +Roaring Furnace // Steaming Sauna|Duskmourn: House of Horror|230|R|{1}{R}|Enchantment - Room|||When you unlock this door, this Room deals damage equal to the number of cards in your hand to target creature an opponent controls.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Steaming Sauna${3}{U}{U}$Enchantment -- Room$You have no maximum hand size.$At the beginning of your end step, draw a card.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Sawblade Skinripper|Duskmourn: House of Horror|231|U|{1}{B}{R}|Creature - Human Assassin|3|2|Menace${2}, Sacrifice another creature or enchantment: Put a +1/+1 counter on this creature.$At the beginning of your end step, if you sacrificed one or more permanents this turn, this creature deals that much damage to any target.| +Shrewd Storyteller|Duskmourn: House of Horror|232|U|{1}{G}{W}|Creature - Human Survivor|3|3|Survival -- At the beginning of your second main phase, if this creature is tapped, put a +1/+1 counter on target creature.| +Shroudstomper|Duskmourn: House of Horror|233|U|{3}{W}{W}{B}{B}|Creature - Elemental|5|5|Deathtouch$Whenever this creature enters or attacks, each opponent loses 2 life. You gain 2 life and draw a card.| Skullsnap Nuisance|Duskmourn: House of Horror|234|U|{U}{B}|Creature - Insect Skeleton|1|4|Flying$Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, surveil 1.| -Smoky Lounge // Misty Salon|Duskmourn: House of Horror|235|U|{2}{R}|Enchantment - Room|||(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$At the beginning of your first main phase, add {R}{R}. Spend this mana only to cast Room spells and unlock doors.$Misty Salon${3}{U}$Enchantment -- Room$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$When you unlock this door, create an X/X blue Spirit creature token with flying, where X is the number of unlocked doors among Rooms you control.| +Smoky Lounge // Misty Salon|Duskmourn: House of Horror|235|U|{2}{R}|Enchantment - Room|||At the beginning of your first main phase, add {R}{R}. Spend this mana only to cast Room spells and unlock doors.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Misty Salon${3}{U}$Enchantment -- Room$When you unlock this door, create an X/X blue Spirit creature token with flying, where X is the number of unlocked doors among Rooms you control.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| The Swarmweaver|Duskmourn: House of Horror|236|R|{2}{B}{G}|Legendary Artifact Creature - Scarecrow|2|3|When The Swarmweaver enters, create two 1/1 black and green Insect creature tokens with flying.$Delirium -- As long as there are four or more card types among cards in your graveyard, Insects and Spiders you control get +1/+1 and have deathtouch.| -Undead Sprinter|Duskmourn: House of Horror|237|R|{B}{R}|Creature - Zombie|2|2|Trample, haste$You may cast Undead Sprinter from your graveyard if a non-Zombie creature died this turn. If you do, Undead Sprinter enters with a +1/+1 counter on it.| +Undead Sprinter|Duskmourn: House of Horror|237|R|{B}{R}|Creature - Zombie|2|2|Trample, haste$You may cast this card from your graveyard if a non-Zombie creature died this turn. If you do, this creature enters with a +1/+1 counter on it.| Victor, Valgavoth's Seneschal|Duskmourn: House of Horror|238|R|{1}{W}{B}|Legendary Creature - Human Warlock|3|3|Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, surveil 2 if this is the first time this ability has resolved this turn. If it's the second time, each opponent discards a card. If it's the third time, put a creature card from a graveyard onto the battlefield under your control.| -Wildfire Wickerfolk|Duskmourn: House of Horror|239|U|{R}{G}|Artifact Creature - Scarecrow|3|2|Haste$Delirium -- Wildfire Wickerfolk gets +1/+1 and has trample as long as there are four or more card types among cards in your graveyard.| +Wildfire Wickerfolk|Duskmourn: House of Horror|239|U|{R}{G}|Artifact Creature - Scarecrow|3|2|Haste$Delirium -- This creature gets +1/+1 and has trample as long as there are four or more card types among cards in your graveyard.| Winter, Misanthropic Guide|Duskmourn: House of Horror|240|R|{1}{B}{R}{G}|Legendary Creature - Human Warlock|3|4|Ward {2}$At the beginning of your upkeep, each player draws two cards.$Delirium -- As long as there are four or more card types among cards in your graveyard, each opponent's maximum hand size is equal to seven minus the number of those card types.| Zimone, All-Questioning|Duskmourn: House of Horror|241|R|{1}{G}{U}|Legendary Creature - Human Wizard|1|1|At the beginning of your end step, if a land entered the battlefield under your control this turn and you control a prime number of lands, create Primo, the Indivisible, a legendary 0/0 green and blue Fractal creature token, then put that many +1/+1 counters on it.| -Attack-in-the-Box|Duskmourn: House of Horror|242|U|{3}|Artifact Creature - Toy|2|4|Whenever Attack-in-the-Box attacks, you may have it get +4/+0 until end of turn. If you do, sacrifice it at the beginning of the next end step.| -Bear Trap|Duskmourn: House of Horror|243|C|{1}|Artifact|||Flash${3}, {T}, Sacrifice Bear Trap: It deals 3 damage to target creature.| -Conductive Machete|Duskmourn: House of Horror|244|U|{4}|Artifact - Equipment|||When Conductive Machete enters, manifest dread, then attach Conductive Machete to that creature.$Equipped creature gets +2/+1.$Equip {4}| -Dissection Tools|Duskmourn: House of Horror|245|R|{5}|Artifact - Equipment|||When Dissection Tools enters, manifest dread, then attach Dissection Tools to that creature.$Equipped creature gets +2/+2 and has deathtouch and lifelink.$Equip--Sacrifice a creature.| -Found Footage|Duskmourn: House of Horror|246|C|{1}|Artifact - Clue|||You may look at face-down creatures your opponents control any time.${2}, Sacrifice Found Footage: Surveil 2, then draw a card.| -Friendly Teddy|Duskmourn: House of Horror|247|C|{2}|Artifact Creature - Bear Toy|2|2|When Friendly Teddy dies, each player draws a card.| -Ghost Vacuum|Duskmourn: House of Horror|248|R|{1}|Artifact|||{T}: Exile target card from a graveyard.${6}, {T}, Sacrifice Ghost Vacuum: Put each creature card exiled with Ghost Vacuum onto the battlefield under your control with a flying counter on it. Each of them is a 1/1 Spirit in addition to its other types. Activate only as a sorcery.| -Glimmerlight|Duskmourn: House of Horror|249|C|{2}|Artifact - Equipment|||When Glimmerlight enters, create a 1/1 white Glimmer enchantment creature token.$Equipped creature gets +1/+1.$Equip {1}| -Haunted Screen|Duskmourn: House of Horror|250|U|{3}|Artifact|||{T}: Add {W} or {B}.${T}, Pay 1 life: Add {G}, {U}, or {R}.${7}: Put seven +1/+1 counters on Haunted Screen. It becomes a 0/0 Spirit creature in addition to its other types. Activate only once.| -Keys to the House|Duskmourn: House of Horror|251|U|{1}|Artifact|||{1}, {T}, Sacrifice Keys to the House: Search your library for a basic land card, reveal it, put it into your hand, then shuffle.${3}, {T}, Sacrifice Keys to the House: Lock or unlock a door of target Room you control. Activate only as a sorcery.| +Attack-in-the-Box|Duskmourn: House of Horror|242|U|{3}|Artifact Creature - Toy|2|4|Whenever this creature attacks, you may have it get +4/+0 until end of turn. If you do, sacrifice it at the beginning of the next end step.| +Bear Trap|Duskmourn: House of Horror|243|C|{1}|Artifact|||Flash${3}, {T}, Sacrifice this artifact: It deals 3 damage to target creature.| +Conductive Machete|Duskmourn: House of Horror|244|U|{4}|Artifact - Equipment|||When this Equipment enters, manifest dread, then attach this Equipment to that creature.$Equipped creature gets +2/+1.$Equip {4}| +Dissection Tools|Duskmourn: House of Horror|245|R|{5}|Artifact - Equipment|||When this Equipment enters, manifest dread, then attach this Equipment to that creature.$Equipped creature gets +2/+2 and has deathtouch and lifelink.$Equip--Sacrifice a creature.| +Found Footage|Duskmourn: House of Horror|246|C|{1}|Artifact - Clue|||You may look at face-down creatures your opponents control any time.${2}, Sacrifice this artifact: Surveil 2, then draw a card.| +Friendly Teddy|Duskmourn: House of Horror|247|C|{2}|Artifact Creature - Bear Toy|2|2|When this creature dies, each player draws a card.| +Ghost Vacuum|Duskmourn: House of Horror|248|R|{1}|Artifact|||{T}: Exile target card from a graveyard.${6}, {T}, Sacrifice this artifact: Put each creature card exiled with this artifact onto the battlefield under your control with a flying counter on it. Each of them is a 1/1 Spirit in addition to its other types. Activate only as a sorcery.| +Glimmerlight|Duskmourn: House of Horror|249|C|{2}|Artifact - Equipment|||When this Equipment enters, create a 1/1 white Glimmer enchantment creature token.$Equipped creature gets +1/+1.$Equip {1}| +Haunted Screen|Duskmourn: House of Horror|250|U|{3}|Artifact|||{T}: Add {W} or {B}.${T}, Pay 1 life: Add {G}, {U}, or {R}.${7}: Put seven +1/+1 counters on this artifact. It becomes a 0/0 Spirit creature in addition to its other types. Activate only once.| +Keys to the House|Duskmourn: House of Horror|251|U|{1}|Artifact|||{1}, {T}, Sacrifice this artifact: Search your library for a basic land card, reveal it, put it into your hand, then shuffle.${3}, {T}, Sacrifice this artifact: Lock or unlock a door of target Room you control. Activate only as a sorcery.| Malevolent Chandelier|Duskmourn: House of Horror|252|C|{6}|Artifact Creature - Construct|4|4|Flying${2}: Put target card from a graveyard on the bottom of its owner's library. Activate only as a sorcery.| -Marvin, Murderous Mimic|Duskmourn: House of Horror|253|R|{2}|Legendary Artifact Creature - Toy|2|2|Marvin, Murderous Mimic has all activated abilities of creatures you control that don't have the same name as this creature.| -Saw|Duskmourn: House of Horror|254|U|{2}|Artifact - Equipment|||Equipped creature gets +2/+0.$Whenever equipped creature attacks, you may sacrifice a permanent other than that creature or Saw. If you do, draw a card.$Equip {2}| -Abandoned Campground|Duskmourn: House of Horror|255|C||Land|||Abandoned Campground enters tapped unless a player has 13 or less life.${T}: Add {W} or {U}.| +Marvin, Murderous Mimic|Duskmourn: House of Horror|253|R|{2}|Legendary Artifact Creature - Toy|2|2|Marvin has all activated abilities of creatures you control that don't have the same name as this creature.| +Saw|Duskmourn: House of Horror|254|U|{2}|Artifact - Equipment|||Equipped creature gets +2/+0.$Whenever equipped creature attacks, you may sacrifice a permanent other than that creature or this Equipment. If you do, draw a card.$Equip {2}| +Abandoned Campground|Duskmourn: House of Horror|255|C||Land|||This land enters tapped unless a player has 13 or less life.${T}: Add {W} or {U}.| Blazemire Verge|Duskmourn: House of Horror|256|R||Land|||{T}: Add {B}.${T}: Add {R}. Activate only if you control a Swamp or a Mountain.| -Bleeding Woods|Duskmourn: House of Horror|257|C||Land|||Bleeding Woods enters tapped unless a player has 13 or less life.${T}: Add {R} or {G}.| -Etched Cornfield|Duskmourn: House of Horror|258|C||Land|||Etched Cornfield enters tapped unless a player has 13 or less life.${T}: Add {G} or {W}.| +Bleeding Woods|Duskmourn: House of Horror|257|C||Land|||This land enters tapped unless a player has 13 or less life.${T}: Add {R} or {G}.| +Etched Cornfield|Duskmourn: House of Horror|258|C||Land|||This land enters tapped unless a player has 13 or less life.${T}: Add {G} or {W}.| Floodfarm Verge|Duskmourn: House of Horror|259|R||Land|||{T}: Add {W}.${T}: Add {U}. Activate only if you control a Plains or an Island.| Gloomlake Verge|Duskmourn: House of Horror|260|R||Land|||{T}: Add {U}.${T}: Add {B}. Activate only if you control an Island or a Swamp.| Hushwood Verge|Duskmourn: House of Horror|261|R||Land|||{T}: Add {G}.${T}: Add {W}. Activate only if you control a Forest or a Plains.| -Lakeside Shack|Duskmourn: House of Horror|262|C||Land|||Lakeside Shack enters tapped unless a player has 13 or less life.${T}: Add {G} or {U}.| -Murky Sewer|Duskmourn: House of Horror|263|C||Land|||Murky Sewer enters tapped unless a player has 13 or less life.${T}: Add {U} or {B}.| -Neglected Manor|Duskmourn: House of Horror|264|C||Land|||Neglected Manor enters tapped unless a player has 13 or less life.${T}: Add {W} or {B}.| -Peculiar Lighthouse|Duskmourn: House of Horror|265|C||Land|||Peculiar Lighthouse enters tapped unless a player has 13 or less life.${T}: Add {U} or {R}.| -Raucous Carnival|Duskmourn: House of Horror|266|C||Land|||Raucous Carnival enters tapped unless a player has 13 or less life.${T}: Add {R} or {W}.| -Razortrap Gorge|Duskmourn: House of Horror|267|C||Land|||Razortrap Gorge enters tapped unless a player has 13 or less life.${T}: Add {B} or {R}.| -Strangled Cemetery|Duskmourn: House of Horror|268|C||Land|||Strangled Cemetery enters tapped unless a player has 13 or less life.${T}: Add {B} or {G}.| -Terramorphic Expanse|Duskmourn: House of Horror|269|C||Land|||{T}, Sacrifice Terramorphic Expanse: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.| +Lakeside Shack|Duskmourn: House of Horror|262|C||Land|||This land enters tapped unless a player has 13 or less life.${T}: Add {G} or {U}.| +Murky Sewer|Duskmourn: House of Horror|263|C||Land|||This land enters tapped unless a player has 13 or less life.${T}: Add {U} or {B}.| +Neglected Manor|Duskmourn: House of Horror|264|C||Land|||This land enters tapped unless a player has 13 or less life.${T}: Add {W} or {B}.| +Peculiar Lighthouse|Duskmourn: House of Horror|265|C||Land|||This land enters tapped unless a player has 13 or less life.${T}: Add {U} or {R}.| +Raucous Carnival|Duskmourn: House of Horror|266|C||Land|||This land enters tapped unless a player has 13 or less life.${T}: Add {R} or {W}.| +Razortrap Gorge|Duskmourn: House of Horror|267|C||Land|||This land enters tapped unless a player has 13 or less life.${T}: Add {B} or {R}.| +Strangled Cemetery|Duskmourn: House of Horror|268|C||Land|||This land enters tapped unless a player has 13 or less life.${T}: Add {B} or {G}.| +Terramorphic Expanse|Duskmourn: House of Horror|269|C||Land|||{T}, Sacrifice this land: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.| Thornspire Verge|Duskmourn: House of Horror|270|R||Land|||{T}: Add {R}.${T}: Add {G}. Activate only if you control a Mountain or a Forest.| -Valgavoth's Lair|Duskmourn: House of Horror|271|R||Enchantment Land|||Hexproof$Valgavoth's Lair enters tapped. As it enters, choose a color.${T}: Add one mana of the chosen color.| +Valgavoth's Lair|Duskmourn: House of Horror|271|R||Enchantment Land|||Hexproof$This land enters tapped. As it enters, choose a color.${T}: Add one mana of the chosen color.| +Plains|Duskmourn: House of Horror|272|C||Basic Land - Plains|||({T}: Add {W}.)| +Island|Duskmourn: House of Horror|273|C||Basic Land - Island|||({T}: Add {U}.)| +Swamp|Duskmourn: House of Horror|274|C||Basic Land - Swamp|||({T}: Add {B}.)| +Mountain|Duskmourn: House of Horror|275|C||Basic Land - Mountain|||({T}: Add {R}.)| +Forest|Duskmourn: House of Horror|276|C||Basic Land - Forest|||({T}: Add {G}.)| Plains|Duskmourn: House of Horror|277|C||Basic Land - Plains|||({T}: Add {W}.)| +Plains|Duskmourn: House of Horror|278|C||Basic Land - Plains|||({T}: Add {W}.)| Island|Duskmourn: House of Horror|279|C||Basic Land - Island|||({T}: Add {U}.)| +Island|Duskmourn: House of Horror|280|C||Basic Land - Island|||({T}: Add {U}.)| Swamp|Duskmourn: House of Horror|281|C||Basic Land - Swamp|||({T}: Add {B}.)| +Swamp|Duskmourn: House of Horror|282|C||Basic Land - Swamp|||({T}: Add {B}.)| Mountain|Duskmourn: House of Horror|283|C||Basic Land - Mountain|||({T}: Add {R}.)| +Mountain|Duskmourn: House of Horror|284|C||Basic Land - Mountain|||({T}: Add {R}.)| Forest|Duskmourn: House of Horror|285|C||Basic Land - Forest|||({T}: Add {G}.)| +Forest|Duskmourn: House of Horror|286|C||Basic Land - Forest|||({T}: Add {G}.)| +Grand Entryway // Elegant Rotunda|Duskmourn: House of Horror|287|C|{1}{W}|Enchantment - Room|||When you unlock this door, create a 1/1 white Glimmer enchantment creature token.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Elegant Rotunda${2}{W}$Enchantment -- Room$When you unlock this door, put a +1/+1 counter on each of up to two target creatures.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Optimistic Scavenger|Duskmourn: House of Horror|288|U|{W}|Creature - Human Scout|1|1|Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, put a +1/+1 counter on target creature.| +Reluctant Role Model|Duskmourn: House of Horror|289|R|{1}{W}|Creature - Human Survivor|2|2|Survival -- At the beginning of your second main phase, if this creature is tapped, put a flying, lifelink, or +1/+1 counter on it.$Whenever this creature or another creature you control dies, if it had counters on it, put those counters on up to one target creature.| +Entity Tracker|Duskmourn: House of Horror|290|R|{2}{U}|Creature - Human Scout|2|3|Flash$Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, draw a card.| +Stay Hidden, Stay Silent|Duskmourn: House of Horror|291|U|{1}{U}|Enchantment - Aura|||Enchant creature$When this Aura enters, tap enchanted creature.$Enchanted creature doesn't untap during its controller's untap step.${4}{U}{U}: Shuffle enchanted creature into its owner's library, then manifest dread. Activate only as a sorcery.| +Come Back Wrong|Duskmourn: House of Horror|292|R|{2}{B}|Sorcery|||Destroy target creature. If a creature card is put into a graveyard this way, return it to the battlefield under your control. Sacrifice it at the beginning of your next end step.| +Meathook Massacre II|Duskmourn: House of Horror|293|M|{X}{X}{B}{B}{B}{B}|Legendary Enchantment|||When Meathook Massacre II enters, each player sacrifices X creatures of their choice.$Whenever a creature you control dies, you may pay 3 life. If you do, return that card under your control with a finality counter on it.$Whenever a creature an opponent controls dies, they may pay 3 life. If they don't, return that card under your control with a finality counter on it.| +Unstoppable Slasher|Duskmourn: House of Horror|294|R|{2}{B}|Creature - Zombie Assassin|2|3|Deathtouch$Whenever this creature deals combat damage to a player, they lose half their life, rounded up.$When this creature dies, if it had no counters on it, return it to the battlefield tapped under its owner's control with two stun counters on it.| +Clockwork Percussionist|Duskmourn: House of Horror|295|C|{R}|Artifact Creature - Monkey Toy|1|1|Haste$When this creature dies, exile the top card of your library. You may play it until the end of your next turn.| +Cursed Recording|Duskmourn: House of Horror|296|R|{2}{R}{R}|Artifact|||Whenever you cast an instant or sorcery spell, put a time counter on this artifact. Then if there are seven or more time counters on it, remove those counters and it deals 20 damage to you.${T}: When you next cast an instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy.| +Norin, Swift Survivalist|Duskmourn: House of Horror|297|U|{R}|Legendary Creature - Human Coward|2|1|Norin can't block.$Whenever a creature you control becomes blocked, you may exile it. You may play that card from exile this turn.| +The Rollercrusher Ride|Duskmourn: House of Horror|298|M|{X}{2}{R}|Legendary Enchantment|||Delirium -- If a source you control would deal noncombat damage to a permanent or player while there are four or more card types among cards in your graveyard, it deals double that damage instead.$When The Rollercrusher Ride enters, it deals X damage to each of up to X target creatures.| +Kona, Rescue Beastie|Duskmourn: House of Horror|299|R|{3}{G}|Legendary Creature - Beast Survivor|4|3|Survival -- At the beginning of your second main phase, if Kona is tapped, you may put a permanent card from your hand onto the battlefield.| +Oblivious Bookworm|Duskmourn: House of Horror|300|U|{G}{U}|Creature - Human Wizard|2|3|At the beginning of your end step, you may draw a card. If you do, discard a card unless a permanent entered the battlefield face down under your control this turn or you turned a permanent face up this turn.| +The Swarmweaver|Duskmourn: House of Horror|301|R|{2}{B}{G}|Legendary Artifact Creature - Scarecrow|2|3|When The Swarmweaver enters, create two 1/1 black and green Insect creature tokens with flying.$Delirium -- As long as there are four or more card types among cards in your graveyard, Insects and Spiders you control get +1/+1 and have deathtouch.| +Ghostly Dancers|Duskmourn: House of Horror|302|R|{3}{W}{W}|Creature - Spirit|2|5|Flying$When this creature enters, return an enchantment card from your graveyard to your hand or unlock a locked door of a Room you control.$Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, create a 3/1 white Spirit creature token with flying.| +Reluctant Role Model|Duskmourn: House of Horror|303|R|{1}{W}|Creature - Human Survivor|2|2|Survival -- At the beginning of your second main phase, if this creature is tapped, put a flying, lifelink, or +1/+1 counter on it.$Whenever this creature or another creature you control dies, if it had counters on it, put those counters on up to one target creature.| +Split Up|Duskmourn: House of Horror|304|R|{1}{W}{W}|Sorcery|||Choose one --$* Destroy all tapped creatures.$* Destroy all untapped creatures.| +Unidentified Hovership|Duskmourn: House of Horror|305|R|{1}{W}{W}|Artifact - Vehicle|2|2|Flying$When this Vehicle enters, exile up to one target creature with toughness 5 or less.$When this Vehicle leaves the battlefield, the exiled card's owner manifests dread.$Crew 1| +Unwanted Remake|Duskmourn: House of Horror|306|U|{W}|Instant|||Destroy target creature. Its controller manifests dread.| +Entity Tracker|Duskmourn: House of Horror|307|R|{2}{U}|Creature - Human Scout|2|3|Flash$Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, draw a card.| +Marina Vendrell's Grimoire|Duskmourn: House of Horror|308|R|{5}{U}|Legendary Artifact|||When Marina Vendrell's Grimoire enters, if you cast it, draw five cards.$You have no maximum hand size and don't lose the game for having 0 or less life.$Whenever you gain life, draw that many cards.$Whenever you lose life, discard that many cards. Then if you have no cards in hand, you lose the game.| +Come Back Wrong|Duskmourn: House of Horror|309|R|{2}{B}|Sorcery|||Destroy target creature. If a creature card is put into a graveyard this way, return it to the battlefield under your control. Sacrifice it at the beginning of your next end step.| +Demonic Counsel|Duskmourn: House of Horror|310|R|{1}{B}|Sorcery|||Search your library for a Demon card, reveal it, put it into your hand, then shuffle.$Delirium -- If there are four or more card types among cards in your graveyard, instead search your library for any card, put it into your hand, then shuffle.| +Meathook Massacre II|Duskmourn: House of Horror|311|M|{X}{X}{B}{B}{B}{B}|Legendary Enchantment|||When Meathook Massacre II enters, each player sacrifices X creatures of their choice.$Whenever a creature you control dies, you may pay 3 life. If you do, return that card under your control with a finality counter on it.$Whenever a creature an opponent controls dies, they may pay 3 life. If they don't, return that card under your control with a finality counter on it.| +Unstoppable Slasher|Duskmourn: House of Horror|312|R|{2}{B}|Creature - Zombie Assassin|2|3|Deathtouch$Whenever this creature deals combat damage to a player, they lose half their life, rounded up.$When this creature dies, if it had no counters on it, return it to the battlefield tapped under its owner's control with two stun counters on it.| +Withering Torment|Duskmourn: House of Horror|313|U|{2}{B}|Instant|||Destroy target creature or enchantment. You lose 2 life.| +Chainsaw|Duskmourn: House of Horror|314|R|{1}{R}|Artifact - Equipment|||When this Equipment enters, it deals 3 damage to up to one target creature.$Whenever one or more creatures die, put a rev counter on this Equipment.$Equipped creature gets +X/+0, where X is the number of rev counters on this Equipment.$Equip {3}| +Cursed Recording|Duskmourn: House of Horror|315|R|{2}{R}{R}|Artifact|||Whenever you cast an instant or sorcery spell, put a time counter on this artifact. Then if there are seven or more time counters on it, remove those counters and it deals 20 damage to you.${T}: When you next cast an instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy.| +Fear of Missing Out|Duskmourn: House of Horror|316|R|{1}{R}|Enchantment Creature - Nightmare|2|3|When this creature enters, discard a card, then draw a card.$Delirium -- Whenever this creature attacks for the first time each turn, if there are four or more card types among cards in your graveyard, untap target creature. After this phase, there is an additional combat phase.| +The Rollercrusher Ride|Duskmourn: House of Horror|317|M|{X}{2}{R}|Legendary Enchantment|||Delirium -- If a source you control would deal noncombat damage to a permanent or player while there are four or more card types among cards in your graveyard, it deals double that damage instead.$When The Rollercrusher Ride enters, it deals X damage to each of up to X target creatures.| +Waltz of Rage|Duskmourn: House of Horror|318|R|{3}{R}{R}|Sorcery|||Target creature you control deals damage equal to its power to each other creature. Until end of turn, whenever a creature you control dies, exile the top card of your library. You may play it until the end of your next turn.| +Balustrade Wurm|Duskmourn: House of Horror|319|R|{3}{G}{G}|Creature - Wurm|5|5|This spell can't be countered.$Trample, haste$Delirium -- {2}{G}{G}: Return this card from your graveyard to the battlefield with a finality counter on it. Activate only if there are four or more card types among cards in your graveyard and only as a sorcery.| +Hedge Shredder|Duskmourn: House of Horror|320|R|{2}{G}{G}|Artifact - Vehicle|5|5|Whenever this Vehicle attacks, you may mill two cards.$Whenever one or more land cards are put into your graveyard from your library, put them onto the battlefield tapped.$Crew 1| +Insidious Fungus|Duskmourn: House of Horror|321|U|{G}|Creature - Fungus|1|2|{2}, Sacrifice this creature: Choose one --$* Destroy target artifact.$* Destroy target enchantment.$* Draw a card. Then you may put a land card from your hand onto the battlefield tapped.| +Omnivorous Flytrap|Duskmourn: House of Horror|322|R|{2}{G}|Creature - Plant|2|4|Delirium -- Whenever this creature enters or attacks, if there are four or more card types among cards in your graveyard, distribute two +1/+1 counters among one or two target creatures. Then if there are six or more card types among cards in your graveyard, double the number of +1/+1 counters on those creatures.| +Under the Skin|Duskmourn: House of Horror|323|U|{2}{G}|Sorcery|||Manifest dread.$You may return a permanent card from your graveyard to your hand.| +Valgavoth's Onslaught|Duskmourn: House of Horror|324|R|{X}{X}{G}|Sorcery|||Manifest dread X times, then put X +1/+1 counters on each of those creatures.| +Peer Past the Veil|Duskmourn: House of Horror|325|R|{2}{R}{G}|Instant|||Discard your hand. Then draw X cards, where X is the number of card types among cards in your graveyard.| +Ghost Vacuum|Duskmourn: House of Horror|326|R|{1}|Artifact|||{T}: Exile target card from a graveyard.${6}, {T}, Sacrifice this artifact: Put each creature card exiled with this artifact onto the battlefield under your control with a flying counter on it. Each of them is a 1/1 Spirit in addition to its other types. Activate only as a sorcery.| +Valgavoth's Lair|Duskmourn: House of Horror|327|R||Enchantment Land|||Hexproof$This land enters tapped. As it enters, choose a color.${T}: Add one mana of the chosen color.| +Kaito, Bane of Nightmares|Duskmourn: House of Horror|328|M|{2}{U}{B}|Legendary Planeswalker - Kaito|4|Ninjutsu {1}{U}{B}$During your turn, as long as Kaito has one or more loyalty counters on him, he's a 3/4 Ninja creature and has hexproof.$+1: You get an emblem with "Ninjas you control get +1/+1."$0: Surveil 2. Then draw a card for each opponent who lost life this turn.$-2: Tap target creature. Put two stun counters on it.| +Blazemire Verge|Duskmourn: House of Horror|329|R||Land|||{T}: Add {B}.${T}: Add {R}. Activate only if you control a Swamp or a Mountain.| +Floodfarm Verge|Duskmourn: House of Horror|330|R||Land|||{T}: Add {W}.${T}: Add {U}. Activate only if you control a Plains or an Island.| +Gloomlake Verge|Duskmourn: House of Horror|331|R||Land|||{T}: Add {U}.${T}: Add {B}. Activate only if you control an Island or a Swamp.| +Hushwood Verge|Duskmourn: House of Horror|332|R||Land|||{T}: Add {G}.${T}: Add {W}. Activate only if you control a Forest or a Plains.| +Thornspire Verge|Duskmourn: House of Horror|333|R||Land|||{T}: Add {R}.${T}: Add {G}. Activate only if you control a Mountain or a Forest.| +Dazzling Theater // Prop Room|Duskmourn: House of Horror|334|R|{3}{W}|Enchantment - Room|||Creature spells you cast have convoke.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Prop Room${2}{W}$Enchantment -- Room$Untap each creature you control during each other player's untap step.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Dollmaker's Shop // Porcelain Gallery|Duskmourn: House of Horror|335|M|{1}{W}|Enchantment - Room|||Whenever one or more non-Toy creatures you control attack a player, create a 1/1 white Toy artifact creature token.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Porcelain Gallery${4}{W}{W}$Enchantment -- Room$Creatures you control have base power and toughness each equal to the number of creatures you control.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Central Elevator // Promising Stairs|Duskmourn: House of Horror|336|R|{3}{U}|Enchantment - Room|||When you unlock this door, search your library for a Room card that doesn't have the same name as a Room you control, reveal it, put it into your hand, then shuffle.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Promising Stairs${2}{U}$Enchantment -- Room$At the beginning of your upkeep, surveil 1. You win the game if there are eight or more different names among unlocked doors of Rooms you control.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Mirror Room // Fractured Realm|Duskmourn: House of Horror|337|M|{2}{U}|Enchantment - Room|||When you unlock this door, create a token that's a copy of target creature you control, except it's a Reflection in addition to its other creature types.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Fractured Realm${5}{U}{U}$Enchantment -- Room$If a triggered ability of a permanent you control triggers, that ability triggers an additional time.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Funeral Room // Awakening Hall|Duskmourn: House of Horror|338|M|{2}{B}|Enchantment - Room|||Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Awakening Hall${6}{B}{B}$Enchantment -- Room$When you unlock this door, return all creature cards from your graveyard to the battlefield.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Unholy Annex // Ritual Chamber|Duskmourn: House of Horror|339|R|{2}{B}|Enchantment - Room|||At the beginning of your end step, draw a card. If you control a Demon, each opponent loses 2 life and you gain 2 life. Otherwise, you lose 2 life.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Ritual Chamber${3}{B}{B}$Enchantment -- Room$When you unlock this door, create a 6/6 black Demon creature token with flying.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Charred Foyer // Warped Space|Duskmourn: House of Horror|340|M|{3}{R}|Enchantment - Room|||At the beginning of your upkeep, exile the top card of your library. You may play it this turn.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Warped Space${4}{R}{R}$Enchantment -- Room$Once each turn, you may pay {0} rather than pay the mana cost for a spell you cast from exile.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Walk-In Closet // Forgotten Cellar|Duskmourn: House of Horror|341|M|{2}{G}|Enchantment - Room|||You may play lands from your graveyard.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Forgotten Cellar${3}{G}{G}$Enchantment -- Room$When you unlock this door, you may cast spells from your graveyard this turn, and if a card would be put into your graveyard from anywhere this turn, exile it instead.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Restricted Office // Lecture Hall|Duskmourn: House of Horror|342|R|{2}{W}{W}|Enchantment - Room|||When you unlock this door, destroy all creatures with power 3 or greater.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Lecture Hall${5}{U}{U}$Enchantment -- Room$Other permanents you control have hexproof.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Roaring Furnace // Steaming Sauna|Duskmourn: House of Horror|343|R|{1}{R}|Enchantment - Room|||When you unlock this door, this Room deals damage equal to the number of cards in your hand to target creature an opponent controls.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)$Steaming Sauna${3}{U}{U}$Enchantment -- Room$You have no maximum hand size.$At the beginning of your end step, draw a card.$(You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.)| +Abhorrent Oculus|Duskmourn: House of Horror|344|M|{2}{U}|Creature - Eye|5|5|As an additional cost to cast this spell, exile six cards from your graveyard.$Flying$At the beginning of each opponent's upkeep, manifest dread.| +Silent Hallcreeper|Duskmourn: House of Horror|345|R|{1}{U}|Enchantment Creature - Horror|1|1|This creature can't be blocked.$Whenever this creature deals combat damage to a player, choose one that hasn't been chosen --$* Put two +1/+1 counters on this creature.$* Draw a card.$* This creature becomes a copy of another target creature you control.| +Doomsday Excruciator|Duskmourn: House of Horror|346|R|{B}{B}{B}{B}{B}{B}|Creature - Demon|6|6|Flying$When this creature enters, if it was cast, each player exiles all but the bottom six cards of their library face down.$At the beginning of your upkeep, draw a card.| +Razorkin Needlehead|Duskmourn: House of Horror|347|R|{R}{R}|Creature - Human Assassin|2|2|This creature has first strike during your turn.$Whenever an opponent draws a card, this creature deals 1 damage to them.| +Screaming Nemesis|Duskmourn: House of Horror|348|M|{2}{R}|Creature - Spirit|3|3|Haste$Whenever this creature is dealt damage, it deals that much damage to any other target. If a player is dealt damage this way, they can't gain life for the rest of the game.| +Hauntwoods Shrieker|Duskmourn: House of Horror|349|M|{1}{G}{G}|Creature - Beast Mutant|3|3|Whenever this creature attacks, manifest dread.${1}{G}: Reveal target face-down permanent. If it's a creature card, you may turn it face up.| +Undead Sprinter|Duskmourn: House of Horror|350|R|{B}{R}|Creature - Zombie|2|2|Trample, haste$You may cast this card from your graveyard if a non-Zombie creature died this turn. If you do, this creature enters with a +1/+1 counter on it.| +The Wandering Rescuer|Duskmourn: House of Horror|351|M|{3}{W}{W}|Legendary Creature - Human Samurai Noble|3|4|Flash$Convoke$Double strike$Other tapped creatures you control have hexproof.| +Valgavoth, Terror Eater|Duskmourn: House of Horror|352|M|{6}{B}{B}{B}|Legendary Creature - Elder Demon|9|9|Flying, lifelink$Ward--Sacrifice three nonland permanents.$If a card you didn't control would be put into an opponent's graveyard from anywhere, exile it instead.$During your turn, you may play cards exiled with Valgavoth. If you cast a spell this way, pay life equal to its mana value rather than pay its mana cost.| +Tyvar, the Pummeler|Duskmourn: House of Horror|353|M|{1}{G}{G}|Legendary Creature - Elf Warrior|3|3|Tap another untapped creature you control: Tyvar gains indestructible until end of turn. Tap it.${3}{G}{G}: Creatures you control get +X/+X until end of turn, where X is the greatest power among creatures you control.| +Kaito, Bane of Nightmares|Duskmourn: House of Horror|354|M|{2}{U}{B}|Legendary Planeswalker - Kaito|4|Ninjutsu {1}{U}{B}$During your turn, as long as Kaito has one or more loyalty counters on him, he's a 3/4 Ninja creature and has hexproof.$+1: You get an emblem with "Ninjas you control get +1/+1."$0: Surveil 2. Then draw a card for each opponent who lost life this turn.$-2: Tap target creature. Put two stun counters on it.| +Niko, Light of Hope|Duskmourn: House of Horror|355|M|{2}{W}{U}|Legendary Creature - Human Wizard|3|4|When Niko enters, create two Shard tokens.${2}, {T}: Exile target nonlegendary creature you control. Shards you control become copies of it until the next end step. Return it to the battlefield under its owner's control at the beginning of the next end step.| +Toby, Beastie Befriender|Duskmourn: House of Horror|356|R|{2}{W}|Legendary Creature - Human Wizard|1|1|When Toby enters, create a 4/4 white Beast creature token with "This token can't attack or block alone."$As long as you control four or more creature tokens, creature tokens you control have flying.| +The Mindskinner|Duskmourn: House of Horror|357|R|{U}{U}{U}|Legendary Enchantment Creature - Nightmare|10|1|The Mindskinner can't be blocked.$If a source you control would deal damage to an opponent, prevent that damage and each opponent mills that many cards.| +Kona, Rescue Beastie|Duskmourn: House of Horror|358|R|{3}{G}|Legendary Creature - Beast Survivor|4|3|Survival -- At the beginning of your second main phase, if Kona is tapped, you may put a permanent card from your hand onto the battlefield.| +The Jolly Balloon Man|Duskmourn: House of Horror|359|R|{1}{R}{W}|Legendary Creature - Human Clown|1|4|Haste${1}, {T}: Create a token that's a copy of another target creature you control, except it's a 1/1 red Balloon creature in addition to its other colors and types and it has flying and haste. Sacrifice it at the beginning of the next end step. Activate only as a sorcery.| +Marina Vendrell|Duskmourn: House of Horror|360|R|{W}{U}{B}{R}{G}|Legendary Creature - Human Warlock|3|5|When Marina Vendrell enters, reveal the top seven cards of your library. Put all enchantment cards from among them into your hand and the rest on the bottom of your library in a random order.${T}: Lock or unlock a door of target Room you control. Activate only as a sorcery.| +Nashi, Searcher in the Dark|Duskmourn: House of Horror|361|R|{U}{B}|Legendary Creature - Rat Ninja Wizard|2|2|Menace$Whenever Nashi deals combat damage to a player, you mill that many cards. You may put any number of legendary and/or enchantment cards from among them into your hand. If you put no cards into your hand this way, put a +1/+1 counter on Nashi.| +Rip, Spawn Hunter|Duskmourn: House of Horror|362|R|{2}{G}{W}|Legendary Creature - Human Survivor|4|4|Survival -- At the beginning of your second main phase, if Rip is tapped, reveal the top X cards of your library, where X is its power. Put any number of creature and/or Vehicle cards with different powers from among them into your hand. Put the rest on the bottom of your library in a random order.| +The Swarmweaver|Duskmourn: House of Horror|363|R|{2}{B}{G}|Legendary Artifact Creature - Scarecrow|2|3|When The Swarmweaver enters, create two 1/1 black and green Insect creature tokens with flying.$Delirium -- As long as there are four or more card types among cards in your graveyard, Insects and Spiders you control get +1/+1 and have deathtouch.| +Victor, Valgavoth's Seneschal|Duskmourn: House of Horror|364|R|{1}{W}{B}|Legendary Creature - Human Warlock|3|3|Eerie -- Whenever an enchantment you control enters and whenever you fully unlock a Room, surveil 2 if this is the first time this ability has resolved this turn. If it's the second time, each opponent discards a card. If it's the third time, put a creature card from a graveyard onto the battlefield under your control.| +Winter, Misanthropic Guide|Duskmourn: House of Horror|365|R|{1}{B}{R}{G}|Legendary Creature - Human Warlock|3|4|Ward {2}$At the beginning of your upkeep, each player draws two cards.$Delirium -- As long as there are four or more card types among cards in your graveyard, each opponent's maximum hand size is equal to seven minus the number of those card types.| +Zimone, All-Questioning|Duskmourn: House of Horror|366|R|{1}{G}{U}|Legendary Creature - Human Wizard|1|1|At the beginning of your end step, if a land entered the battlefield under your control this turn and you control a prime number of lands, create Primo, the Indivisible, a legendary 0/0 green and blue Fractal creature token, then put that many +1/+1 counters on it.| +Marvin, Murderous Mimic|Duskmourn: House of Horror|367|R|{2}|Legendary Artifact Creature - Toy|2|2|Marvin has all activated abilities of creatures you control that don't have the same name as this creature.| +Enduring Innocence|Duskmourn: House of Horror|368|R|{1}{W}{W}|Enchantment Creature - Sheep Glimmer|2|1|Lifelink$Whenever one or more other creatures you control with power 2 or less enter, draw a card. This ability triggers only once each turn.$When Enduring Innocence dies, if it was a creature, return it to the battlefield under its owner's control. It's an enchantment.| +Leyline of Hope|Duskmourn: House of Horror|369|R|{2}{W}{W}|Enchantment|||If this card is in your opening hand, you may begin the game with it on the battlefield.$If you would gain life, you gain that much life plus 1 instead.$As long as you have at least 7 life more than your starting life total, creatures you control get +2/+2.| +Overlord of the Mistmoors|Duskmourn: House of Horror|370|M|{5}{W}{W}|Enchantment Creature - Avatar Horror|6|6|Impending 4--{2}{W}{W}$Whenever this permanent enters or attacks, create two 2/1 white Insect creature tokens with flying.| +Enduring Curiosity|Duskmourn: House of Horror|371|R|{2}{U}{U}|Enchantment Creature - Cat Glimmer|4|3|Flash$Whenever a creature you control deals combat damage to a player, draw a card.$When Enduring Curiosity dies, if it was a creature, return it to the battlefield under its owner's control. It's an enchantment.| +Leyline of Transformation|Duskmourn: House of Horror|372|R|{2}{U}{U}|Enchantment|||If this card is in your opening hand, you may begin the game with it on the battlefield.$As this enchantment enters, choose a creature type.$Creatures you control are the chosen type 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.| +Overlord of the Floodpits|Duskmourn: House of Horror|373|M|{3}{U}{U}|Enchantment Creature - Avatar Horror|5|3|Impending 4--{1}{U}{U}$Flying$Whenever this permanent enters or attacks, draw two cards, then discard a card.| +Enduring Tenacity|Duskmourn: House of Horror|374|R|{2}{B}{B}|Enchantment Creature - Snake Glimmer|4|3|Whenever you gain life, target opponent loses that much life.$When Enduring Tenacity dies, if it was a creature, return it to the battlefield under its owner's control. It's an enchantment.| +Grievous Wound|Duskmourn: House of Horror|375|R|{3}{B}{B}|Enchantment - Aura|||Enchant player$Enchanted player can't gain life.$Whenever enchanted player is dealt damage, they lose half their life, rounded up.| +Leyline of the Void|Duskmourn: House of Horror|376|R|{2}{B}{B}|Enchantment|||If this card is in your opening hand, you may begin the game with it on the battlefield.$If a card would be put into an opponent's graveyard from anywhere, exile it instead.| +Overlord of the Balemurk|Duskmourn: House of Horror|377|M|{3}{B}{B}|Enchantment Creature - Avatar Horror|5|5|Impending 5--{1}{B}$Whenever this permanent enters or attacks, mill four cards, then you may return a non-Avatar creature card or a planeswalker card from your graveyard to your hand.| +Enduring Courage|Duskmourn: House of Horror|378|R|{2}{R}{R}|Enchantment Creature - Dog Glimmer|3|3|Whenever another creature you control enters, it gets +2/+0 and gains haste until end of turn.$When Enduring Courage dies, if it was a creature, return it to the battlefield under its owner's control. It's an enchantment.| +Leyline of Resonance|Duskmourn: House of Horror|379|R|{2}{R}{R}|Enchantment|||If this card is in your opening hand, you may begin the game with it on the battlefield.$Whenever you cast an instant or sorcery spell that targets only a single creature you control, copy that spell. You may choose new targets for the copy.| +Overlord of the Boilerbilges|Duskmourn: House of Horror|380|M|{4}{R}{R}|Enchantment Creature - Avatar Horror|5|5|Impending 4--{2}{R}{R}$Whenever this permanent enters or attacks, it deals 4 damage to any target.| +Enduring Vitality|Duskmourn: House of Horror|381|R|{1}{G}{G}|Enchantment Creature - Elk Glimmer|3|3|Vigilance$Creatures you control have "{T}: Add one mana of any color."$When Enduring Vitality dies, if it was a creature, return it to the battlefield under its owner's control. It's an enchantment.| +Leyline of Mutation|Duskmourn: House of Horror|382|R|{2}{G}{G}|Enchantment|||If this card is in your opening hand, you may begin the game with it on the battlefield.$You may pay {W}{U}{B}{R}{G} rather than pay the mana cost for spells you cast.| +Overlord of the Hauntwoods|Duskmourn: House of Horror|383|M|{3}{G}{G}|Enchantment Creature - Avatar Horror|6|5|Impending 4--{1}{G}{G}$Whenever this permanent enters or attacks, create a tapped colorless land token named Everywhere that is every basic land type.| +Twitching Doll|Duskmourn: House of Horror|384|R|{1}{G}|Artifact Creature - Spider Toy|2|2|{T}: Add one mana of any color. Put a nest counter on this creature.${T}, Sacrifice this creature: Create a 2/2 green Spider creature token with reach for each counter on this creature. Activate only as a sorcery.| +Dissection Tools|Duskmourn: House of Horror|385|R|{5}|Artifact - Equipment|||When this Equipment enters, manifest dread, then attach this Equipment to that creature.$Equipped creature gets +2/+2 and has deathtouch and lifelink.$Equip--Sacrifice a creature.| +Enduring Innocence|Duskmourn: House of Horror|386|M|{1}{W}{W}|Enchantment Creature - Sheep Glimmer|2|1|Lifelink$Whenever one or more other creatures you control with power 2 or less enter, draw a card. This ability triggers only once each turn.$When Enduring Innocence dies, if it was a creature, return it to the battlefield under its owner's control. It's an enchantment.| +Overlord of the Mistmoors|Duskmourn: House of Horror|387|M|{5}{W}{W}|Enchantment Creature - Avatar Horror|6|6|Impending 4--{2}{W}{W}$Whenever this permanent enters or attacks, create two 2/1 white Insect creature tokens with flying.| +Enduring Curiosity|Duskmourn: House of Horror|388|M|{2}{U}{U}|Enchantment Creature - Cat Glimmer|4|3|Flash$Whenever a creature you control deals combat damage to a player, draw a card.$When Enduring Curiosity dies, if it was a creature, return it to the battlefield under its owner's control. It's an enchantment.| +Overlord of the Floodpits|Duskmourn: House of Horror|389|M|{3}{U}{U}|Enchantment Creature - Avatar Horror|5|3|Impending 4--{1}{U}{U}$Flying$Whenever this permanent enters or attacks, draw two cards, then discard a card.| +Enduring Tenacity|Duskmourn: House of Horror|390|M|{2}{B}{B}|Enchantment Creature - Snake Glimmer|4|3|Whenever you gain life, target opponent loses that much life.$When Enduring Tenacity dies, if it was a creature, return it to the battlefield under its owner's control. It's an enchantment.| +Overlord of the Balemurk|Duskmourn: House of Horror|391|M|{3}{B}{B}|Enchantment Creature - Avatar Horror|5|5|Impending 5--{1}{B}$Whenever this permanent enters or attacks, mill four cards, then you may return a non-Avatar creature card or a planeswalker card from your graveyard to your hand.| +Enduring Courage|Duskmourn: House of Horror|392|M|{2}{R}{R}|Enchantment Creature - Dog Glimmer|3|3|Whenever another creature you control enters, it gets +2/+0 and gains haste until end of turn.$When Enduring Courage dies, if it was a creature, return it to the battlefield under its owner's control. It's an enchantment.| +Overlord of the Boilerbilges|Duskmourn: House of Horror|393|M|{4}{R}{R}|Enchantment Creature - Avatar Horror|5|5|Impending 4--{2}{R}{R}$Whenever this permanent enters or attacks, it deals 4 damage to any target.| +Enduring Vitality|Duskmourn: House of Horror|394|M|{1}{G}{G}|Enchantment Creature - Elk Glimmer|3|3|Vigilance$Creatures you control have "{T}: Add one mana of any color."$When Enduring Vitality dies, if it was a creature, return it to the battlefield under its owner's control. It's an enchantment.| +Overlord of the Hauntwoods|Duskmourn: House of Horror|395|M|{3}{G}{G}|Enchantment Creature - Avatar Horror|6|5|Impending 4--{1}{G}{G}$Whenever this permanent enters or attacks, create a tapped colorless land token named Everywhere that is every basic land type.| +Enduring Innocence|Duskmourn: House of Horror|396|M|{1}{W}{W}|Enchantment Creature - Sheep Glimmer|2|1|Lifelink$Whenever one or more other creatures you control with power 2 or less enter, draw a card. This ability triggers only once each turn.$When Enduring Innocence dies, if it was a creature, return it to the battlefield under its owner's control. It's an enchantment.| +Overlord of the Mistmoors|Duskmourn: House of Horror|397|M|{5}{W}{W}|Enchantment Creature - Avatar Horror|6|6|Impending 4--{2}{W}{W}$Whenever this permanent enters or attacks, create two 2/1 white Insect creature tokens with flying.| +Enduring Curiosity|Duskmourn: House of Horror|398|M|{2}{U}{U}|Enchantment Creature - Cat Glimmer|4|3|Flash$Whenever a creature you control deals combat damage to a player, draw a card.$When Enduring Curiosity dies, if it was a creature, return it to the battlefield under its owner's control. It's an enchantment.| +Overlord of the Floodpits|Duskmourn: House of Horror|399|M|{3}{U}{U}|Enchantment Creature - Avatar Horror|5|3|Impending 4--{1}{U}{U}$Flying$Whenever this permanent enters or attacks, draw two cards, then discard a card.| +Enduring Tenacity|Duskmourn: House of Horror|400|M|{2}{B}{B}|Enchantment Creature - Snake Glimmer|4|3|Whenever you gain life, target opponent loses that much life.$When Enduring Tenacity dies, if it was a creature, return it to the battlefield under its owner's control. It's an enchantment.| +Overlord of the Balemurk|Duskmourn: House of Horror|401|M|{3}{B}{B}|Enchantment Creature - Avatar Horror|5|5|Impending 5--{1}{B}$Whenever this permanent enters or attacks, mill four cards, then you may return a non-Avatar creature card or a planeswalker card from your graveyard to your hand.| +Enduring Courage|Duskmourn: House of Horror|402|M|{2}{R}{R}|Enchantment Creature - Dog Glimmer|3|3|Whenever another creature you control enters, it gets +2/+0 and gains haste until end of turn.$When Enduring Courage dies, if it was a creature, return it to the battlefield under its owner's control. It's an enchantment.| +Overlord of the Boilerbilges|Duskmourn: House of Horror|403|M|{4}{R}{R}|Enchantment Creature - Avatar Horror|5|5|Impending 4--{2}{R}{R}$Whenever this permanent enters or attacks, it deals 4 damage to any target.| +Enduring Vitality|Duskmourn: House of Horror|404|M|{1}{G}{G}|Enchantment Creature - Elk Glimmer|3|3|Vigilance$Creatures you control have "{T}: Add one mana of any color."$When Enduring Vitality dies, if it was a creature, return it to the battlefield under its owner's control. It's an enchantment.| +Overlord of the Hauntwoods|Duskmourn: House of Horror|405|M|{3}{G}{G}|Enchantment Creature - Avatar Horror|6|5|Impending 4--{1}{G}{G}$Whenever this permanent enters or attacks, create a tapped colorless land token named Everywhere that is every basic land type.| +The Wandering Rescuer|Duskmourn: House of Horror|406|M|{3}{W}{W}|Legendary Creature - Human Samurai Noble|3|4|Flash$Convoke$Double strike$Other tapped creatures you control have hexproof.| +Valgavoth, Terror Eater|Duskmourn: House of Horror|407|M|{6}{B}{B}{B}|Legendary Creature - Elder Demon|9|9|Flying, lifelink$Ward--Sacrifice three nonland permanents.$If a card you didn't control would be put into an opponent's graveyard from anywhere, exile it instead.$During your turn, you may play cards exiled with Valgavoth. If you cast a spell this way, pay life equal to its mana value rather than pay its mana cost.| +Tyvar, the Pummeler|Duskmourn: House of Horror|408|M|{1}{G}{G}|Legendary Creature - Elf Warrior|3|3|Tap another untapped creature you control: Tyvar gains indestructible until end of turn. Tap it.${3}{G}{G}: Creatures you control get +X/+X until end of turn, where X is the greatest power among creatures you control.| +Kaito, Bane of Nightmares|Duskmourn: House of Horror|409|M|{2}{U}{B}|Legendary Planeswalker - Kaito|4|Ninjutsu {1}{U}{B}$During your turn, as long as Kaito has one or more loyalty counters on him, he's a 3/4 Ninja creature and has hexproof.$+1: You get an emblem with "Ninjas you control get +1/+1."$0: Surveil 2. Then draw a card for each opponent who lost life this turn.$-2: Tap target creature. Put two stun counters on it.| +Niko, Light of Hope|Duskmourn: House of Horror|410|M|{2}{W}{U}|Legendary Creature - Human Wizard|3|4|When Niko enters, create two Shard tokens.${2}, {T}: Exile target nonlegendary creature you control. Shards you control become copies of it until the next end step. Return it to the battlefield under its owner's control at the beginning of the next end step.| +Shardmage's Rescue|Duskmourn: House of Horror|411|U|{W}|Enchantment - Aura|||Flash$Enchant creature you control$As long as this Aura entered this turn, enchanted creature has hexproof.$Enchanted creature gets +1/+1.| +Valgavoth's Faithful|Duskmourn: House of Horror|412|U|{B}|Creature - Human Cleric|1|1|{3}{B}, Sacrifice this creature: Return target creature card from your graveyard to the battlefield. Activate only as a sorcery.| +Pyroclasm|Duskmourn: House of Horror|413|U|{1}{R}|Sorcery|||Pyroclasm deals 2 damage to each creature.| +Drag to the Roots|Duskmourn: House of Horror|414|U|{2}{B}{G}|Instant|||Delirium -- This spell costs {2} less to cast as long as there are four or more card types among cards in your graveyard.$Destroy target nonland permanent.| +Inquisitive Glimmer|Duskmourn: House of Horror|415|U|{W}{U}|Enchantment Creature - Fox Glimmer|2|3|Enchantment spells you cast cost {1} less to cast.$Unlock costs you pay cost {1} less.| +Grievous Wound|Duskmourn: House of Horror|416|R|{3}{B}{B}|Enchantment - Aura|||Enchant player$Enchanted player can't gain life.$Whenever enchanted player is dealt damage, they lose half their life, rounded up.| +Twitching Doll|Duskmourn: House of Horror|417|R|{1}{G}|Artifact Creature - Spider Toy|2|2|{T}: Add one mana of any color. Put a nest counter on this creature.${T}, Sacrifice this creature: Create a 2/2 green Spider creature token with reach for each counter on this creature. Activate only as a sorcery.| Sire of Seven Deaths|Foundations|1|M|{7}|Creature - Eldrazi|7|7|First strike, vigilance$Menace, trample$Reach, lifelink$Ward--Pay 7 life.| Arahbo, the First Fang|Foundations|2|R|{2}{W}|Legendary Creature - Cat Avatar|2|2|Other Cats you control get +1/+1.$Whenever Arahbo or another nontoken Cat you control enters, create a 1/1 white Cat creature token.| Armasaur Guide|Foundations|3|C|{4}{W}|Creature - Dinosaur|4|4|Vigilance$Whenever you attack with three or more creatures, put a +1/+1 counter on target creature you control.|