This commit is contained in:
Jeff 2021-09-03 16:34:40 -05:00
commit ea58f2d65f
20 changed files with 726 additions and 38 deletions

View file

@ -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("<BR><BR>Investigate three times.");
getSpellAbility().addEffect(effect);
effect = new InvestigateEffect();
effect.setText(null);
getSpellAbility().addEffect(effect);
getSpellAbility().addEffect(effect);
getSpellAbility().addEffect(new InvestigateEffect(3).concatBy("<br>"));
}
private ConfirmSuspicions(final ConfirmSuspicions card) {

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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 "";
}
}

View file

@ -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) {

View file

@ -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);
}
}

View file

@ -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;
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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}"));

View file

@ -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<String> 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
}
}

View file

@ -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. <i>(Create a colorless Clue artifact token with \"{2}, Sacrifice this artifact: Draw a card.\")</i>";
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 = ". <i>(C";
break;
case 2:
message = "twice. <i>(To investigate, c";
break;
default:
message = CardUtil.numberToText(amount) + " times. <i>(To investigate, c";
}
return "investigate " + message + "reate a colorless Clue artifact token " +
"with \"{2}, Sacrifice this artifact: Draw a card.\")</i>";
}
}

View file

@ -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 <i>(If a player casts no spells during their own turn, it becomes night next turn.)</i>";
}
@Override
public DayboundAbility copy() {
return instance;
}
}

View file

@ -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 <i>(If a player casts at least two spells during their own turn, it becomes day next turn.)</i>";
}
@Override
public NightboundAbility copy() {
return instance;
}
}

View file

@ -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|

View file

@ -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}|