diff --git a/Mage.Sets/src/mage/cards/c/ConfirmSuspicions.java b/Mage.Sets/src/mage/cards/c/ConfirmSuspicions.java index 45b28c5b1b6..45f8fa35662 100644 --- a/Mage.Sets/src/mage/cards/c/ConfirmSuspicions.java +++ b/Mage.Sets/src/mage/cards/c/ConfirmSuspicions.java @@ -1,8 +1,5 @@ - package mage.cards.c; -import java.util.UUID; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.CounterTargetEffect; import mage.abilities.effects.keyword.InvestigateEffect; import mage.cards.CardImpl; @@ -10,27 +7,22 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.target.TargetSpell; +import java.util.UUID; + /** - * * @author fireshoes */ public final class ConfirmSuspicions extends CardImpl { public ConfirmSuspicions(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{3}{U}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{U}{U}"); // Counter target spell. getSpellAbility().addEffect(new CounterTargetEffect()); getSpellAbility().addTarget(new TargetSpell()); // Investigate three times. - Effect effect = new InvestigateEffect(); - effect.setText("

Investigate three times."); - getSpellAbility().addEffect(effect); - effect = new InvestigateEffect(); - effect.setText(null); - getSpellAbility().addEffect(effect); - getSpellAbility().addEffect(effect); + getSpellAbility().addEffect(new InvestigateEffect(3).concatBy("
")); } private ConfirmSuspicions(final ConfirmSuspicions card) { diff --git a/Mage.Sets/src/mage/cards/d/DawnheartRejuvenator.java b/Mage.Sets/src/mage/cards/d/DawnhartRejuvenator.java similarity index 70% rename from Mage.Sets/src/mage/cards/d/DawnheartRejuvenator.java rename to Mage.Sets/src/mage/cards/d/DawnhartRejuvenator.java index 0016e0a1c7e..5bf41fd9aed 100644 --- a/Mage.Sets/src/mage/cards/d/DawnheartRejuvenator.java +++ b/Mage.Sets/src/mage/cards/d/DawnhartRejuvenator.java @@ -14,9 +14,9 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class DawnheartRejuvenator extends CardImpl { +public final class DawnhartRejuvenator extends CardImpl { - public DawnheartRejuvenator(UUID ownerId, CardSetInfo setInfo) { + public DawnhartRejuvenator(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}"); this.subtype.add(SubType.HUMAN); @@ -24,19 +24,19 @@ public final class DawnheartRejuvenator extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(4); - // When Dawnheart Rejuvenator enters the battlefield, you gain 3 life. + // When Dawnhart Rejuvenator enters the battlefield, you gain 3 life. this.addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(3))); // {T}: Add one mana of any color. this.addAbility(new AnyColorManaAbility()); } - private DawnheartRejuvenator(final DawnheartRejuvenator card) { + private DawnhartRejuvenator(final DawnhartRejuvenator card) { super(card); } @Override - public DawnheartRejuvenator copy() { - return new DawnheartRejuvenator(this); + public DawnhartRejuvenator copy() { + return new DawnhartRejuvenator(this); } } diff --git a/Mage.Sets/src/mage/cards/f/FamishedForagers.java b/Mage.Sets/src/mage/cards/f/FamishedForagers.java new file mode 100644 index 00000000000..2b311111c82 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FamishedForagers.java @@ -0,0 +1,57 @@ +package mage.cards.f; + +import mage.MageInt; +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.condition.common.OpponentsLostLifeCondition; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.mana.BasicManaEffect; +import mage.abilities.hint.common.OpponentsLostLifeHint; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class FamishedForagers extends CardImpl { + + public FamishedForagers(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); + + this.subtype.add(SubType.VAMPIRE); + this.power = new MageInt(4); + this.toughness = new MageInt(3); + + // When Famished Foragers enters the battlefield, if an opponent lost life this turn, add {R}{R}{R}. + this.addAbility(new ConditionalInterveningIfTriggeredAbility( + new EntersBattlefieldTriggeredAbility(new BasicManaEffect(Mana.RedMana(3))), + OpponentsLostLifeCondition.instance, "When {this} enters the battlefield, " + + "if an opponent lost life this turn, add {R}{R}{R}." + ).addHint(OpponentsLostLifeHint.instance)); + + // {2}{R}, Discard a card: Draw a card. + Ability ability = new SimpleActivatedAbility( + new DrawCardSourceControllerEffect(1), new ManaCostsImpl<>("{2}{R}") + ); + ability.addCost(new DiscardCardCost()); + this.addAbility(ability); + } + + private FamishedForagers(final FamishedForagers card) { + super(card); + } + + @Override + public FamishedForagers copy() { + return new FamishedForagers(this); + } +} diff --git a/Mage.Sets/src/mage/cards/f/FoulPlay.java b/Mage.Sets/src/mage/cards/f/FoulPlay.java new file mode 100644 index 00000000000..e13f2ec8e10 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FoulPlay.java @@ -0,0 +1,44 @@ +package mage.cards.f; + +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.keyword.InvestigateEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.PowerPredicate; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class FoulPlay extends CardImpl { + + private static final FilterPermanent filter = new FilterCreaturePermanent("creature with power 2 or less"); + + static { + filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, 2)); + } + + public FoulPlay(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}"); + + // Destroy target creature with power 2 or less. Investigate. + this.getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getSpellAbility().addTarget(new TargetPermanent(filter)); + this.getSpellAbility().addEffect(new InvestigateEffect()); + } + + private FoulPlay(final FoulPlay card) { + super(card); + } + + @Override + public FoulPlay copy() { + return new FoulPlay(this); + } +} diff --git a/Mage.Sets/src/mage/cards/h/HowlOfTheHunt.java b/Mage.Sets/src/mage/cards/h/HowlOfTheHunt.java new file mode 100644 index 00000000000..e11626d675f --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HowlOfTheHunt.java @@ -0,0 +1,87 @@ +package mage.cards.h; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.UntapEnchantedEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.FlashAbility; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class HowlOfTheHunt extends CardImpl { + + public HowlOfTheHunt(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}"); + + this.subtype.add(SubType.AURA); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // When Howl of the Hunt enters the battlefield, if enchanted creature is a Wolf or Werewolf, untap that creature. + this.addAbility(new ConditionalInterveningIfTriggeredAbility( + new EntersBattlefieldTriggeredAbility(new UntapEnchantedEffect()), + HowlOfTheHuntCondition.instance, "When {this} enters the battlefield, " + + "if enchanted creature is a Wolf or Werewolf, untap that creature." + )); + + // Enchanted creature gets +2/+2 and has vigilance. + ability = new SimpleStaticAbility(new BoostEnchantedEffect(2, 2)); + ability.addEffect(new GainAbilityAttachedEffect( + VigilanceAbility.getInstance(), AttachmentType.AURA, Duration.WhileOnBattlefield + ).setText("and has vigilance")); + this.addAbility(ability); + } + + private HowlOfTheHunt(final HowlOfTheHunt card) { + super(card); + } + + @Override + public HowlOfTheHunt copy() { + return new HowlOfTheHunt(this); + } +} + +enum HowlOfTheHuntCondition implements Condition { + instance; + + @Override + public boolean apply(Game game, Ability source) { + Permanent enchantment = source.getSourcePermanentIfItStillExists(game); + if (enchantment == null) { + return false; + } + Permanent creature = game.getPermanent(enchantment.getAttachedTo()); + return creature != null && creature.hasSubtype(SubType.WOLF, game) || creature.hasSubtype(SubType.WEREWOLF, game); + } + + @Override + public String toString() { + return ""; + } +} diff --git a/Mage.Sets/src/mage/cards/j/JadarGhoulcallerOfNephalia.java b/Mage.Sets/src/mage/cards/j/JadarGhoulcallerOfNephalia.java index bd5dfdb44cb..a3f9c158e4f 100644 --- a/Mage.Sets/src/mage/cards/j/JadarGhoulcallerOfNephalia.java +++ b/Mage.Sets/src/mage/cards/j/JadarGhoulcallerOfNephalia.java @@ -4,7 +4,10 @@ import mage.MageInt; import mage.abilities.common.BeginningOfEndStepTriggeredAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.hint.Hint; +import mage.abilities.hint.ValueHint; import mage.abilities.keyword.DecayedAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -30,6 +33,9 @@ public final class JadarGhoulcallerOfNephalia extends CardImpl { private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0); + private static final Hint hint = new ValueHint( + "Creatures you control with decayed", new PermanentsOnBattlefieldCount(filter) + ); public JadarGhoulcallerOfNephalia(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); @@ -44,7 +50,7 @@ public final class JadarGhoulcallerOfNephalia extends CardImpl { this.addAbility(new BeginningOfEndStepTriggeredAbility( Zone.BATTLEFIELD, new CreateTokenEffect(new ZombieDecayedToken()), TargetController.YOU, condition, false - )); + ).addHint(hint)); } private JadarGhoulcallerOfNephalia(final JadarGhoulcallerOfNephalia card) { diff --git a/Mage.Sets/src/mage/cards/p/PestilentWolf.java b/Mage.Sets/src/mage/cards/p/PestilentWolf.java new file mode 100644 index 00000000000..9dac0401a84 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PestilentWolf.java @@ -0,0 +1,42 @@ +package mage.cards.p; + +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.DeathtouchAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class PestilentWolf extends CardImpl { + + public PestilentWolf(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); + + this.subtype.add(SubType.WOLF); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {2}{G}: Pestilent Wolf gains deathtouch until end of turn. + this.addAbility(new SimpleActivatedAbility(new GainAbilitySourceEffect( + DeathtouchAbility.getInstance(), Duration.EndOfTurn + ), new ManaCostsImpl<>("{2}{G}"))); + } + + private PestilentWolf(final PestilentWolf card) { + super(card); + } + + @Override + public PestilentWolf copy() { + return new PestilentWolf(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SecretsOfTheKey.java b/Mage.Sets/src/mage/cards/s/SecretsOfTheKey.java new file mode 100644 index 00000000000..52e01b162a5 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SecretsOfTheKey.java @@ -0,0 +1,55 @@ +package mage.cards.s; + +import mage.abilities.Ability; +import mage.abilities.condition.Condition; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.keyword.InvestigateEffect; +import mage.abilities.keyword.FlashbackAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.TimingRule; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.stack.Spell; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class SecretsOfTheKey extends CardImpl { + + public SecretsOfTheKey(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{U}"); + + // Investigate. If this spell was cast from a graveyard, investigate twice instead. + this.getSpellAbility().addEffect(new ConditionalOneShotEffect( + new InvestigateEffect(2), new InvestigateEffect(), SecretsOfTheKeyCondition.instance, + "Investigate. If this spell was cast from a graveyard, investigate twice instead." + )); + + // Flashback {3}{U} + this.addAbility(new FlashbackAbility(new ManaCostsImpl<>("{3}{U}"), TimingRule.INSTANT)); + } + + private SecretsOfTheKey(final SecretsOfTheKey card) { + super(card); + } + + @Override + public SecretsOfTheKey copy() { + return new SecretsOfTheKey(this); + } +} + +enum SecretsOfTheKeyCondition implements Condition { + instance; + + @Override + public boolean apply(Game game, Ability source) { + Spell spell = game.getSpell(source.getSourceId()); + return spell != null && spell.getFromZone() == Zone.GRAVEYARD; + } +} diff --git a/Mage.Sets/src/mage/cards/s/SigardaChampionOfLight.java b/Mage.Sets/src/mage/cards/s/SigardaChampionOfLight.java new file mode 100644 index 00000000000..d793c80da57 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SigardaChampionOfLight.java @@ -0,0 +1,74 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.CovenCondition; +import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.hint.common.CovenHint; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.FilterCard; +import mage.filter.common.FilterCreatureCard; +import mage.filter.common.FilterCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class SigardaChampionOfLight extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.HUMAN, "Humans"); + private static final FilterCard filter2 = new FilterCreatureCard("Human creature card"); + + static { + filter.add(SubType.HUMAN.getPredicate()); + } + + public SigardaChampionOfLight(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}{W}{W}"); + + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.ANGEL); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Humans you control get +1/+1. + this.addAbility(new SimpleStaticAbility(new BoostControlledEffect( + 1, 1, Duration.WhileOnBattlefield, filter + ))); + + // Coven — Whenever Sigarda attacks, if you control three or more creatures with different powers, look at the top five cards of your library. You may reveal a Human creature 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 AttacksTriggeredAbility(new LookLibraryAndPickControllerEffect( + StaticValue.get(5), false, StaticValue.get(1), filter2, + Zone.LIBRARY, false, true, false, Zone.HAND, true + ).setBackInRandomOrder(true)), CovenCondition.instance, AbilityWord.COVEN.formatWord() + + "Whenever {this} attacks, if you control three or more creatures with different powers, " + + "look at the top five cards of your library. You may reveal a Human creature card from among them " + + "and put it into your hand. Put the rest on the bottom of your library in a random order." + ).addHint(CovenHint.instance)); + } + + private SigardaChampionOfLight(final SigardaChampionOfLight card) { + super(card); + } + + @Override + public SigardaChampionOfLight copy() { + return new SigardaChampionOfLight(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TavernRuffian.java b/Mage.Sets/src/mage/cards/t/TavernRuffian.java new file mode 100644 index 00000000000..fa0f278d608 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TavernRuffian.java @@ -0,0 +1,43 @@ +package mage.cards.t; + +import mage.MageInt; +import mage.abilities.keyword.DayboundAbility; +import mage.abilities.keyword.TransformAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class TavernRuffian extends CardImpl { + + public TavernRuffian(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.WARRIOR); + this.subtype.add(SubType.WEREWOLF); + this.power = new MageInt(2); + this.toughness = new MageInt(5); + + this.transformable = true; + this.secondSideCardClazz = mage.cards.t.TavernSmasher.class; + + // Daybound + this.addAbility(new TransformAbility()); + this.addAbility(DayboundAbility.getInstance()); + } + + private TavernRuffian(final TavernRuffian card) { + super(card); + } + + @Override + public TavernRuffian copy() { + return new TavernRuffian(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TavernSmasher.java b/Mage.Sets/src/mage/cards/t/TavernSmasher.java new file mode 100644 index 00000000000..f837498bdb5 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TavernSmasher.java @@ -0,0 +1,41 @@ +package mage.cards.t; + +import mage.MageInt; +import mage.abilities.keyword.NightboundAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class TavernSmasher extends CardImpl { + + public TavernSmasher(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, ""); + + this.subtype.add(SubType.WEREWOLF); + + this.color.setRed(true); + + this.nightCard = true; + + this.power = new MageInt(6); + this.toughness = new MageInt(5); + + // Nightbound + this.addAbility(NightboundAbility.getInstance()); + } + + private TavernSmasher(final TavernSmasher card) { + super(card); + } + + @Override + public TavernSmasher copy() { + return new TavernSmasher(this); + } +} diff --git a/Mage.Sets/src/mage/cards/v/VillageReavers.java b/Mage.Sets/src/mage/cards/v/VillageReavers.java new file mode 100644 index 00000000000..fd5cf79fa3b --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VillageReavers.java @@ -0,0 +1,62 @@ +package mage.cards.v; + +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.HasteAbility; +import mage.abilities.keyword.NightboundAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.Predicates; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class VillageReavers extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("Wolves and Werewolves"); + + static { + filter.add(Predicates.or( + SubType.WOLF.getPredicate(), + SubType.WEREWOLF.getPredicate() + )); + } + + public VillageReavers(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, ""); + + this.subtype.add(SubType.WEREWOLF); + + this.color.setRed(true); + + this.nightCard = true; + + this.power = new MageInt(5); + this.toughness = new MageInt(4); + + // Wolves and Werewolves you control have haste. + this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( + HasteAbility.getInstance(), Duration.WhileOnBattlefield, filter + ))); + + // Nightbound + this.addAbility(NightboundAbility.getInstance()); + } + + private VillageReavers(final VillageReavers card) { + super(card); + } + + @Override + public VillageReavers copy() { + return new VillageReavers(this); + } +} diff --git a/Mage.Sets/src/mage/cards/v/VillageWatch.java b/Mage.Sets/src/mage/cards/v/VillageWatch.java new file mode 100644 index 00000000000..4641353d28f --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VillageWatch.java @@ -0,0 +1,46 @@ +package mage.cards.v; + +import mage.MageInt; +import mage.abilities.keyword.DayboundAbility; +import mage.abilities.keyword.HasteAbility; +import mage.abilities.keyword.TransformAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class VillageWatch extends CardImpl { + + public VillageWatch(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{R}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.WEREWOLF); + this.power = new MageInt(4); + this.toughness = new MageInt(3); + + this.transformable = true; + this.secondSideCardClazz = mage.cards.v.VillageReavers.class; + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // Daybound + this.addAbility(new TransformAbility()); + this.addAbility(DayboundAbility.getInstance()); + } + + private VillageWatch(final VillageWatch card) { + super(card); + } + + @Override + public VillageWatch copy() { + return new VillageWatch(this); + } +} diff --git a/Mage.Sets/src/mage/cards/w/Wavesifter.java b/Mage.Sets/src/mage/cards/w/Wavesifter.java index 4a05a057d7a..491a646c46e 100644 --- a/Mage.Sets/src/mage/cards/w/Wavesifter.java +++ b/Mage.Sets/src/mage/cards/w/Wavesifter.java @@ -1,7 +1,6 @@ package mage.cards.w; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.keyword.InvestigateEffect; import mage.abilities.keyword.EvokeAbility; @@ -29,9 +28,7 @@ public final class Wavesifter extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // When Wavesifter enters the battlefield, investigate twice. - Ability ability = new EntersBattlefieldTriggeredAbility(new InvestigateEffect().setText("investigate")); - ability.addEffect(new InvestigateEffect().setText("twice")); - this.addAbility(ability); + this.addAbility(new EntersBattlefieldTriggeredAbility(new InvestigateEffect(2))); // Evoke {G}{U} this.addAbility(new EvokeAbility("{G}{U}")); diff --git a/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java b/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java index 80b83d5ebe7..5480c3aeb00 100644 --- a/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java +++ b/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java @@ -4,11 +4,15 @@ import mage.cards.ExpansionSet; import mage.constants.Rarity; import mage.constants.SetType; +import java.util.Arrays; +import java.util.List; + /** * @author TheElk801 */ public final class InnistradMidnightHunt extends ExpansionSet { + private static final List unfinished = Arrays.asList("Arlinn, the Pack's Hope", "Arlinn, the Moon's Fury", "Brutal Cathar", "Moonrage Brute", "Tavern Ruffian", "Tavern Smasher", "Tovolar, Dire Overlord", "Tovolar, the Midnight Scourge", "Village Watch", "Village Reavers"); private static final InnistradMidnightHunt instance = new InnistradMidnightHunt(); public static InnistradMidnightHunt getInstance() { @@ -31,27 +35,40 @@ public final class InnistradMidnightHunt extends ExpansionSet { cards.add(new SetCardInfo("Candlelit Cavalry", 175, Rarity.COMMON, mage.cards.c.CandlelitCavalry.class)); cards.add(new SetCardInfo("Champion of the Perished", 91, Rarity.RARE, mage.cards.c.ChampionOfThePerished.class)); cards.add(new SetCardInfo("Consider", 44, Rarity.COMMON, mage.cards.c.Consider.class)); - cards.add(new SetCardInfo("Dawnheart Rejuvenator", 180, Rarity.COMMON, mage.cards.d.DawnheartRejuvenator.class)); + cards.add(new SetCardInfo("Dawnhart Rejuvenator", 180, Rarity.COMMON, mage.cards.d.DawnhartRejuvenator.class)); cards.add(new SetCardInfo("Defenestrate", 95, Rarity.COMMON, mage.cards.d.Defenestrate.class)); cards.add(new SetCardInfo("Deserted Beach", 260, Rarity.RARE, mage.cards.d.DesertedBeach.class)); + cards.add(new SetCardInfo("Famished Foragers", 138, Rarity.COMMON, mage.cards.f.FamishedForagers.class)); cards.add(new SetCardInfo("Festival Crasher", 140, Rarity.COMMON, mage.cards.f.FestivalCrasher.class)); cards.add(new SetCardInfo("Forest", 276, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Foul Play", 101, Rarity.UNCOMMON, mage.cards.f.FoulPlay.class)); cards.add(new SetCardInfo("Haunted Ridge", 263, Rarity.RARE, mage.cards.h.HauntedRidge.class)); + cards.add(new SetCardInfo("Howl of the Hunt", 188, Rarity.COMMON, mage.cards.h.HowlOfTheHunt.class)); cards.add(new SetCardInfo("Infernal Grasp", 107, Rarity.UNCOMMON, mage.cards.i.InfernalGrasp.class)); cards.add(new SetCardInfo("Island", 270, Rarity.LAND, mage.cards.basiclands.Island.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Jadar, Ghoulcaller of Nephalia", 108, Rarity.RARE, mage.cards.j.JadarGhoulcallerOfNephalia.class)); cards.add(new SetCardInfo("Join the Dance", 229, Rarity.UNCOMMON, mage.cards.j.JoinTheDance.class)); cards.add(new SetCardInfo("Mountain", 274, Rarity.LAND, mage.cards.basiclands.Mountain.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Overgrown Farmland", 265, Rarity.RARE, mage.cards.o.OvergrownFarmland.class)); + cards.add(new SetCardInfo("Pestilent Wolf", 192, Rarity.COMMON, mage.cards.p.PestilentWolf.class)); cards.add(new SetCardInfo("Plains", 268, Rarity.LAND, mage.cards.basiclands.Plains.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Play with Fire", 154, Rarity.UNCOMMON, mage.cards.p.PlayWithFire.class)); cards.add(new SetCardInfo("Rockfall Vale", 266, Rarity.RARE, mage.cards.r.RockfallVale.class)); + cards.add(new SetCardInfo("Secrets of the Key", 73, Rarity.COMMON, mage.cards.s.SecretsOfTheKey.class)); cards.add(new SetCardInfo("Shipwreck Marsh", 267, Rarity.RARE, mage.cards.s.ShipwreckMarsh.class)); + cards.add(new SetCardInfo("Sigarda, Champion of Light", 240, Rarity.MYTHIC, mage.cards.s.SigardaChampionOfLight.class)); cards.add(new SetCardInfo("Snarling Wolf", 199, Rarity.COMMON, mage.cards.s.SnarlingWolf.class)); cards.add(new SetCardInfo("Stormrider Spirit", 79, Rarity.COMMON, mage.cards.s.StormriderSpirit.class)); cards.add(new SetCardInfo("Swamp", 272, Rarity.LAND, mage.cards.basiclands.Swamp.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Tavern Ruffian", 163, Rarity.COMMON, mage.cards.t.TavernRuffian.class)); + cards.add(new SetCardInfo("Tavern Smasher", 163, Rarity.COMMON, mage.cards.t.TavernSmasher.class)); + cards.add(new SetCardInfo("Thermo-Alchemist", 164, Rarity.UNCOMMON, mage.cards.t.ThermoAlchemist.class)); cards.add(new SetCardInfo("Triskaidekaphile", 81, Rarity.RARE, mage.cards.t.Triskaidekaphile.class)); cards.add(new SetCardInfo("Unruly Mob", 40, Rarity.COMMON, mage.cards.u.UnrulyMob.class)); + cards.add(new SetCardInfo("Village Reavers", 165, Rarity.UNCOMMON, mage.cards.v.VillageReavers.class)); + cards.add(new SetCardInfo("Village Watch", 165, Rarity.UNCOMMON, mage.cards.v.VillageWatch.class)); cards.add(new SetCardInfo("Wrenn and Seven", 208, Rarity.MYTHIC, mage.cards.w.WrennAndSeven.class)); + + cards.removeIf(setCardInfo -> unfinished.contains(setCardInfo.getName())); // remove when mechanic is fully implemented } } diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/InvestigateEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/InvestigateEffect.java index 5349e86a740..41f7b3100f8 100644 --- a/Mage/src/main/java/mage/abilities/effects/keyword/InvestigateEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/keyword/InvestigateEffect.java @@ -1,37 +1,66 @@ package mage.abilities.effects.keyword; import mage.abilities.Ability; -import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.Mode; +import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.token.ClueArtifactToken; +import mage.util.CardUtil; /** - * * @author LevelX2 */ -public class InvestigateEffect extends CreateTokenEffect { +public class InvestigateEffect extends OneShotEffect { + + private final int amount; public InvestigateEffect() { - super(new ClueArtifactToken()); - this.staticText = "investigate. (Create a colorless Clue artifact token with \"{2}, Sacrifice this artifact: Draw a card.\")"; + this(1); + } + + public InvestigateEffect(int amount) { + super(Outcome.Benefit); + this.amount = amount; } public InvestigateEffect(final InvestigateEffect effect) { super(effect); + this.amount = effect.amount; } @Override public boolean apply(Game game, Ability source) { - if (super.apply(game, source)) { + new ClueArtifactToken().putOntoBattlefield(amount, game, source, source.getControllerId()); + for (int i = 0; i < amount; i++) { game.fireEvent(GameEvent.getEvent(GameEvent.EventType.INVESTIGATED, source.getSourceId(), source, source.getControllerId())); - return true; } - return false; + return true; } @Override public InvestigateEffect copy() { return new InvestigateEffect(this); } + + @Override + public String getText(Mode mode) { + if (staticText != null && !staticText.isEmpty()) { + return staticText; + } + String message; + switch (amount) { + case 1: + message = ". (C"; + break; + case 2: + message = "twice. (To investigate, c"; + break; + default: + message = CardUtil.numberToText(amount) + " times. (To investigate, c"; + } + return "investigate " + message + "reate a colorless Clue artifact token " + + "with \"{2}, Sacrifice this artifact: Draw a card.\")"; + } } diff --git a/Mage/src/main/java/mage/abilities/keyword/DayboundAbility.java b/Mage/src/main/java/mage/abilities/keyword/DayboundAbility.java new file mode 100644 index 00000000000..968846cc88c --- /dev/null +++ b/Mage/src/main/java/mage/abilities/keyword/DayboundAbility.java @@ -0,0 +1,43 @@ +package mage.abilities.keyword; + +import mage.abilities.MageSingleton; +import mage.abilities.StaticAbility; +import mage.constants.Zone; + +import java.io.ObjectStreamException; + +/** + * @author TheElk801 + * TODO: Implement this + */ +public class DayboundAbility extends StaticAbility implements MageSingleton { + + private static final DayboundAbility instance; + + static { + instance = new DayboundAbility(); + // instance.addIcon(DayboundAbilityIcon.instance); (needs to be added) + } + + private Object readResolve() throws ObjectStreamException { + return instance; + } + + public static DayboundAbility getInstance() { + return instance; + } + + private DayboundAbility() { + super(Zone.ALL, null); + } + + @Override + public String getRule() { + return "daybound (If a player casts no spells during their own turn, it becomes night next turn.)"; + } + + @Override + public DayboundAbility copy() { + return instance; + } +} diff --git a/Mage/src/main/java/mage/abilities/keyword/NightboundAbility.java b/Mage/src/main/java/mage/abilities/keyword/NightboundAbility.java new file mode 100644 index 00000000000..13f232d50d8 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/keyword/NightboundAbility.java @@ -0,0 +1,43 @@ +package mage.abilities.keyword; + +import mage.abilities.MageSingleton; +import mage.abilities.StaticAbility; +import mage.constants.Zone; + +import java.io.ObjectStreamException; + +/** + * @author TheElk801 + * TODO: Implement this + */ +public class NightboundAbility extends StaticAbility implements MageSingleton { + + private static final NightboundAbility instance; + + static { + instance = new NightboundAbility(); + // instance.addIcon(NightboundAbilityIcon.instance); (needs to be added) + } + + private Object readResolve() throws ObjectStreamException { + return instance; + } + + public static NightboundAbility getInstance() { + return instance; + } + + private NightboundAbility() { + super(Zone.ALL, null); + } + + @Override + public String getRule() { + return "nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.)"; + } + + @Override + public NightboundAbility copy() { + return instance; + } +} diff --git a/Utils/keywords.txt b/Utils/keywords.txt index 5d8f5ff4314..0d906828ec2 100644 --- a/Utils/keywords.txt +++ b/Utils/keywords.txt @@ -16,6 +16,7 @@ Crew|number| Cumulative upkeep|cost| Cycling|cost| Dash|card, manaString| +Daybound|instance| Deathtouch|instance| Demonstrate|new| Delve|new| @@ -71,6 +72,7 @@ Mountainwalk|new| Morph|card, cost| Mutate|card, manaString| Myriad|new| +Nightbound|instance| Ninjutsu|cost| Outlast|cost| Partner|instance| diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 006def364d2..d8f59fd5982 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -42189,28 +42189,35 @@ Triskaidekaphile|Innistrad: Midnight Hunt|81|R|{1}{U}|Creature - Human Wizard|1| Arrogant Outlaw|Innistrad: Midnight Hunt|84|C|{2}{B}|Creature - Vampire Noble|3|2|When Arrogant Outlaw enters the battlefield, if an opponent lost life this turn, each opponent loses 2 life and you gain 2 life.| Champion of the Perished|Innistrad: Midnight Hunt|91|R|{B}|Creature - Zombie|1|1|Whenever another Zombie enters the battlefield under your control, put a +1/+1 counter on Champion of the Perished.| Defenestrate|Innistrad: Midnight Hunt|95|C|{2}{B}|Instant|||Destroy target creature without flying.| +Foul Play|Innistrad: Midnight Hunt|101|U|{1}{B}|Sorcery|||Destroy target creature with power 2 or less. Investigate.| Infernal Grasp|Innistrad: Midnight Hunt|107|U|{1}{B}|Instant|||Destroy target creature. You lose 2 life.| Jadar, Ghoulcaller of Nephalia|Innistrad: Midnight Hunt|108|R|{1}{B}|Legendary Creature - Human Wizard|1|1|At the beginning of your end step, if you control no creatures with decayed, create a 2/2 black Zombie creature token with decayed.| -Brimestone Vandal|Innistrad: Midnight Hunt|130|C|{2}{R}|Creature - Devil|2|3|Menace$If it's neither day nor night, it becomes day as Brimestone Vandal enters the battlefield.$Whenever day becomes night or night becomes day, Brimestone Vandal deals 1 damage to each opponent.| +Brimstone Vandal|Innistrad: Midnight Hunt|130|C|{2}{R}|Creature - Devil|2|3|Menace$If it's neither day nor night, it becomes day as Brimstone Vandal enters the battlefield.$Whenever day becomes night or night becomes day, Brimstone Vandal deals 1 damage to each opponent.| +Curse of Shaken Faith|Innistrad: Midnight Hunt|134|R|{1}{R}|Enchantment - Aura Curse|||Enchant player$Whenever enchanted player casts a spell other than the first spell they cast each turn or copies a spell, Curse of Shaken Faith deals 2 damage to them.| Famished Foragers|Innistrad: Midnight Hunt|138|C|{3}{R}|Creature - Vampire|4|3|When Famished Foragers enters the battlefield, if an opponent lost life this turn, add {R}{R}{R}.${2}{R}, Discard a card: Draw a card.| Festival Crasher|Innistrad: Midnight Hunt|140|C|{1}{R}|Creature - Devil|1|3|Whenever you cast an instant or sorcery spell, Festival Crasher gets +2/+0 until end of turn.| +Geistflame Reservoir|Innistrad: Midnight Hunt|142|R|{2}{R}|Artifact|||Whenever you cast an instant or sorcery spell, put a charge counter on Geistflame Reservoir.${1}{R}, {T}, Remove any number of charge counters from Geistflame Reservoir: It deals that much damage to any target.${1}{R}, {T}: Exile the top card of your library. You may play that card this turn.| Light Up the Night|Innistrad: Midnight Hunt|146|R|{X}{R}|Sorcery|||Light Up the Night deals X damage to any target. It deals X plus 1 damage instead if that target is a creature or planeswalker.$Flashback—{3}{R}, Remove X loyalty counters from among planeswalkers you control. If you cast this spell this way, X can't be 0.| Play with Fire|Innistrad: Midnight Hunt|154|U|{R}|Instant|||Play with Fire deals 2 damage to any target. If a player is dealt damage this way, scry 1.| -Tavern Ruffian|Innistrad: Midnight Hunt|165|C|{3}{R}|Creature - Human Warrior Werewolf|2|5|Daybound| -Tavern Smasher|Innistrad: Midnight Hunt|165|C||Creature - Werewolf|6|5|Nightbound| +Tavern Ruffian|Innistrad: Midnight Hunt|163|C|{3}{R}|Creature - Human Warrior Werewolf|2|5|Daybound| +Tavern Smasher|Innistrad: Midnight Hunt|163|C||Creature - Werewolf|6|5|Nightbound| +Thermo-Alchemist|Innistrad: Midnight Hunt|164|U|{1}{R}|Creature - Human Shaman|0|3|Defender${T}: Thermo-Alchemist deals 1 damage to each opponent.$Whenever you cast an instant or sorcery spell, untap Thermo-Alchemist.| +Village Watch|Innistrad: Midnight Hunt|165|U|{4}{R}|Creature - Human Werewolf|4|3|Haste$Daybound| +Village Reavers|Innistrad: Midnight Hunt|165|U||Creature - Werewolf|5|4|Wolves and Werewolves you control have haste.$Nightbound| Candlelit Cavalry|Innistrad: Midnight Hunt|175|C|{4}{G}|Creature - Human Knight|5|5|Coven — At the beginning of combat on your turn, if you control three or more creatures with different powers, Candlelit Cavalry gains trample until end of turn.| -Dawnheart Rejuvenator|Innistrad: Midnight Hunt|180|C|{3}{G}|Creature - Human Warlock|2|4|When Dawnheart Rejuvenator enters the battlefield, you gain 3 life.${T}: Add one mana of any color.| +Dawnhart Rejuvenator|Innistrad: Midnight Hunt|180|C|{3}{G}|Creature - Human Warlock|2|4|When Dawnhart Rejuvenator enters the battlefield, you gain 3 life.${T}: Add one mana of any color.| Howl of the Hunt|Innistrad: Midnight Hunt|188|C|{2}{G}|Enchantment - Aura|||Flash$Enchant creature$When Howl of the Hunt enters the battlefield, if enchanted creature is a Wolf or Werewolf, untap that creature.$Enchanted creature gets +2/+2 and has vigilance.| Might of the Old Ways|Innistrad: Midnight Hunt|189|C|{1}{G}|Instant|||Target creature gets +2/+2 until end of turn.$Coven — Then if you control three or more creatures with different powers, draw a card.| Pestilent Wolf|Innistrad: Midnight Hunt|192|C|{1}{G}|Creature - Wolf|2|2|{2}{G}: Pestilent Wolf gains deathtouch until end of turn.| Snarling Wolf|Innistrad: Midnight Hunt|199|C|{G}|Creature - Wolf|1|1|{1}{G}: Snarling Wolf gets +2/+2 until end of turn. Activate only once each turn.| Wrenn and Seven|Innistrad: Midnight Hunt|208|M|{3}{G}{G}|Legendary Planeswalker - Wrenn|5|+1: Reveal the top four cards of your library. Put all land cards revealed this way into your hand and the rest into your graveyard.$0: Put any number of land cards from your hand onto the battlefield tapped.$−3: Create a green Treefolk creature token with reach and "This creature's power and toughness are each equal to the number of lands you control."$−8: Return all permanent cards from your graveyard to your hand. You get an emblem with "You have no maximum hand size."| -Arlinn, the Pack's Hope|Innistrad: Midnight Hunt|211|M|{2}{R}{G}|Legendary Planeswalker - Arlinn|4|Daybound$+1: Until your next turn, you may cast creature cards as though they had flash, and each creature you control enters the battlefield with an additional +1/+1 counter on it.$−3: Create two 2/2 green Wolf creature tokens.| +Arlinn, the Pack's Hope|Innistrad: Midnight Hunt|211|M|{2}{R}{G}|Legendary Planeswalker - Arlinn|4|Daybound$+1: Until your next turn, you may cast creature spells as though they had flash, and each creature you control enters the battlefield with an additional +1/+1 counter on it.$−3: Create two 2/2 green Wolf creature tokens.| Arlinn, the Moon's Fury|Innistrad: Midnight Hunt|211|M||Legendary Planeswalker - Arlinn|4|Nightbound$+2: Add {R}{G}.$0: Until end of turn, Arlinn, the Moon's Fury becomes a 5/5 Werewolf creature with trample, indestructible, and haste.| Galvanic Iteration|Innistrad: Midnight Hunt|224|R|{U}{R}|Instant|||When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy.$Flashback {1}{U}{R}| Join the Dance|Innistrad: Midnight Hunt|229|U|{G}{W}|Sorcery|||Create two 1/1 white Human creature tokens.$Flashback {3}{G}{W}| +Rite of Harmony|Innistrad: Midnight Hunt|236|R|{G}{W}|Instant|||Whenever a creature or enchantment enters the battlefield under your control this turn, draw a card.$Flashback {2}{G}{W}| Sigarda, Champion of Light|Innistrad: Midnight Hunt|240|M|{1}{G}{W}{W}|Legendary Creature - Angel|4|4|Flying, trample$Humans you control get +1/+1.$Coven — Whenever Sigarda attacks, if you control three or more creatures with different powers, look at the top five cards of your library. You may reveal a Human creature card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.| -Torvar, Dire Overlord|Innistrad: Midnight Hunt|246|R|{1}{R}{G}|Legendary Creature - Human Werewolf|4|4|Whenever a Wolf or Werewolf you control deals combat damage to a player, draw a card.$At the beginning of your upkeep, if you control three or more Wolves and/or Werewolves, it becomes night. Then transform any number of Human Werewolves you control.$Daybound| +Tovolar, Dire Overlord|Innistrad: Midnight Hunt|246|R|{1}{R}{G}|Legendary Creature - Human Werewolf|4|4|Whenever a Wolf or Werewolf you control deals combat damage to a player, draw a card.$At the beginning of your upkeep, if you control three or more Wolves and/or Werewolves, it becomes night. Then transform any number of Human Werewolves you control.$Daybound| Tovolar, the Midnight Scourge|Innistrad: Midnight Hunt|246|R||Legendary Creature - Werewolf|4|4|Whenever a Wolf or Werewolf you control deals combat damage to a player, draw a card.${X}{R}{G}: Target Wolf or Werewolf you control gets +X/+0 and gains trample until end of turn.$Nightbound| Deserted Beach|Innistrad: Midnight Hunt|260|R||Land|||Deserted Beach enters the battlefield tapped unless you control two or more other lands.${T}: Add {W} or {U}.| Haunted Ridge|Innistrad: Midnight Hunt|263|R||Land|||Haunted Ridge enters the battlefield tapped unless you control two or more other lands.${T}: Add {B} or {R}.| @@ -42222,6 +42229,7 @@ Island|Innistrad: Midnight Hunt|270|C||Basic Land - Island|||({T}: Add {U}.)| Swamp|Innistrad: Midnight Hunt|272|C||Basic Land - Swamp|||({T}: Add {B}.)| Mountain|Innistrad: Midnight Hunt|274|C||Basic Land - Mountain|||({T}: Add {R}.)| Forest|Innistrad: Midnight Hunt|276|C||Basic Land - Forest|||({T}: Add {G}.)| +Can't Stay Away|Innistrad: Midnight Hunt|368|R|{W}{B}|Sorcery|||Return target creature card with mana value 3 or less from your graveyard to the battlefield. It gains "If this creature would die, exile it instead."$Flashback {3}{W}{B}| Faceless Agent|Jumpstart: Historic Horizons|1|C|{3}|Creature - Shapeshifter|2|1|Changeling$When Faceless Agent enters the battlefield, seek a creature card of the most prevalent creature type in your library.| Baffling Defenses|Jumpstart: Historic Horizons|2|C|{1}{W}|Instant|||Target creature's base power perpetually becomes 0.| Benalish Partisan|Jumpstart: Historic Horizons|3|R|{1}{W}|Creature - Human Soldier|1|2|Lifelink$Whenever you cycle another card, you may pay {1}{W}. If you do, return Benalish Partisan from your graveyard to the battlefield tapped and it perpetually gets +1/+0.$Cycling {1}{W}|