diff --git a/Mage.Sets/src/mage/cards/b/BaneOfHanweir.java b/Mage.Sets/src/mage/cards/b/BaneOfHanweir.java deleted file mode 100644 index db8f96ac32a..00000000000 --- a/Mage.Sets/src/mage/cards/b/BaneOfHanweir.java +++ /dev/null @@ -1,44 +0,0 @@ -package mage.cards.b; - -import mage.MageInt; -import mage.abilities.common.AttacksEachCombatStaticAbility; -import mage.abilities.common.WerewolfBackTriggeredAbility; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; - -import java.util.UUID; - -/** - * @author nantuko - */ -public final class BaneOfHanweir extends CardImpl { - - public BaneOfHanweir(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, ""); - this.subtype.add(SubType.WEREWOLF); - this.color.setRed(true); - - // this card is the second face of double-faced card - this.nightCard = true; - - this.power = new MageInt(5); - this.toughness = new MageInt(5); - - // Bane of Hanweir attacks each turn if able. - this.addAbility(new AttacksEachCombatStaticAbility()); - - // At the beginning of each upkeep, if a player cast two or more spells last turn, transform Bane of Hanweir. - this.addAbility(new WerewolfBackTriggeredAbility()); - } - - private BaneOfHanweir(final BaneOfHanweir card) { - super(card); - } - - @Override - public BaneOfHanweir copy() { - return new BaneOfHanweir(this); - } -} diff --git a/Mage.Sets/src/mage/cards/c/CreepingInn.java b/Mage.Sets/src/mage/cards/c/CreepingInn.java deleted file mode 100644 index 106c64a1076..00000000000 --- a/Mage.Sets/src/mage/cards/c/CreepingInn.java +++ /dev/null @@ -1,109 +0,0 @@ -package mage.cards.c; - -import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.common.AttacksTriggeredAbility; -import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.PhaseOutSourceEffect; -import mage.cards.Card; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.SubType; -import mage.filter.StaticFilters; -import mage.game.ExileZone; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.target.common.TargetCardInGraveyard; -import mage.util.CardUtil; - -import java.util.UUID; - -/** - * @author LePwnerer - */ -public final class CreepingInn extends CardImpl { - - public CreepingInn(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, ""); - - this.subtype.add(SubType.HORROR); - this.subtype.add(SubType.CONSTRUCT); - this.power = new MageInt(3); - this.toughness = new MageInt(7); - this.color.setBlack(true); - this.nightCard = true; - - // Whenever Creeping Inn attacks, you may exile a creature card from your graveyard. - // If you do, each opponent loses X life and you gain X life, - // where X is the number of creature cards exiled with Creeping Inn. - this.addAbility(new AttacksTriggeredAbility(new CreepingInnEffect())); - - // {4}: Creeping Inn phases out. - this.addAbility(new SimpleActivatedAbility(new PhaseOutSourceEffect(), new ManaCostsImpl<>("{4}"))); - } - - private CreepingInn(final CreepingInn card) { - super(card); - } - - @Override - public CreepingInn copy() { - return new CreepingInn(this); - } -} - -class CreepingInnEffect extends OneShotEffect { - - CreepingInnEffect() { - super(Outcome.Exile); - this.staticText = "you may exile a creature card from your graveyard. " + - "If you do, each opponent loses X life and you gain X life, " + - "where X is the number of creature cards exiled with {this}."; - } - - private CreepingInnEffect(final CreepingInnEffect effect) { - super(effect); - } - - @Override - public CreepingInnEffect copy() { - return new CreepingInnEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - Permanent permanent = source.getSourcePermanentOrLKI(game); - if (player != null && permanent != null) { - UUID exileId = CardUtil.getExileZoneId(game, source); - TargetCardInGraveyard target = new TargetCardInGraveyard(0, 1, StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD); - target.withNotTarget(true); - if (target.canChoose(player.getId(), source, game)) { - if (player.choose(Outcome.Exile, target, source, game)) { - Card cardChosen = game.getCard(target.getFirstTarget()); - if (cardChosen != null) { - int lifeAmount = 0; - player.moveCardsToExile(cardChosen, source, game, true, exileId, permanent.getName()); - ExileZone exile = game.getExile().getExileZone(exileId); - if (exile != null) { - for (UUID cardId : exile) { - lifeAmount++; - } - } - for (UUID playerId : game.getOpponents(source.getControllerId())) { - game.getPlayer(playerId).loseLife(lifeAmount, game, source, false); - } - player.gainLife(lifeAmount, game, source); - } - } - } - return true; - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/h/HadanasClimb.java b/Mage.Sets/src/mage/cards/h/HadanasClimb.java index a1d27468050..319731b1df4 100644 --- a/Mage.Sets/src/mage/cards/h/HadanasClimb.java +++ b/Mage.Sets/src/mage/cards/h/HadanasClimb.java @@ -1,41 +1,60 @@ - package mage.cards.h; -import java.util.UUID; - import mage.abilities.Ability; -import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.condition.common.TargetHasCounterCondition; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; -import mage.abilities.keyword.TransformAbility; -import mage.cards.CardImpl; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.mana.AnyColorManaAbility; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SuperType; +import mage.cards.TransformingDoubleFacedCard; +import mage.constants.*; import mage.counters.CounterType; +import mage.game.Game; +import mage.game.permanent.Permanent; import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.targetpointer.FixedTarget; + +import java.util.UUID; /** * @author LevelX2 */ -public final class HadanasClimb extends CardImpl { +public final class HadanasClimb extends TransformingDoubleFacedCard { public HadanasClimb(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}{U}"); - - this.supertype.add(SuperType.LEGENDARY); - - this.secondSideCardClazz = mage.cards.w.WingedTempleOfOrazca.class; + super(ownerId, setInfo, + new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "{1}{G}{U}", + "Winged Temple of Orazca", + new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.LAND}, new SubType[]{}, "" + ); + // Hadana's Climb // At the beginning of combat on your turn, put a +1/+1 counter on target creature you control. Then if that creature has three or more +1/+1 counters on it, transform Hadana's Climb. - this.addAbility(new TransformAbility()); Ability ability = new BeginningOfCombatTriggeredAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance())); ability.addEffect(new ConditionalOneShotEffect(new TransformSourceEffect(), new TargetHasCounterCondition(CounterType.P1P1, 3, Integer.MAX_VALUE), "Then if that creature has three or more +1/+1 counters on it, transform {this}")); ability.addTarget(new TargetControlledCreaturePermanent()); - this.addAbility(ability); + this.getLeftHalfCard().addAbility(ability); + + // Winged Temple of Orazca + // {T}: Add one mana of any color. + this.getRightHalfCard().addAbility(new AnyColorManaAbility()); + + // {1}{G}{U}, {T}: Target creature you control gains flying and gets +X/+X until end of turn, where X is its power. + Ability backAbility = new SimpleActivatedAbility(new WingedTempleOfOrazcaEffect(), new ManaCostsImpl<>("{1}{G}{U}")); + backAbility.addCost(new TapSourceCost()); + backAbility.addTarget(new TargetControlledCreaturePermanent()); + this.getRightHalfCard().addAbility(backAbility); } private HadanasClimb(final HadanasClimb card) { @@ -47,3 +66,35 @@ public final class HadanasClimb extends CardImpl { return new HadanasClimb(this); } } + +class WingedTempleOfOrazcaEffect extends OneShotEffect { + + WingedTempleOfOrazcaEffect() { + super(Outcome.Benefit); + this.staticText = "target creature you control gains flying and gets +X/+X until end of turn, where X is its power"; + } + + private WingedTempleOfOrazcaEffect(final WingedTempleOfOrazcaEffect effect) { + super(effect); + } + + @Override + public WingedTempleOfOrazcaEffect copy() { + return new WingedTempleOfOrazcaEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent creature = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (creature != null && creature.isCreature(game)) { + int pow = creature.getPower().getValue(); + ContinuousEffect effect = new BoostTargetEffect(pow, pow, Duration.EndOfTurn); + effect.setTargetPointer(new FixedTarget(creature, game)); + game.addEffect(effect, source); + effect = new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn); + effect.setTargetPointer(new FixedTarget(creature, game)); + game.addEffect(effect, source); + } + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/h/HanweirMilitiaCaptain.java b/Mage.Sets/src/mage/cards/h/HanweirMilitiaCaptain.java index a6bb769ba9c..f768ea03fdb 100644 --- a/Mage.Sets/src/mage/cards/h/HanweirMilitiaCaptain.java +++ b/Mage.Sets/src/mage/cards/h/HanweirMilitiaCaptain.java @@ -1,25 +1,28 @@ package mage.cards.h; -import mage.MageInt; import mage.abilities.condition.Condition; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect; import mage.abilities.hint.common.CreaturesYouControlHint; -import mage.abilities.keyword.TransformAbility; +import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; -import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.ComparisonType; import mage.constants.SubType; +import mage.constants.Zone; import mage.filter.common.FilterControlledCreaturePermanent; +import mage.game.permanent.token.HumanClericToken; import java.util.UUID; /** * @author fireshoes */ -public final class HanweirMilitiaCaptain extends CardImpl { +public final class HanweirMilitiaCaptain extends TransformingDoubleFacedCard { private static final Condition condition = new PermanentsOnTheBattlefieldCondition( new FilterControlledCreaturePermanent("you control four or more creatures"), @@ -27,18 +30,27 @@ public final class HanweirMilitiaCaptain extends CardImpl { ); public HanweirMilitiaCaptain(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(2); + super(ownerId, setInfo, + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.SOLDIER}, "{1}{W}", + "Westvale Cult Leader", + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.CLERIC}, "W" + ); - this.secondSideCardClazz = mage.cards.w.WestvaleCultLeader.class; + // Hanweir Militia Captain + this.getLeftHalfCard().setPT(2, 2); // At the beginning of your upkeep, if you control four or more creatures, transform Hanweir Militia Captain. - this.addAbility(new TransformAbility()); - this.addAbility(new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect()) + this.getLeftHalfCard().addAbility(new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect()) .withInterveningIf(condition).addHint(CreaturesYouControlHint.instance)); + + // Westvale Cult Leader + // Westvale Cult Leader's power and toughness are each equal to the number of creatures you control. + this.getRightHalfCard().addAbility(new mage.abilities.common.SimpleStaticAbility(Zone.ALL, + new SetBasePowerToughnessSourceEffect(mage.abilities.dynamicvalue.common.CreaturesYouControlCount.PLURAL)) + .addHint(CreaturesYouControlHint.instance)); + + // At the beginning of your end step, create a 1/1 white and black Human Cleric creature token. + this.getRightHalfCard().addAbility(new BeginningOfEndStepTriggeredAbility(new CreateTokenEffect(new HumanClericToken()))); } private HanweirMilitiaCaptain(final HanweirMilitiaCaptain card) { diff --git a/Mage.Sets/src/mage/cards/h/HanweirWatchkeep.java b/Mage.Sets/src/mage/cards/h/HanweirWatchkeep.java index 85997f17d36..3919e5c1f4e 100644 --- a/Mage.Sets/src/mage/cards/h/HanweirWatchkeep.java +++ b/Mage.Sets/src/mage/cards/h/HanweirWatchkeep.java @@ -1,11 +1,11 @@ package mage.cards.h; -import mage.MageInt; +import mage.abilities.common.AttacksEachCombatStaticAbility; +import mage.abilities.common.WerewolfBackTriggeredAbility; import mage.abilities.common.WerewolfFrontTriggeredAbility; import mage.abilities.keyword.DefenderAbility; -import mage.abilities.keyword.TransformAbility; -import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.SubType; @@ -14,23 +14,32 @@ import java.util.UUID; /** * @author nantuko */ -public final class HanweirWatchkeep extends CardImpl { +public final class HanweirWatchkeep extends TransformingDoubleFacedCard { public HanweirWatchkeep(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); - this.subtype.add(SubType.HUMAN); - this.subtype.add(SubType.WARRIOR); - this.subtype.add(SubType.WEREWOLF); + super(ownerId, setInfo, + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WARRIOR, SubType.WEREWOLF}, "{2}{R}", + "Bane of Hanweir", + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "R" + ); - this.secondSideCardClazz = mage.cards.b.BaneOfHanweir.class; + // Hanweir Watchkeep + this.getLeftHalfCard().setPT(1, 5); - this.power = new MageInt(1); - this.toughness = new MageInt(5); + // Defender + this.getLeftHalfCard().addAbility(DefenderAbility.getInstance()); - this.addAbility(DefenderAbility.getInstance()); // At the beginning of each upkeep, if no spells were cast last turn, transform Hanweir Watchkeep. - this.addAbility(new TransformAbility()); - this.addAbility(new WerewolfFrontTriggeredAbility()); + this.getLeftHalfCard().addAbility(new WerewolfFrontTriggeredAbility()); + + // Bane of Hanweir + this.getRightHalfCard().setPT(5, 5); + + // Bane of Hanweir attacks each turn if able. + this.getRightHalfCard().addAbility(new AttacksEachCombatStaticAbility()); + + // At the beginning of each upkeep, if a player cast two or more spells last turn, transform Bane of Hanweir. + this.getRightHalfCard().addAbility(new WerewolfBackTriggeredAbility()); } private HanweirWatchkeep(final HanweirWatchkeep card) { diff --git a/Mage.Sets/src/mage/cards/h/HarriedArtisan.java b/Mage.Sets/src/mage/cards/h/HarriedArtisan.java index f9ca5ca64a8..24126b3e162 100644 --- a/Mage.Sets/src/mage/cards/h/HarriedArtisan.java +++ b/Mage.Sets/src/mage/cards/h/HarriedArtisan.java @@ -1,13 +1,12 @@ package mage.cards.h; -import mage.MageInt; import mage.abilities.common.ActivateAsSorceryActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.HasteAbility; -import mage.abilities.keyword.TransformAbility; -import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.SubType; @@ -16,23 +15,32 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class HarriedArtisan extends CardImpl { +public final class HarriedArtisan extends TransformingDoubleFacedCard { public HarriedArtisan(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); + super(ownerId, setInfo, + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.ARTIFICER}, "{2}{R}", + "Phyrexian Skyflayer", + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.PHYREXIAN, SubType.ARTIFICER}, "WR" + ); - this.subtype.add(SubType.HUMAN); - this.subtype.add(SubType.ARTIFICER); - this.power = new MageInt(2); - this.toughness = new MageInt(3); - this.secondSideCardClazz = mage.cards.p.PhyrexianSkyflayer.class; + // Harried Artisan + this.getLeftHalfCard().setPT(2, 3); // Haste - this.addAbility(HasteAbility.getInstance()); + this.getLeftHalfCard().addAbility(HasteAbility.getInstance()); // {3}{W/P}: Transform Harried Artisan. Activate only as a sorcery. - this.addAbility(new TransformAbility()); - this.addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{3}{W/P}"))); + this.getLeftHalfCard().addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{3}{W/P}"))); + + // Phyrexian Skyflayer + this.getRightHalfCard().setPT(3, 4); + + // Flying + this.getRightHalfCard().addAbility(FlyingAbility.getInstance()); + + // Haste + this.getRightHalfCard().addAbility(HasteAbility.getInstance()); } private HarriedArtisan(final HarriedArtisan card) { diff --git a/Mage.Sets/src/mage/cards/h/HarvestHand.java b/Mage.Sets/src/mage/cards/h/HarvestHand.java index 4b55e43df98..ad517955f58 100644 --- a/Mage.Sets/src/mage/cards/h/HarvestHand.java +++ b/Mage.Sets/src/mage/cards/h/HarvestHand.java @@ -1,18 +1,21 @@ package mage.cards.h; -import mage.MageInt; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.DiesSourceTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.EquippedHasSubtypeCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.BoostEquippedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EquipAbility; +import mage.abilities.keyword.MenaceAbility; import mage.abilities.keyword.TransformAbility; import mage.cards.Card; -import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.SubType; -import mage.constants.Zone; +import mage.cards.TransformingDoubleFacedCard; +import mage.constants.*; import mage.game.Game; import mage.players.Player; @@ -21,19 +24,36 @@ import java.util.UUID; /** * @author halljared */ -public final class HarvestHand extends CardImpl { +public final class HarvestHand extends TransformingDoubleFacedCard { + + private static final Condition condition = new EquippedHasSubtypeCondition(SubType.HUMAN); public HarvestHand(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}"); - this.subtype.add(SubType.SCARECROW); - this.power = new MageInt(2); - this.toughness = new MageInt(2); + super(ownerId, setInfo, + new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.SCARECROW}, "{3}", + "Scrounged Scythe", + new CardType[]{CardType.ARTIFACT}, new SubType[]{SubType.EQUIPMENT}, "" + ); - this.secondSideCardClazz = mage.cards.s.ScroungedScythe.class; + // Harvest Hand + this.getLeftHalfCard().setPT(2, 2); // When Harvest Hand dies, return it to the battlefield transformed under your control. - this.addAbility(new TransformAbility()); - this.addAbility(new DiesSourceTriggeredAbility(new HarvestHandReturnTransformedEffect())); + this.getLeftHalfCard().addAbility(new DiesSourceTriggeredAbility(new HarvestHandReturnTransformedEffect())); + + // Scrounged Scythe + // Equipped creature gets +1/+1. + this.getRightHalfCard().addAbility(new SimpleStaticAbility(new BoostEquippedEffect(1, 1))); + + // As long as equipped creature is a Human, it has menace. + this.getRightHalfCard().addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( + new GainAbilityAttachedEffect(new MenaceAbility(false), AttachmentType.EQUIPMENT), + condition, "As long as equipped creature is a Human, it has menace. " + + "(It can't be blocked except by two or more creatures.)" + ))); + + // Equip {2} + this.getRightHalfCard().addAbility(new EquipAbility(2, false)); } private HarvestHand(final HarvestHand card) { diff --git a/Mage.Sets/src/mage/cards/h/HarvesttideAssailant.java b/Mage.Sets/src/mage/cards/h/HarvesttideAssailant.java deleted file mode 100644 index c1d10320d80..00000000000 --- a/Mage.Sets/src/mage/cards/h/HarvesttideAssailant.java +++ /dev/null @@ -1,42 +0,0 @@ -package mage.cards.h; - -import mage.MageInt; -import mage.abilities.keyword.NightboundAbility; -import mage.abilities.keyword.TrampleAbility; -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 HarvesttideAssailant extends CardImpl { - - public HarvesttideAssailant(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, ""); - - this.subtype.add(SubType.WEREWOLF); - this.power = new MageInt(4); - this.toughness = new MageInt(4); - this.color.setRed(true); - this.nightCard = true; - - // Trample - this.addAbility(TrampleAbility.getInstance()); - - // Nightbound - this.addAbility(new NightboundAbility()); - } - - private HarvesttideAssailant(final HarvesttideAssailant card) { - super(card); - } - - @Override - public HarvesttideAssailant copy() { - return new HarvesttideAssailant(this); - } -} diff --git a/Mage.Sets/src/mage/cards/h/HarvesttideInfiltrator.java b/Mage.Sets/src/mage/cards/h/HarvesttideInfiltrator.java index f6258d61b69..3777b180973 100644 --- a/Mage.Sets/src/mage/cards/h/HarvesttideInfiltrator.java +++ b/Mage.Sets/src/mage/cards/h/HarvesttideInfiltrator.java @@ -1,10 +1,10 @@ package mage.cards.h; -import mage.MageInt; import mage.abilities.keyword.DayboundAbility; +import mage.abilities.keyword.NightboundAbility; import mage.abilities.keyword.TrampleAbility; -import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.SubType; @@ -13,22 +13,32 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class HarvesttideInfiltrator extends CardImpl { +public final class HarvesttideInfiltrator extends TransformingDoubleFacedCard { public HarvesttideInfiltrator(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); + super(ownerId, setInfo, + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{2}{R}", + "Harvesttide Assailant", + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "R" + ); - this.subtype.add(SubType.HUMAN); - this.subtype.add(SubType.WEREWOLF); - this.power = new MageInt(3); - this.toughness = new MageInt(2); - this.secondSideCardClazz = mage.cards.h.HarvesttideAssailant.class; + // Harvesttide Infiltrator + this.getLeftHalfCard().setPT(3, 2); // Trample - this.addAbility(TrampleAbility.getInstance()); + this.getLeftHalfCard().addAbility(TrampleAbility.getInstance()); // Daybound - this.addAbility(new DayboundAbility()); + this.getLeftHalfCard().addAbility(new DayboundAbility()); + + // Harvesttide Assailant + this.getRightHalfCard().setPT(4, 4); + + // Trample + this.getRightHalfCard().addAbility(TrampleAbility.getInstance()); + + // Nightbound + this.getRightHalfCard().addAbility(new NightboundAbility()); } private HarvesttideInfiltrator(final HarvesttideInfiltrator card) { diff --git a/Mage.Sets/src/mage/cards/h/HavengulLaboratory.java b/Mage.Sets/src/mage/cards/h/HavengulLaboratory.java index 766da704cd2..b95a4204275 100644 --- a/Mage.Sets/src/mage/cards/h/HavengulLaboratory.java +++ b/Mage.Sets/src/mage/cards/h/HavengulLaboratory.java @@ -1,53 +1,79 @@ package mage.cards.h; +import mage.MageObjectReference; import mage.abilities.Ability; -import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; +import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.TransformIntoSourceTriggeredAbility; import mage.abilities.condition.Condition; +import mage.abilities.costs.common.PayLifeCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.effects.keyword.InvestigateEffect; -import mage.abilities.keyword.TransformAbility; +import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.ColorlessManaAbility; -import mage.cards.CardImpl; +import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; +import mage.cards.Card; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.*; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.GameEvent; +import mage.game.events.ZoneChangeEvent; import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCardInYourGraveyard; import mage.util.CardUtil; import mage.watchers.Watcher; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; /** * @author TheElk801 */ -public final class HavengulLaboratory extends CardImpl { +public final class HavengulLaboratory extends TransformingDoubleFacedCard { public HavengulLaboratory(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); - this.supertype.add(SuperType.LEGENDARY); - - this.secondSideCardClazz = mage.cards.h.HavengulMystery.class; + super(ownerId, setInfo, + new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.LAND}, new SubType[]{}, "", + "Havengul Mystery", + new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.LAND}, new SubType[]{}, "" + ); + // Havengul Laboratory // {T}: Add {C}. - this.addAbility(new ColorlessManaAbility()); + this.getLeftHalfCard().addAbility(new ColorlessManaAbility()); // {4}, {T}: Investigate. Ability ability = new SimpleActivatedAbility(new InvestigateEffect(), new GenericManaCost(4)); ability.addCost(new TapSourceCost()); - this.addAbility(ability); + this.getLeftHalfCard().addAbility(ability); // At the beginning of your end step, if you sacrificed three or more Clues this turn, transform Havengul Laboratory. - this.addAbility(new TransformAbility()); - this.addAbility(new BeginningOfEndStepTriggeredAbility( + Ability transformAbility = new BeginningOfEndStepTriggeredAbility( TargetController.YOU, new TransformSourceEffect(), false, HavengulLaboratoryCondition.instance - ), new HavengulLaboratoryWatcher()); + ); + transformAbility.addWatcher(new HavengulLaboratoryWatcher()); + this.getLeftHalfCard().addAbility(transformAbility); + + // Havengul Mystery + // When this land transforms into Havengul Mystery, return target creature card from your graveyard to the battlefield. + Ability backAbility = new TransformIntoSourceTriggeredAbility(new HavengulMysteryEffect()) + .setTriggerPhrase("When this land transforms into {this}, "); + backAbility.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); + this.getRightHalfCard().addAbility(backAbility); + + // When the creature put onto the battlefield with Havengul Mystery leaves the battlefield, transform Havengul Mystery. + this.getRightHalfCard().addAbility(new HavengulMysteryLeavesAbility()); + + // {T}, Pay 1 life: Add {B}. + Ability manaAbility = new BlackManaAbility(); + manaAbility.addCost(new PayLifeCost(1)); + this.getRightHalfCard().addAbility(manaAbility); } private HavengulLaboratory(final HavengulLaboratory card) { @@ -108,3 +134,89 @@ class HavengulLaboratoryWatcher extends Watcher { .getOrDefault(playerId, 0) >= 3; } } + +class HavengulMysteryEffect extends OneShotEffect { + + HavengulMysteryEffect() { + super(Outcome.Benefit); + staticText = "return target creature card from your graveyard to the battlefield"; + } + + private HavengulMysteryEffect(final HavengulMysteryEffect effect) { + super(effect); + } + + @Override + public HavengulMysteryEffect copy() { + return new HavengulMysteryEffect(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 || card == null) { + return false; + } + player.moveCards(card, Zone.BATTLEFIELD, source, game); + Permanent permanent = CardUtil.getPermanentFromCardPutToBattlefield(card, game); + if (permanent == null) { + return false; + } + String key = HavengulMysteryLeavesAbility.makeKey(source, game); + Set morSet; + if (game.getState().getValue(key) != null) { + morSet = (Set) game.getState().getValue(key); + } else { + morSet = new HashSet<>(); + game.getState().setValue(key, morSet); + } + morSet.add(new MageObjectReference(permanent, game)); + return true; + } +} + +class HavengulMysteryLeavesAbility extends TriggeredAbilityImpl { + + HavengulMysteryLeavesAbility() { + super(Zone.BATTLEFIELD, new TransformSourceEffect()); + setLeavesTheBattlefieldTrigger(true); + } + + private HavengulMysteryLeavesAbility(final HavengulMysteryLeavesAbility ability) { + super(ability); + } + + @Override + public HavengulMysteryLeavesAbility copy() { + return new HavengulMysteryLeavesAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ZONE_CHANGE; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + ZoneChangeEvent zEvent = (ZoneChangeEvent) event; + if (zEvent.getFromZone() != Zone.BATTLEFIELD) { + return false; + } + + String key = makeKey(this, game); + Set morSet = (Set) game.getState().getValue(key); + return morSet != null + && !morSet.isEmpty() + && morSet.stream().anyMatch(mor -> mor.refersTo(zEvent.getTarget(), game)); + } + + @Override + public String getRule() { + return "When the creature put onto the battlefield with {this} leaves the battlefield, transform {this}."; + } + + static String makeKey(Ability source, Game game) { + return "HavengulMystery_" + source.getSourceId() + '_' + CardUtil.getActualSourceObjectZoneChangeCounter(game, source); + } +} diff --git a/Mage.Sets/src/mage/cards/h/HavengulMystery.java b/Mage.Sets/src/mage/cards/h/HavengulMystery.java deleted file mode 100644 index 24cca60c3b1..00000000000 --- a/Mage.Sets/src/mage/cards/h/HavengulMystery.java +++ /dev/null @@ -1,150 +0,0 @@ -package mage.cards.h; - -import mage.MageObjectReference; -import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.common.TransformIntoSourceTriggeredAbility; -import mage.abilities.costs.common.PayLifeCost; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.TransformSourceEffect; -import mage.abilities.mana.BlackManaAbility; -import mage.cards.Card; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.SuperType; -import mage.constants.Zone; -import mage.filter.StaticFilters; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; -import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.target.common.TargetCardInYourGraveyard; -import mage.util.CardUtil; - -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; - -/** - * @author TheElk801 - */ -public final class HavengulMystery extends CardImpl { - - public HavengulMystery(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); - this.supertype.add(SuperType.LEGENDARY); - this.nightCard = true; - - // When this land transforms into Havengul Mystery, return target creature card from your graveyard to the battlefield. - Ability ability = new TransformIntoSourceTriggeredAbility(new HavengulMysteryEffect()) - .setTriggerPhrase("When this land transforms into {this}, "); - ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); - this.addAbility(ability); - - // When the creature put onto the battlefield with Havengul Mystery leaves the battlefield, transform Havengul Mystery. - this.addAbility(new HavengulMysteryLeavesAbility()); - - // {T}, Pay 1 life: Add {B}. - Ability ability2 = new BlackManaAbility(); - ability2.addCost(new PayLifeCost(1)); - this.addAbility(ability2); - } - - private HavengulMystery(final HavengulMystery card) { - super(card); - } - - @Override - public HavengulMystery copy() { - return new HavengulMystery(this); - } - - static String makeKey(Ability source, Game game) { - return "HavengulMystery_" + source.getSourceId() + '_' + CardUtil.getActualSourceObjectZoneChangeCounter(game, source); - } -} - -class HavengulMysteryEffect extends OneShotEffect { - - HavengulMysteryEffect() { - super(Outcome.Benefit); - staticText = "return target creature card from your graveyard to the battlefield"; - } - - private HavengulMysteryEffect(final HavengulMysteryEffect effect) { - super(effect); - } - - @Override - public HavengulMysteryEffect copy() { - return new HavengulMysteryEffect(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 || card == null) { - return false; - } - player.moveCards(card, Zone.BATTLEFIELD, source, game); - Permanent permanent = CardUtil.getPermanentFromCardPutToBattlefield(card, game); - if (permanent == null) { - return false; - } - String key = HavengulMystery.makeKey(source, game); - Set morSet; - if (game.getState().getValue(key) != null) { - morSet = (Set) game.getState().getValue(key); - } else { - morSet = new HashSet<>(); - game.getState().setValue(key, morSet); - } - morSet.add(new MageObjectReference(permanent, game)); - return true; - } -} - -class HavengulMysteryLeavesAbility extends TriggeredAbilityImpl { - - HavengulMysteryLeavesAbility() { - super(Zone.BATTLEFIELD, new TransformSourceEffect()); - setLeavesTheBattlefieldTrigger(true); - } - - private HavengulMysteryLeavesAbility(final HavengulMysteryLeavesAbility ability) { - super(ability); - } - - @Override - public HavengulMysteryLeavesAbility copy() { - return new HavengulMysteryLeavesAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.ZONE_CHANGE; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - if (zEvent.getFromZone() != Zone.BATTLEFIELD) { - return false; - } - - String key = HavengulMystery.makeKey(this, game); - Set morSet = (Set) game.getState().getValue(key); - return morSet != null - && !morSet.isEmpty() - && morSet.stream().anyMatch(mor -> mor.refersTo(zEvent.getTarget(), game)); - } - - @Override - public String getRule() { - return "When the creature put onto the battlefield with {this} leaves the battlefield, transform {this}."; - } -} diff --git a/Mage.Sets/src/mage/cards/h/HeirOfFalkenrath.java b/Mage.Sets/src/mage/cards/h/HeirOfFalkenrath.java index 2074046e6be..36ffd9f815c 100644 --- a/Mage.Sets/src/mage/cards/h/HeirOfFalkenrath.java +++ b/Mage.Sets/src/mage/cards/h/HeirOfFalkenrath.java @@ -1,35 +1,41 @@ - package mage.cards.h; -import java.util.UUID; -import mage.MageInt; import mage.abilities.common.LimitedTimesPerTurnActivatedAbility; import mage.abilities.costs.common.DiscardCardCost; import mage.abilities.effects.common.TransformSourceEffect; -import mage.abilities.keyword.TransformAbility; -import mage.cards.CardImpl; +import mage.abilities.keyword.FlyingAbility; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; +import java.util.UUID; + /** * * @author fireshoes */ -public final class HeirOfFalkenrath extends CardImpl { +public final class HeirOfFalkenrath extends TransformingDoubleFacedCard { public HeirOfFalkenrath(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{B}"); - this.subtype.add(SubType.VAMPIRE); - this.power = new MageInt(2); - this.toughness = new MageInt(1); + super(ownerId, setInfo, + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.VAMPIRE}, "{1}{B}", + "Heir to the Night", + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.VAMPIRE, SubType.BERSERKER}, "B" + ); - this.secondSideCardClazz = mage.cards.h.HeirToTheNight.class; + // Heir of Falkenrath + this.getLeftHalfCard().setPT(2, 1); // Discard a card: Transform Heir of Falkenrath. Activate this ability only once each turn. - this.addAbility(new TransformAbility()); - this.addAbility(new LimitedTimesPerTurnActivatedAbility(Zone.BATTLEFIELD, new TransformSourceEffect(), new DiscardCardCost())); + this.getLeftHalfCard().addAbility(new LimitedTimesPerTurnActivatedAbility(Zone.BATTLEFIELD, new TransformSourceEffect(), new DiscardCardCost())); + + // Heir to the Night + this.getRightHalfCard().setPT(3, 2); + + // Flying + this.getRightHalfCard().addAbility(FlyingAbility.getInstance()); } private HeirOfFalkenrath(final HeirOfFalkenrath card) { diff --git a/Mage.Sets/src/mage/cards/h/HeirToTheNight.java b/Mage.Sets/src/mage/cards/h/HeirToTheNight.java deleted file mode 100644 index ca92f5f234e..00000000000 --- a/Mage.Sets/src/mage/cards/h/HeirToTheNight.java +++ /dev/null @@ -1,41 +0,0 @@ - -package mage.cards.h; - -import java.util.UUID; -import mage.MageInt; -import mage.abilities.keyword.FlyingAbility; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; - -/** - * - * @author fireshoes - */ -public final class HeirToTheNight extends CardImpl { - - public HeirToTheNight(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},""); - this.subtype.add(SubType.VAMPIRE); - this.subtype.add(SubType.BERSERKER); - this.power = new MageInt(3); - this.toughness = new MageInt(2); - this.color.setBlack(true); - - // this card is the second face of double-faced card - this.nightCard = true; - - // Flying - this.addAbility(FlyingAbility.getInstance()); - } - - private HeirToTheNight(final HeirToTheNight card) { - super(card); - } - - @Override - public HeirToTheNight copy() { - return new HeirToTheNight(this); - } -} diff --git a/Mage.Sets/src/mage/cards/h/HeirloomMirror.java b/Mage.Sets/src/mage/cards/h/HeirloomMirror.java index 69323e07bc4..75d8f78e3e6 100644 --- a/Mage.Sets/src/mage/cards/h/HeirloomMirror.java +++ b/Mage.Sets/src/mage/cards/h/HeirloomMirror.java @@ -2,40 +2,44 @@ package mage.cards.h; import mage.abilities.Ability; import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.costs.common.DiscardCardCost; import mage.abilities.costs.common.PayLifeCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.abilities.effects.common.MillCardsControllerEffect; -import mage.abilities.effects.common.RemoveAllCountersSourceEffect; -import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.effects.common.*; import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.abilities.keyword.TransformAbility; -import mage.cards.CardImpl; +import mage.abilities.keyword.FlyingAbility; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; +import mage.constants.SubType; import mage.counters.CounterType; +import mage.filter.StaticFilters; +import mage.target.common.TargetCardInGraveyard; import java.util.UUID; /** * @author TheElk801 */ -public final class HeirloomMirror extends CardImpl { +public final class HeirloomMirror extends TransformingDoubleFacedCard { private static final Condition condition = new SourceHasCounterCondition(CounterType.RITUAL, 3); public HeirloomMirror(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{B}"); - - this.secondSideCardClazz = mage.cards.i.InheritedFiend.class; + super(ownerId, setInfo, + new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "{1}{B}", + "Inherited Fiend", + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.DEMON}, "B" + ); + // Heirloom Mirror // {1}, {T}, Pay 1 life, Discard a card: Draw a card, mill a card, then put a ritual counter on Heirloom Mirror. Then if it has 3 or more ritual counters on it, remove them and transform it. Activate only as a sorcery. - this.addAbility(new TransformAbility()); Ability ability = new ActivateAsSorceryActivatedAbility(new DrawCardSourceControllerEffect(1), new GenericManaCost(1)); ability.addCost(new TapSourceCost()); ability.addCost(new PayLifeCost(1)); @@ -44,9 +48,21 @@ public final class HeirloomMirror extends CardImpl { ability.addEffect(new AddCountersSourceEffect(CounterType.RITUAL.createInstance()).concatBy(", then")); ability.addEffect(new ConditionalOneShotEffect( new RemoveAllCountersSourceEffect(CounterType.RITUAL), condition, - "Then if it has 3 or more ritual counters on it, remove them and transform it" + "Then if it has three or more ritual counters on it, remove them and transform it" ).addEffect(new TransformSourceEffect())); - this.addAbility(ability); + this.getLeftHalfCard().addAbility(ability); + + // Inherited Fiend + this.getRightHalfCard().setPT(4, 4); + + // Flying + this.getRightHalfCard().addAbility(FlyingAbility.getInstance()); + + // {2}{B}: Exile target creature card from a graveyard. Put a +1/+1 counter on Inherited Fiend. + Ability backAbility = new SimpleActivatedAbility(new ExileTargetEffect(), new ManaCostsImpl<>("{2}{B}")); + backAbility.addEffect(new AddCountersSourceEffect(CounterType.P1P1.createInstance()).concatBy(".")); + backAbility.addTarget(new TargetCardInGraveyard(StaticFilters.FILTER_CARD_CREATURE_A_GRAVEYARD)); + this.getRightHalfCard().addAbility(backAbility); } private HeirloomMirror(final HeirloomMirror card) { diff --git a/Mage.Sets/src/mage/cards/h/HeliodTheRadiantDawn.java b/Mage.Sets/src/mage/cards/h/HeliodTheRadiantDawn.java index 992a028c466..ca94d277ff9 100644 --- a/Mage.Sets/src/mage/cards/h/HeliodTheRadiantDawn.java +++ b/Mage.Sets/src/mage/cards/h/HeliodTheRadiantDawn.java @@ -1,49 +1,66 @@ package mage.cards.h; -import mage.MageInt; import mage.abilities.Ability; +import mage.abilities.SpellAbility; import mage.abilities.common.ActivateAsSorceryActivatedAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; import mage.abilities.effects.common.TransformSourceEffect; -import mage.abilities.keyword.TransformAbility; -import mage.cards.CardImpl; +import mage.abilities.effects.common.continuous.CastAsThoughItHadFlashAllEffect; +import mage.abilities.effects.common.cost.CostModificationEffectImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.SuperType; +import mage.cards.TransformingDoubleFacedCard; +import mage.constants.*; import mage.filter.FilterCard; import mage.filter.common.FilterEnchantmentCard; +import mage.filter.common.FilterNonlandCard; import mage.filter.predicate.Predicates; +import mage.game.Game; import mage.target.common.TargetCardInYourGraveyard; +import mage.util.CardUtil; +import mage.watchers.common.CardsDrawnThisTurnWatcher; import java.util.UUID; -public class HeliodTheRadiantDawn extends CardImpl { +public class HeliodTheRadiantDawn extends TransformingDoubleFacedCard { private static final FilterCard filter = new FilterEnchantmentCard("enchantment card that isn't a God"); + private static final FilterCard flashFilter = new FilterNonlandCard("spells"); static { filter.add(Predicates.not(SubType.GOD.getPredicate())); } public HeliodTheRadiantDawn(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "{2}{W}{W}"); - this.supertype.add(SuperType.LEGENDARY); - this.addSubType(SubType.GOD); - this.power = new MageInt(4); - this.toughness = new MageInt(4); - this.secondSideCardClazz = mage.cards.h.HeliodTheWarpedEclipse.class; + super(ownerId, setInfo, + new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, new SubType[]{SubType.GOD}, "{2}{W}{W}", + "Heliod, the Warped Eclipse", + new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, new SubType[]{SubType.PHYREXIAN, SubType.GOD}, "WU" + ); + + // Heliod, the Radiant Dawn + this.getLeftHalfCard().setPT(4, 4); // When Heliod, the Radiant Dawn enters the battlefield, return target enchantment card that isn't a God from your graveyard to your hand. Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect()); ability.addTarget(new TargetCardInYourGraveyard(filter)); - this.addAbility(ability); + this.getLeftHalfCard().addAbility(ability); // {3}{U/P}: Transform Heliod, the Radiant Dawn. Activate only as a sorcery. - this.addAbility(new TransformAbility()); - this.addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{3}{U/P}"))); + this.getLeftHalfCard().addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{3}{U/P}"))); + + // Heliod, the Warped Eclipse + this.getRightHalfCard().setPT(4, 6); + + // You may cast spells as though they had flash. + this.getRightHalfCard().addAbility(new SimpleStaticAbility(new CastAsThoughItHadFlashAllEffect(Duration.WhileOnBattlefield, flashFilter))); + + // Spells you cast cost {1} less to cast for each card your opponents have drawn this turn. + Ability ability2 = new SimpleStaticAbility(new HeliodTheWarpedEclipseEffect()); + ability2.addWatcher(new CardsDrawnThisTurnWatcher()); + this.getRightHalfCard().addAbility(ability2); } private HeliodTheRadiantDawn(final HeliodTheRadiantDawn card) { @@ -55,3 +72,45 @@ public class HeliodTheRadiantDawn extends CardImpl { return new HeliodTheRadiantDawn(this); } } + +class HeliodTheWarpedEclipseEffect extends CostModificationEffectImpl { + + HeliodTheWarpedEclipseEffect() { + super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.REDUCE_COST); + staticText = "spells you cast cost {1} less to cast for each card your opponents have drawn this turn"; + } + + private HeliodTheWarpedEclipseEffect(final HeliodTheWarpedEclipseEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source, Ability abilityToModify) { + CardsDrawnThisTurnWatcher watcher = game.getState().getWatcher(CardsDrawnThisTurnWatcher.class); + if (watcher == null) { + return false; + } + int amount = game + .getOpponents(source.getControllerId()) + .stream() + .mapToInt(watcher::getCardsDrawnThisTurn) + .sum(); + if (amount < 1) { + return false; + } + CardUtil.adjustCost((SpellAbility) abilityToModify, amount); + return true; + } + + @Override + public boolean applies(Ability abilityToModify, Ability source, Game game) { + return abilityToModify instanceof SpellAbility + && game.getCard(abilityToModify.getSourceId()) != null + && abilityToModify.isControlledBy(source.getControllerId()); + } + + @Override + public HeliodTheWarpedEclipseEffect copy() { + return new HeliodTheWarpedEclipseEffect(this); + } +} diff --git a/Mage.Sets/src/mage/cards/h/HeliodTheWarpedEclipse.java b/Mage.Sets/src/mage/cards/h/HeliodTheWarpedEclipse.java deleted file mode 100644 index 712aa244fb9..00000000000 --- a/Mage.Sets/src/mage/cards/h/HeliodTheWarpedEclipse.java +++ /dev/null @@ -1,92 +0,0 @@ -package mage.cards.h; - -import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.SpellAbility; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.common.continuous.CastAsThoughItHadFlashAllEffect; -import mage.abilities.effects.common.cost.CostModificationEffectImpl; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.*; -import mage.filter.FilterCard; -import mage.filter.common.FilterNonlandCard; -import mage.game.Game; -import mage.util.CardUtil; -import mage.watchers.common.CardsDrawnThisTurnWatcher; - -import java.util.UUID; - -public class HeliodTheWarpedEclipse extends CardImpl { - - private static final FilterCard filter = new FilterNonlandCard("spells"); - - public HeliodTheWarpedEclipse(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, ""); - this.color.setWhite(true); - this.color.setBlue(true); - this.supertype.add(SuperType.LEGENDARY); - this.addSubType(SubType.PHYREXIAN); - this.addSubType(SubType.GOD); - this.power = new MageInt(4); - this.toughness = new MageInt(6); - this.nightCard = true; - - // You may cast spells as though they had flash. - this.addAbility(new SimpleStaticAbility(new CastAsThoughItHadFlashAllEffect(Duration.WhileOnBattlefield, filter))); - - // Spells you cast cost {1} less to cast for each card your opponents have drawn this turn. - this.addAbility(new SimpleStaticAbility(new HeliodTheWarpedEclipseEffect())); - } - - private HeliodTheWarpedEclipse(final HeliodTheWarpedEclipse card) { - super(card); - } - - @Override - public HeliodTheWarpedEclipse copy() { - return new HeliodTheWarpedEclipse(this); - } -} - -class HeliodTheWarpedEclipseEffect extends CostModificationEffectImpl { - - HeliodTheWarpedEclipseEffect() { - super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.REDUCE_COST); - staticText = "spells you cast cost {1} less to cast for each card your opponents have drawn this turn"; - } - - private HeliodTheWarpedEclipseEffect(final HeliodTheWarpedEclipseEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source, Ability abilityToModify) { - CardsDrawnThisTurnWatcher watcher = game.getState().getWatcher(CardsDrawnThisTurnWatcher.class); - if (watcher == null) { - return false; - } - int amount = game - .getOpponents(source.getControllerId()) - .stream() - .mapToInt(watcher::getCardsDrawnThisTurn) - .sum(); - if (amount < 1) { - return false; - } - CardUtil.adjustCost((SpellAbility) abilityToModify, amount); - return true; - } - - @Override - public boolean applies(Ability abilityToModify, Ability source, Game game) { - return abilityToModify instanceof SpellAbility - && game.getCard(abilityToModify.getSourceId()) != null - && abilityToModify.isControlledBy(source.getControllerId()); - } - - @Override - public HeliodTheWarpedEclipseEffect copy() { - return new HeliodTheWarpedEclipseEffect(this); - } -} diff --git a/Mage.Sets/src/mage/cards/h/HenrikaDomnathi.java b/Mage.Sets/src/mage/cards/h/HenrikaDomnathi.java index 2b2b78e162c..c85473cec50 100644 --- a/Mage.Sets/src/mage/cards/h/HenrikaDomnathi.java +++ b/Mage.Sets/src/mage/cards/h/HenrikaDomnathi.java @@ -1,41 +1,57 @@ package mage.cards.h; -import mage.MageInt; import mage.abilities.Ability; import mage.abilities.Mode; -import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.LoseLifeSourceControllerEffect; import mage.abilities.effects.common.SacrificeAllEffect; import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.effects.common.continuous.BoostAllEffect; import mage.abilities.hint.common.ModesAlreadyUsedHint; +import mage.abilities.keyword.DeathtouchAbility; import mage.abilities.keyword.FlyingAbility; -import mage.abilities.keyword.TransformAbility; -import mage.cards.CardImpl; +import mage.abilities.keyword.LifelinkAbility; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.SuperType; +import mage.cards.TransformingDoubleFacedCard; +import mage.constants.*; import mage.filter.StaticFilters; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.AbilityPredicate; import java.util.UUID; /** * @author TheElk801 */ -public final class HenrikaDomnathi extends CardImpl { +public final class HenrikaDomnathi extends TransformingDoubleFacedCard { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("each creature you control with flying, deathtouch, and/or lifelink"); + + static { + filter.add(TargetController.YOU.getControllerPredicate()); + filter.add(Predicates.or( + new AbilityPredicate(FlyingAbility.class), + new AbilityPredicate(DeathtouchAbility.class), + new AbilityPredicate(LifelinkAbility.class) + )); + } public HenrikaDomnathi(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{B}"); + super(ownerId, setInfo, + new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.VAMPIRE}, "{2}{B}{B}", + "Henrika, Infernal Seer", + new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.VAMPIRE}, "B" + ); - this.supertype.add(SuperType.LEGENDARY); - this.subtype.add(SubType.VAMPIRE); - this.power = new MageInt(1); - this.toughness = new MageInt(3); - this.secondSideCardClazz = mage.cards.h.HenrikaInfernalSeer.class; + // Henrika Domnathi + this.getLeftHalfCard().setPT(1, 3); // Flying - this.addAbility(FlyingAbility.getInstance()); + this.getLeftHalfCard().addAbility(FlyingAbility.getInstance()); // At the beginning of combat on your turn, choose one that hasn't been chosen — // • Each player sacrifices a creature. @@ -51,10 +67,26 @@ public final class HenrikaDomnathi extends CardImpl { // • Transform Henrika Domnathi. ability.addMode(new Mode(new TransformSourceEffect()).setModeTag("transform")); - this.addAbility(new TransformAbility()); ability.addHint(ModesAlreadyUsedHint.instance); - this.addAbility(ability); + this.getLeftHalfCard().addAbility(ability); + + // Henrika, Infernal Seer + this.getRightHalfCard().setPT(3, 4); + + // Flying + this.getRightHalfCard().addAbility(FlyingAbility.getInstance()); + + // Deathtouch + this.getRightHalfCard().addAbility(DeathtouchAbility.getInstance()); + + // Lifelink + this.getRightHalfCard().addAbility(LifelinkAbility.getInstance()); + + // {1}{B}{B}: Each creature you control with flying, deathtouch, and/or lifelink gets +1/+0 until end of turn. + this.getRightHalfCard().addAbility(new SimpleActivatedAbility(new BoostAllEffect( + 1, 0, Duration.EndOfTurn, filter, false + ), new ManaCostsImpl<>("{1}{B}{B}"))); } private HenrikaDomnathi(final HenrikaDomnathi card) { diff --git a/Mage.Sets/src/mage/cards/h/HenrikaInfernalSeer.java b/Mage.Sets/src/mage/cards/h/HenrikaInfernalSeer.java deleted file mode 100644 index fce0036801d..00000000000 --- a/Mage.Sets/src/mage/cards/h/HenrikaInfernalSeer.java +++ /dev/null @@ -1,68 +0,0 @@ -package mage.cards.h; - -import mage.MageInt; -import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.continuous.BoostAllEffect; -import mage.abilities.keyword.DeathtouchAbility; -import mage.abilities.keyword.FlyingAbility; -import mage.abilities.keyword.LifelinkAbility; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.*; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.AbilityPredicate; - -import java.util.UUID; - -/** - * @author TheElk801 - */ -public final class HenrikaInfernalSeer extends CardImpl { - - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("each creature you control with flying, deathtouch, and/or lifelink"); - - static { - filter.add(TargetController.YOU.getControllerPredicate()); - filter.add(Predicates.or( - new AbilityPredicate(FlyingAbility.class), - new AbilityPredicate(DeathtouchAbility.class), - new AbilityPredicate(LifelinkAbility.class) - )); - } - - public HenrikaInfernalSeer(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, ""); - - this.supertype.add(SuperType.LEGENDARY); - this.subtype.add(SubType.VAMPIRE); - this.power = new MageInt(3); - this.toughness = new MageInt(4); - this.color.setBlack(true); - this.nightCard = true; - - // Flying - this.addAbility(FlyingAbility.getInstance()); - - // Deathtouch - this.addAbility(DeathtouchAbility.getInstance()); - - // Lifelink - this.addAbility(LifelinkAbility.getInstance()); - - // {1}{B}{B}: Each creature you control with flying, deathtouch, and/or lifelink gets +1/+0 until end of turn. - this.addAbility(new SimpleActivatedAbility(new BoostAllEffect( - 1, 0, Duration.EndOfTurn, filter, false - ), new ManaCostsImpl<>("{1}{B}{B}"))); - } - - private HenrikaInfernalSeer(final HenrikaInfernalSeer card) { - super(card); - } - - @Override - public HenrikaInfernalSeer copy() { - return new HenrikaInfernalSeer(this); - } -} diff --git a/Mage.Sets/src/mage/cards/h/HerbologyInstructor.java b/Mage.Sets/src/mage/cards/h/HerbologyInstructor.java index 826ab7f6688..4b3be096b87 100644 --- a/Mage.Sets/src/mage/cards/h/HerbologyInstructor.java +++ b/Mage.Sets/src/mage/cards/h/HerbologyInstructor.java @@ -1,39 +1,55 @@ package mage.cards.h; -import mage.MageInt; +import mage.abilities.Ability; import mage.abilities.common.ActivateAsSorceryActivatedAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.TransformIntoSourceTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.SignInversionDynamicValue; +import mage.abilities.dynamicvalue.common.SourcePermanentPowerValue; +import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.TransformSourceEffect; -import mage.abilities.keyword.TransformAbility; -import mage.cards.CardImpl; +import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; +import mage.constants.Duration; import mage.constants.SubType; +import mage.target.common.TargetOpponentsCreaturePermanent; import java.util.UUID; /** * @author TheElk801 */ -public final class HerbologyInstructor extends CardImpl { +public final class HerbologyInstructor extends TransformingDoubleFacedCard { public HerbologyInstructor(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); + super(ownerId, setInfo, + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.TREEFOLK, SubType.DRUID}, "{1}{G}", + "Malady Invoker", + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.PHYREXIAN, SubType.TREEFOLK}, "BG" + ); - this.subtype.add(SubType.TREEFOLK); - this.subtype.add(SubType.DRUID); - this.power = new MageInt(1); - this.toughness = new MageInt(3); - this.secondSideCardClazz = mage.cards.m.MaladyInvoker.class; + // Herbology Instructor + this.getLeftHalfCard().setPT(1, 3); // When Herbology Instructor enters the battlefield, you gain 3 life. - this.addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(3))); + this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(3))); // {6}{B/P}: Transform Herbology Instructor. Activate only as a sorcery. - this.addAbility(new TransformAbility()); - this.addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{6}{B/P}"))); + this.getLeftHalfCard().addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{6}{B/P}"))); + + // Malady Invoker + this.getRightHalfCard().setPT(3, 3); + + // When this creature transforms into Malady Invoker, target creature an opponent controls gets -0/-X until end of turn, where X is Malady Invoker's power. + Ability ability = new TransformIntoSourceTriggeredAbility(new BoostTargetEffect( + StaticValue.get(0), new SignInversionDynamicValue(SourcePermanentPowerValue.NOT_NEGATIVE), Duration.EndOfTurn + ).setText("target creature an opponent controls gets -0/-X until end of turn, where X is {this}'s power")); + ability.addTarget(new TargetOpponentsCreaturePermanent()); + this.getRightHalfCard().addAbility(ability); } private HerbologyInstructor(final HerbologyInstructor card) { diff --git a/Mage.Sets/src/mage/cards/h/HermitOfTheNatterknolls.java b/Mage.Sets/src/mage/cards/h/HermitOfTheNatterknolls.java index ede6c5f95e4..f041fc3c33a 100644 --- a/Mage.Sets/src/mage/cards/h/HermitOfTheNatterknolls.java +++ b/Mage.Sets/src/mage/cards/h/HermitOfTheNatterknolls.java @@ -1,13 +1,12 @@ package mage.cards.h; -import mage.MageInt; import mage.abilities.common.SpellCastOpponentTriggeredAbility; +import mage.abilities.common.WerewolfBackTriggeredAbility; import mage.abilities.common.WerewolfFrontTriggeredAbility; import mage.abilities.condition.common.MyTurnCondition; import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.abilities.keyword.TransformAbility; -import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.SubType; import mage.filter.StaticFilters; @@ -17,25 +16,36 @@ import java.util.UUID; /** * @author LevelX2 */ -public final class HermitOfTheNatterknolls extends CardImpl { +public final class HermitOfTheNatterknolls extends TransformingDoubleFacedCard { public HermitOfTheNatterknolls(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); - this.subtype.add(SubType.HUMAN); - this.subtype.add(SubType.WEREWOLF); - this.power = new MageInt(2); - this.toughness = new MageInt(3); + super(ownerId, setInfo, + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{2}{G}", + "Lone Wolf of the Natterknolls", + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "G" + ); - this.secondSideCardClazz = mage.cards.l.LoneWolfOfTheNatterknolls.class; + // Hermit of the Natterknolls + this.getLeftHalfCard().setPT(2, 3); // Whenever an opponent casts a spell during your turn, draw a card. - this.addAbility(new SpellCastOpponentTriggeredAbility( + this.getLeftHalfCard().addAbility(new SpellCastOpponentTriggeredAbility( new DrawCardSourceControllerEffect(1), StaticFilters.FILTER_SPELL_A, false ).withTriggerCondition(MyTurnCondition.instance)); // At the beginning of each upkeep, if no spells were cast last turn, transform Hermit of the Natterknolls. - this.addAbility(new TransformAbility()); - this.addAbility(new WerewolfFrontTriggeredAbility()); + this.getLeftHalfCard().addAbility(new WerewolfFrontTriggeredAbility()); + + // Lone Wolf of the Natterknolls + this.getRightHalfCard().setPT(3, 5); + + // Whenever an opponent cast a spell during your turn, draw two cards. + this.getRightHalfCard().addAbility(new SpellCastOpponentTriggeredAbility( + new DrawCardSourceControllerEffect(2), StaticFilters.FILTER_SPELL_A, false + ).withTriggerCondition(MyTurnCondition.instance)); + + // At the beginning of each upkeep, if a player cast two or more spells last turn, transform Lone Wolf of the Natterknolls. + this.getRightHalfCard().addAbility(new WerewolfBackTriggeredAbility()); } private HermitOfTheNatterknolls(final HermitOfTheNatterknolls card) { diff --git a/Mage.Sets/src/mage/cards/h/HidetsuguConsumesAll.java b/Mage.Sets/src/mage/cards/h/HidetsuguConsumesAll.java index 16e6ba35dc0..8b01a26e62e 100644 --- a/Mage.Sets/src/mage/cards/h/HidetsuguConsumesAll.java +++ b/Mage.Sets/src/mage/cards/h/HidetsuguConsumesAll.java @@ -1,26 +1,38 @@ package mage.cards.h; +import mage.MageObjectReference; +import mage.abilities.Ability; +import mage.abilities.common.DealsDamageSourceTriggeredAbility; +import mage.abilities.common.DealsDamageToAPlayerTriggeredAbility; import mage.abilities.common.SagaAbility; +import mage.abilities.condition.Condition; import mage.abilities.effects.common.DestroyAllEffect; import mage.abilities.effects.common.ExileGraveyardAllPlayersEffect; import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect; -import mage.abilities.keyword.TransformAbility; -import mage.cards.CardImpl; +import mage.abilities.effects.common.LoseGameTargetPlayerEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.TrampleAbility; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.ComparisonType; -import mage.constants.SagaChapter; -import mage.constants.SubType; +import mage.cards.TransformingDoubleFacedCard; +import mage.constants.*; +import mage.counters.CounterType; import mage.filter.FilterPermanent; import mage.filter.common.FilterNonlandPermanent; import mage.filter.predicate.mageobject.ManaValuePredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.watchers.Watcher; +import java.util.AbstractMap; +import java.util.HashMap; +import java.util.Map; import java.util.UUID; /** * @author TheElk801 */ -public final class HidetsuguConsumesAll extends CardImpl { +public final class HidetsuguConsumesAll extends TransformingDoubleFacedCard { private static final FilterPermanent filter = new FilterNonlandPermanent(); @@ -29,26 +41,41 @@ public final class HidetsuguConsumesAll extends CardImpl { } public HidetsuguConsumesAll(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}{R}"); - - this.subtype.add(SubType.SAGA); - this.secondSideCardClazz = mage.cards.v.VesselOfTheAllConsuming.class; + super(ownerId, setInfo, + new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "{1}{B}{R}", + "Vessel of the All-Consuming", + new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, new SubType[]{SubType.OGRE, SubType.SHAMAN}, "BR" + ); + // Hidetsugu Consumes All // (As this Saga enters and after your draw step, add a lore counter.) - SagaAbility sagaAbility = new SagaAbility(this); + SagaAbility sagaAbility = new SagaAbility(this.getLeftHalfCard()); // I — Destroy each nonland permanent with mana value 1 or less. - sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_I, new DestroyAllEffect(filter) + sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_I, new DestroyAllEffect(filter) .setText("destroy each nonland permanent with mana value 1 or less")); // II — Exile all graveyards. - sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_II, new ExileGraveyardAllPlayersEffect()); + sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_II, new ExileGraveyardAllPlayersEffect()); // III — Exile this Saga, then return it to the battlefield transformed under your control. - this.addAbility(new TransformAbility()); - sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect()); + sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect()); + sagaAbility.addWatcher(VesselOfTheAllConsumingWatcher.makeWatcher()); + this.getLeftHalfCard().addAbility(sagaAbility); - this.addAbility(sagaAbility, mage.cards.v.VesselOfTheAllConsuming.makeWatcher()); + // Vessel of the All-Consuming + this.getRightHalfCard().setPT(3, 3); + + // Trample + this.getRightHalfCard().addAbility(TrampleAbility.getInstance()); + + // Whenever Vessel of the All-Consuming deals damage, put a +1/+1 counter on it. + this.getRightHalfCard().addAbility(new DealsDamageSourceTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()))); + + // Whenever Vessel of the All-Consuming deals damage to a player, if it has dealt 10 or more damage to that player this turn, they lose the game. + this.getRightHalfCard().addAbility(new DealsDamageToAPlayerTriggeredAbility( + new LoseGameTargetPlayerEffect().setText("they lose the game"), false, true + ).withInterveningIf(VesselOfTheAllConsumingCondition.instance)); } private HidetsuguConsumesAll(final HidetsuguConsumesAll card) { @@ -60,3 +87,60 @@ public final class HidetsuguConsumesAll extends CardImpl { return new HidetsuguConsumesAll(this); } } + +enum VesselOfTheAllConsumingCondition implements Condition { + instance; + + @Override + public boolean apply(Game game, Ability source) { + return VesselOfTheAllConsumingWatcher.checkPermanent(game, source); + } + + @Override + public String toString() { + return "it has dealt 10 or more damage to that player this turn"; + } +} + +class VesselOfTheAllConsumingWatcher extends Watcher { + + private final Map, Integer> morMap = new HashMap<>(); + + VesselOfTheAllConsumingWatcher() { + super(WatcherScope.GAME); + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() != GameEvent.EventType.DAMAGED_PLAYER) { + return; + } + Permanent permanent = game.getPermanent(event.getSourceId()); + if (permanent != null) { + int damage = event.getAmount(); + morMap.compute(new AbstractMap.SimpleImmutableEntry(new MageObjectReference(permanent, game), event.getTargetId()), + (u, i) -> i == null ? damage : Integer.sum(i, damage)); + } + } + + @Override + public void reset() { + super.reset(); + morMap.clear(); + } + + static Watcher makeWatcher() { + return new VesselOfTheAllConsumingWatcher(); + } + + static boolean checkPermanent(Game game, Ability source) { + VesselOfTheAllConsumingWatcher watcher = game.getState().getWatcher(VesselOfTheAllConsumingWatcher.class); + if (watcher == null) { + return false; + } + AbstractMap.SimpleImmutableEntry key = new AbstractMap.SimpleImmutableEntry<>( + new MageObjectReference(game.getPermanent(source.getSourceId()), game), + source.getEffects().get(0).getTargetPointer().getFirst(game, source)); + return watcher.morMap.getOrDefault(key, 0) >= 10; + } +} diff --git a/Mage.Sets/src/mage/cards/h/HinterlandHermit.java b/Mage.Sets/src/mage/cards/h/HinterlandHermit.java index e376e0ebdea..12fe9a552e1 100644 --- a/Mage.Sets/src/mage/cards/h/HinterlandHermit.java +++ b/Mage.Sets/src/mage/cards/h/HinterlandHermit.java @@ -1,11 +1,13 @@ package mage.cards.h; -import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.WerewolfBackTriggeredAbility; import mage.abilities.common.WerewolfFrontTriggeredAbility; -import mage.abilities.keyword.TransformAbility; -import mage.cards.CardImpl; +import mage.abilities.effects.common.combat.MustBeBlockedByAtLeastOneSourceEffect; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; +import mage.constants.Duration; import mage.constants.SubType; import java.util.UUID; @@ -13,21 +15,29 @@ import java.util.UUID; /** * @author BetaSteward */ -public final class HinterlandHermit extends CardImpl { +public final class HinterlandHermit extends TransformingDoubleFacedCard { public HinterlandHermit(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); - this.subtype.add(SubType.HUMAN); - this.subtype.add(SubType.WEREWOLF); + super(ownerId, setInfo, + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{1}{R}", + "Hinterland Scourge", + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "R" + ); - this.secondSideCardClazz = mage.cards.h.HinterlandScourge.class; - - this.power = new MageInt(2); - this.toughness = new MageInt(1); + // Hinterland Hermit + this.getLeftHalfCard().setPT(2, 1); // At the beginning of each upkeep, if no spells were cast last turn, transform Hinterland Hermit. - this.addAbility(new TransformAbility()); - this.addAbility(new WerewolfFrontTriggeredAbility()); + this.getLeftHalfCard().addAbility(new WerewolfFrontTriggeredAbility()); + + // Hinterland Scourge + this.getRightHalfCard().setPT(3, 2); + + // Hinterland Scourge must be blocked if able. + this.getRightHalfCard().addAbility(new SimpleStaticAbility(new MustBeBlockedByAtLeastOneSourceEffect(Duration.WhileOnBattlefield))); + + // At the beginning of each upkeep, if a player cast two or more spells last turn, transform Hinterland Scourge. + this.getRightHalfCard().addAbility(new WerewolfBackTriggeredAbility()); } private HinterlandHermit(final HinterlandHermit card) { diff --git a/Mage.Sets/src/mage/cards/h/HinterlandScourge.java b/Mage.Sets/src/mage/cards/h/HinterlandScourge.java deleted file mode 100644 index cd0c9e0c8ba..00000000000 --- a/Mage.Sets/src/mage/cards/h/HinterlandScourge.java +++ /dev/null @@ -1,47 +0,0 @@ -package mage.cards.h; - -import mage.MageInt; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.common.WerewolfBackTriggeredAbility; -import mage.abilities.effects.common.combat.MustBeBlockedByAtLeastOneSourceEffect; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.SubType; -import mage.constants.Zone; - -import java.util.UUID; - -/** - * @author BetaSteward - */ -public final class HinterlandScourge extends CardImpl { - - public HinterlandScourge(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, ""); - this.subtype.add(SubType.WEREWOLF); - this.color.setRed(true); - - // this card is the second face of double-faced card of Hinterland Hermit - this.nightCard = true; - - this.power = new MageInt(3); - this.toughness = new MageInt(2); - - // Hinterland Scourge must be blocked if able. - this.addAbility(new SimpleStaticAbility(new MustBeBlockedByAtLeastOneSourceEffect(Duration.WhileOnBattlefield))); - - // At the beginning of each upkeep, if a player cast two or more spells last turn, transform Hinterland Scourge. - this.addAbility(new WerewolfBackTriggeredAbility()); - } - - private HinterlandScourge(final HinterlandScourge card) { - super(card); - } - - @Override - public HinterlandScourge copy() { - return new HinterlandScourge(this); - } -} diff --git a/Mage.Sets/src/mage/cards/h/HookhandMariner.java b/Mage.Sets/src/mage/cards/h/HookhandMariner.java index c2fc61ab523..dd34f90a2eb 100644 --- a/Mage.Sets/src/mage/cards/h/HookhandMariner.java +++ b/Mage.Sets/src/mage/cards/h/HookhandMariner.java @@ -1,9 +1,10 @@ package mage.cards.h; -import mage.MageInt; +import mage.abilities.keyword.DauntAbility; import mage.abilities.keyword.DayboundAbility; -import mage.cards.CardImpl; +import mage.abilities.keyword.NightboundAbility; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.SubType; @@ -12,19 +13,29 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class HookhandMariner extends CardImpl { +public final class HookhandMariner extends TransformingDoubleFacedCard { public HookhandMariner(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}"); + super(ownerId, setInfo, + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{3}{G}", + "Riphook Raider", + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "G" + ); - this.subtype.add(SubType.HUMAN); - this.subtype.add(SubType.WEREWOLF); - this.power = new MageInt(4); - this.toughness = new MageInt(4); - this.secondSideCardClazz = mage.cards.r.RiphookRaider.class; + // Hookhand Mariner + this.getLeftHalfCard().setPT(4, 4); // Daybound - this.addAbility(new DayboundAbility()); + this.getLeftHalfCard().addAbility(new DayboundAbility()); + + // Riphook Raider + this.getRightHalfCard().setPT(6, 4); + + // Riphook Raider can't be blocked by creatures with power 2 or less. + this.getRightHalfCard().addAbility(new DauntAbility()); + + // Nightbound + this.getRightHalfCard().addAbility(new NightboundAbility()); } private HookhandMariner(final HookhandMariner card) { diff --git a/Mage.Sets/src/mage/cards/h/HostileHostel.java b/Mage.Sets/src/mage/cards/h/HostileHostel.java index 8e8a5a156c4..8538da2f36c 100644 --- a/Mage.Sets/src/mage/cards/h/HostileHostel.java +++ b/Mage.Sets/src/mage/cards/h/HostileHostel.java @@ -2,42 +2,57 @@ package mage.cards.h; import mage.abilities.Ability; import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.PhaseOutSourceEffect; import mage.abilities.effects.common.RemoveAllCountersSourceEffect; import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.effects.common.UntapSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.abilities.keyword.TransformAbility; import mage.abilities.mana.ColorlessManaAbility; -import mage.cards.CardImpl; +import mage.cards.Card; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; import mage.counters.CounterType; import mage.filter.StaticFilters; +import mage.game.ExileZone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCardInGraveyard; +import mage.util.CardUtil; import java.util.UUID; /** * @author LePwnerer */ -public final class HostileHostel extends CardImpl { +public final class HostileHostel extends TransformingDoubleFacedCard { private static final Condition condition = new SourceHasCounterCondition(CounterType.SOUL, 3); public HostileHostel(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); - this.secondSideCardClazz = mage.cards.c.CreepingInn.class; + super(ownerId, setInfo, + new CardType[]{CardType.LAND}, new SubType[]{}, "", + "Creeping Inn", + new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.HORROR, SubType.CONSTRUCT}, "B" + ); + // Hostile Hostel // {T}: Add {C}. - this.addAbility(new ColorlessManaAbility()); + this.getLeftHalfCard().addAbility(new ColorlessManaAbility()); // {1}, {T}, Sacrifice a creature: Put a soul counter on Hostile Hostel. Then if there are three or more soul counters on it, remove those counters, transform it, then untap it. Activate only as a sorcery. - this.addAbility(new TransformAbility()); Ability ability = new ActivateAsSorceryActivatedAbility(new AddCountersSourceEffect(CounterType.SOUL.createInstance()), new ManaCostsImpl<>("{1}")); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_CREATURE)); @@ -45,7 +60,17 @@ public final class HostileHostel extends CardImpl { new RemoveAllCountersSourceEffect(CounterType.SOUL), condition, "Then if there are three " + "or more soul counters on it, remove those counters, transform it, then untap it" ).addEffect(new TransformSourceEffect()).addEffect(new UntapSourceEffect())); - this.addAbility(ability); + this.getLeftHalfCard().addAbility(ability); + + // Creeping Inn + this.getRightHalfCard().setPT(3, 7); + + // Whenever Creeping Inn attacks, you may exile a creature card from your graveyard. + // If you do, each opponent loses X life and you gain X life, where X is the number of creature cards exiled with Creeping Inn. + this.getRightHalfCard().addAbility(new AttacksTriggeredAbility(new CreepingInnEffect())); + + // {4}: Creeping Inn phases out. + this.getRightHalfCard().addAbility(new SimpleActivatedAbility(new PhaseOutSourceEffect(), new ManaCostsImpl<>("{4}"))); } private HostileHostel(final HostileHostel card) { @@ -57,3 +82,54 @@ public final class HostileHostel extends CardImpl { return new HostileHostel(this); } } + +class CreepingInnEffect extends OneShotEffect { + + CreepingInnEffect() { + super(Outcome.Exile); + this.staticText = "you may exile a creature card from your graveyard. " + + "If you do, each opponent loses X life and you gain X life, " + + "where X is the number of creature cards exiled with {this}."; + } + + private CreepingInnEffect(final CreepingInnEffect effect) { + super(effect); + } + + @Override + public CreepingInnEffect copy() { + return new CreepingInnEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Permanent permanent = source.getSourcePermanentOrLKI(game); + if (player != null && permanent != null) { + UUID exileId = CardUtil.getExileZoneId(game, source); + TargetCardInGraveyard target = new TargetCardInGraveyard(0, 1, StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD); + target.withNotTarget(true); + if (target.canChoose(player.getId(), source, game)) { + if (player.choose(Outcome.Exile, target, source, game)) { + Card cardChosen = game.getCard(target.getFirstTarget()); + if (cardChosen != null) { + int lifeAmount = 0; + player.moveCardsToExile(cardChosen, source, game, true, exileId, permanent.getName()); + ExileZone exile = game.getExile().getExileZone(exileId); + if (exile != null) { + for (UUID cardId : exile) { + lifeAmount++; + } + } + for (UUID playerId : game.getOpponents(source.getControllerId())) { + game.getPlayer(playerId).loseLife(lifeAmount, game, source, false); + } + player.gainLife(lifeAmount, game, source); + } + } + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/h/HoundTamer.java b/Mage.Sets/src/mage/cards/h/HoundTamer.java index 925be3abf19..c546be35ee4 100644 --- a/Mage.Sets/src/mage/cards/h/HoundTamer.java +++ b/Mage.Sets/src/mage/cards/h/HoundTamer.java @@ -1,17 +1,22 @@ package mage.cards.h; -import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.abilities.keyword.DayboundAbility; +import mage.abilities.keyword.NightboundAbility; import mage.abilities.keyword.TrampleAbility; -import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; +import mage.constants.Duration; import mage.constants.SubType; import mage.counters.CounterType; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -19,29 +24,60 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class HoundTamer extends CardImpl { +public final class HoundTamer extends TransformingDoubleFacedCard { + + private static final FilterPermanent filter = new FilterPermanent("Wolves and Werewolves"); + + static { + filter.add(Predicates.or( + SubType.WOLF.getPredicate(), + SubType.WEREWOLF.getPredicate() + )); + } public HoundTamer(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); + super(ownerId, setInfo, + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{2}{G}", + "Untamed Pup", + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "G" + ); - this.subtype.add(SubType.HUMAN); - this.subtype.add(SubType.WEREWOLF); - this.power = new MageInt(3); - this.toughness = new MageInt(3); - this.secondSideCardClazz = mage.cards.u.UntamedPup.class; + // Hound Tamer + this.getLeftHalfCard().setPT(3, 3); // Trample - this.addAbility(TrampleAbility.getInstance()); + this.getLeftHalfCard().addAbility(TrampleAbility.getInstance()); // {3}{G}: Put a +1/+1 counter on target creature. Ability ability = new SimpleActivatedAbility( new AddCountersTargetEffect(CounterType.P1P1.createInstance()), new ManaCostsImpl<>("{3}{G}") ); ability.addTarget(new TargetCreaturePermanent()); - this.addAbility(ability); + this.getLeftHalfCard().addAbility(ability); // Daybound - this.addAbility(new DayboundAbility()); + this.getLeftHalfCard().addAbility(new DayboundAbility()); + + // Untamed Pup + this.getRightHalfCard().setPT(4, 4); + + // Trample + this.getRightHalfCard().addAbility(TrampleAbility.getInstance()); + + // Other Wolves and Werewolves you control have trample. + this.getRightHalfCard().addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( + TrampleAbility.getInstance(), Duration.WhileOnBattlefield, filter, true + ))); + + // {3}{G}: Put a +1/+1 counter on target creature. + Ability backAbility = new SimpleActivatedAbility( + new AddCountersTargetEffect(CounterType.P1P1.createInstance()), new ManaCostsImpl<>("{3}{G}") + ); + backAbility.addTarget(new TargetCreaturePermanent()); + this.getRightHalfCard().addAbility(backAbility); + + // Nightbound + this.getRightHalfCard().addAbility(new NightboundAbility()); } private HoundTamer(final HoundTamer card) { diff --git a/Mage.Sets/src/mage/cards/h/HowlpackPiper.java b/Mage.Sets/src/mage/cards/h/HowlpackPiper.java index 577c869a305..428c959de9e 100644 --- a/Mage.Sets/src/mage/cards/h/HowlpackPiper.java +++ b/Mage.Sets/src/mage/cards/h/HowlpackPiper.java @@ -1,20 +1,19 @@ package mage.cards.h; -import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.ActivateAsSorceryActivatedAbility; import mage.abilities.common.CantBeCounteredSourceAbility; +import mage.abilities.common.TransformsOrEntersTriggeredAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.abilities.keyword.DayboundAbility; +import mage.abilities.keyword.NightboundAbility; import mage.cards.Card; -import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.SubType; -import mage.constants.Zone; +import mage.cards.TransformingDoubleFacedCard; +import mage.constants.*; import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; @@ -28,29 +27,43 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class HowlpackPiper extends CardImpl { +public final class HowlpackPiper extends TransformingDoubleFacedCard { public HowlpackPiper(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}"); + super(ownerId, setInfo, + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{3}{G}", + "Wildsong Howler", + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "G" + ); - this.subtype.add(SubType.HUMAN); - this.subtype.add(SubType.WEREWOLF); - this.power = new MageInt(2); - this.toughness = new MageInt(2); - this.secondSideCardClazz = mage.cards.w.WildsongHowler.class; + // Howlpack Piper + this.getLeftHalfCard().setPT(2, 2); // This spell can't be countered. - this.addAbility(new CantBeCounteredSourceAbility()); + this.getLeftHalfCard().addAbility(new CantBeCounteredSourceAbility()); // {1}{G}, {T}: You may put a creature card from your hand onto the battlefield. If it's a Wolf or Werewolf, untap Howlpack Piper. Activate only as a sorcery. Ability ability = new ActivateAsSorceryActivatedAbility( new HowlpackPiperEffect(), new ManaCostsImpl<>("{1}{G}") ); ability.addCost(new TapSourceCost()); - this.addAbility(ability); + this.getLeftHalfCard().addAbility(ability); // Daybound - this.addAbility(new DayboundAbility()); + this.getLeftHalfCard().addAbility(new DayboundAbility()); + + // Wildsong Howler + this.getRightHalfCard().setPT(4, 4); + + // Whenever this creature enters the battlefield or transforms into Wildsong Howler, look at the top six cards of your library. + // You may reveal a 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.getRightHalfCard().addAbility(new TransformsOrEntersTriggeredAbility( + new LookLibraryAndPickControllerEffect(6, 1, StaticFilters.FILTER_CARD_CREATURE_A, PutCards.HAND, PutCards.BOTTOM_RANDOM), + false)); + + // Nightbound + this.getRightHalfCard().addAbility(new NightboundAbility()); } private HowlpackPiper(final HowlpackPiper card) { diff --git a/Mage.Sets/src/mage/cards/h/HuatliPoetOfUnity.java b/Mage.Sets/src/mage/cards/h/HuatliPoetOfUnity.java index 83e01945e95..04cc0feb6e5 100644 --- a/Mage.Sets/src/mage/cards/h/HuatliPoetOfUnity.java +++ b/Mage.Sets/src/mage/cards/h/HuatliPoetOfUnity.java @@ -1,20 +1,27 @@ package mage.cards.h; -import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.ActivateAsSorceryActivatedAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SagaAbility; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.ExileAndReturnSourceEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; -import mage.abilities.keyword.TransformAbility; -import mage.cards.CardImpl; +import mage.abilities.keyword.DoubleStrikeAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.abilities.mana.GreenManaAbility; +import mage.abilities.mana.RedManaAbility; +import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.PutCards; -import mage.constants.SubType; -import mage.constants.SuperType; +import mage.cards.TransformingDoubleFacedCard; +import mage.constants.*; +import mage.filter.FilterCard; import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledPermanent; +import mage.game.permanent.token.DinosaurVanillaToken; import mage.target.common.TargetCardInLibrary; import java.util.UUID; @@ -22,30 +29,74 @@ import java.util.UUID; /** * @author Susucr */ -public final class HuatliPoetOfUnity extends CardImpl { +public final class HuatliPoetOfUnity extends TransformingDoubleFacedCard { + + private static final FilterCard filterCard = new FilterCard("Dinosaur card"); + private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.DINOSAUR, "Dinosaurs you control"); + + static { + filterCard.add(SubType.DINOSAUR.getPredicate()); + } public HuatliPoetOfUnity(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); + super(ownerId, setInfo, + new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WARRIOR, SubType.BARD}, "{2}{G}", + "Roar of the Fifth People", + new SuperType[]{}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "RGW" + ); - this.supertype.add(SuperType.LEGENDARY); - this.subtype.add(SubType.HUMAN); - this.subtype.add(SubType.WARRIOR); - this.subtype.add(SubType.BARD); - this.power = new MageInt(2); - this.toughness = new MageInt(3); - this.secondSideCardClazz = mage.cards.r.RoarOfTheFifthPeople.class; + // Huatli, Poet of Unity + this.getLeftHalfCard().setPT(2, 3); // When Huatli, Poet of Unity enters the battlefield, search your library for a basic land card, reveal it, put it into your hand, then shuffle. TargetCardInLibrary target = new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND); - this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInHandEffect(target, true), false)); + this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInHandEffect(target, true), false)); // {3}{R/W}{R/W}: Exile Huatli, then return her to the battlefield transformed under her owner's control. Activate only as a sorcery. - this.addAbility(new TransformAbility()); Ability ability = new ActivateAsSorceryActivatedAbility( new ExileAndReturnSourceEffect(PutCards.BATTLEFIELD_TRANSFORMED), new ManaCostsImpl<>("{3}{R/W}{R/W}") ); - this.addAbility(ability); + this.getLeftHalfCard().addAbility(ability); + + // Roar of the Fifth People + // (As this Saga enters and after your draw step, add a lore counter. Sacrifice after IV.) + SagaAbility sagaAbility = new SagaAbility(this.getRightHalfCard(), SagaChapter.CHAPTER_IV); + + // I -- Create two 3/3 green Dinosaur creature tokens. + sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_I, new CreateTokenEffect(new DinosaurVanillaToken(), 2)); + + // II -- {this} gains "Creatures you control have '{T}: Add {R}, {G}, or {W}.'" + Ability gainedAbility = new mage.abilities.common.SimpleStaticAbility(new GainAbilityControlledEffect( + new RedManaAbility(), Duration.WhileOnBattlefield, StaticFilters.FILTER_CONTROLLED_CREATURES, false + ).setText("Creatures you control have '{T}: Add {R}")); + gainedAbility.addEffect(new GainAbilityControlledEffect( + new GreenManaAbility(), Duration.WhileOnBattlefield, StaticFilters.FILTER_CONTROLLED_CREATURES, false + ).setText(", {G}")); + gainedAbility.addEffect(new GainAbilityControlledEffect( + new WhiteManaAbility(), Duration.WhileOnBattlefield, StaticFilters.FILTER_CONTROLLED_CREATURES, false + ).setText(", or {W}.'")); + + sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_II, + new GainAbilitySourceEffect(gainedAbility, Duration.WhileOnBattlefield) + .setText("{this} gains \"Creatures you control have '{T}: Add {R}, {G}, or {W}.'\"")); + + // III -- Search your library for a Dinosaur card, reveal it, put it into your hand, then shuffle. + TargetCardInLibrary target2 = new TargetCardInLibrary(filterCard); + sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_III, new SearchLibraryPutInHandEffect(target2, true)); + + // IV -- Dinosaurs you control gain double strike and trample until end of turn. + sagaAbility.addChapterEffect( + this.getRightHalfCard(), SagaChapter.CHAPTER_IV, + new GainAbilityControlledEffect( + DoubleStrikeAbility.getInstance(), Duration.EndOfTurn, filter + ).setText("Dinosaurs you control gain double strike"), + new GainAbilityControlledEffect( + TrampleAbility.getInstance(), Duration.EndOfTurn, filter + ).setText("and trample until end of turn") + ); + + this.getRightHalfCard().addAbility(sagaAbility); } private HuatliPoetOfUnity(final HuatliPoetOfUnity card) { diff --git a/Mage.Sets/src/mage/cards/i/InheritedFiend.java b/Mage.Sets/src/mage/cards/i/InheritedFiend.java deleted file mode 100644 index 22343bddfb5..00000000000 --- a/Mage.Sets/src/mage/cards/i/InheritedFiend.java +++ /dev/null @@ -1,52 +0,0 @@ -package mage.cards.i; - -import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.ExileTargetEffect; -import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.abilities.keyword.FlyingAbility; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.counters.CounterType; -import mage.filter.StaticFilters; -import mage.target.common.TargetCardInGraveyard; - -import java.util.UUID; - -/** - * @author TheElk801 - */ -public final class InheritedFiend extends CardImpl { - - public InheritedFiend(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, ""); - - this.subtype.add(SubType.DEMON); - this.power = new MageInt(4); - this.toughness = new MageInt(4); - this.color.setBlack(true); - this.nightCard = true; - - // Flying - this.addAbility(FlyingAbility.getInstance()); - - // {2}{B}: Exile target creature card from a graveyard. Put a +1/+1 counter on Inherited Fiend. - Ability ability = new SimpleActivatedAbility(new ExileTargetEffect(), new ManaCostsImpl<>("{2}{B}")); - ability.addEffect(new AddCountersSourceEffect(CounterType.P1P1.createInstance()).concatBy(".")); - ability.addTarget(new TargetCardInGraveyard(StaticFilters.FILTER_CARD_CREATURE_A_GRAVEYARD)); - this.addAbility(ability); - } - - private InheritedFiend(final InheritedFiend card) { - super(card); - } - - @Override - public InheritedFiend copy() { - return new InheritedFiend(this); - } -} diff --git a/Mage.Sets/src/mage/cards/l/LoneWolfOfTheNatterknolls.java b/Mage.Sets/src/mage/cards/l/LoneWolfOfTheNatterknolls.java deleted file mode 100644 index 76c89b0d922..00000000000 --- a/Mage.Sets/src/mage/cards/l/LoneWolfOfTheNatterknolls.java +++ /dev/null @@ -1,47 +0,0 @@ -package mage.cards.l; - -import mage.MageInt; -import mage.abilities.common.SpellCastOpponentTriggeredAbility; -import mage.abilities.common.WerewolfBackTriggeredAbility; -import mage.abilities.condition.common.MyTurnCondition; -import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.filter.StaticFilters; - -import java.util.UUID; - -/** - * @author LevelX2 - */ -public final class LoneWolfOfTheNatterknolls extends CardImpl { - - public LoneWolfOfTheNatterknolls(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, ""); - this.subtype.add(SubType.WEREWOLF); - this.power = new MageInt(3); - this.toughness = new MageInt(5); - this.color.setGreen(true); - - this.nightCard = true; - - // Whenever an opponent cast a spell during your turn, draw two cards. - this.addAbility(new SpellCastOpponentTriggeredAbility( - new DrawCardSourceControllerEffect(2), StaticFilters.FILTER_SPELL_A, false - ).withTriggerCondition(MyTurnCondition.instance)); - - // At the beginning of each upkeep, if a player cast two or more spells last turn, transform Lone Wolf of the Natterknolls. - this.addAbility(new WerewolfBackTriggeredAbility()); - } - - private LoneWolfOfTheNatterknolls(final LoneWolfOfTheNatterknolls card) { - super(card); - } - - @Override - public LoneWolfOfTheNatterknolls copy() { - return new LoneWolfOfTheNatterknolls(this); - } -} diff --git a/Mage.Sets/src/mage/cards/m/MaladyInvoker.java b/Mage.Sets/src/mage/cards/m/MaladyInvoker.java deleted file mode 100644 index 3a6813d19d4..00000000000 --- a/Mage.Sets/src/mage/cards/m/MaladyInvoker.java +++ /dev/null @@ -1,54 +0,0 @@ -package mage.cards.m; - -import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.common.TransformIntoSourceTriggeredAbility; -import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.SignInversionDynamicValue; -import mage.abilities.dynamicvalue.common.SourcePermanentPowerValue; -import mage.abilities.dynamicvalue.common.StaticValue; -import mage.abilities.effects.common.continuous.BoostTargetEffect; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.SubType; -import mage.target.common.TargetOpponentsCreaturePermanent; - -import java.util.UUID; - -/** - * @author TheElk801 - */ -public final class MaladyInvoker extends CardImpl { - - private static final DynamicValue xValue = new SignInversionDynamicValue(SourcePermanentPowerValue.NOT_NEGATIVE); - - public MaladyInvoker(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, ""); - - this.subtype.add(SubType.PHYREXIAN); - this.subtype.add(SubType.TREEFOLK); - this.power = new MageInt(3); - this.toughness = new MageInt(3); - this.color.setBlack(true); - this.color.setGreen(true); - this.nightCard = true; - - // When this creature transforms into Malady Invoker, target creature an opponent controls gets -0/-X until end of turn, where X is Malady Invoker's power. - Ability ability = new TransformIntoSourceTriggeredAbility(new BoostTargetEffect( - StaticValue.get(0), xValue, Duration.EndOfTurn - ).setText("target creature an opponent controls gets -0/-X until end of turn, where X is {this}'s power")); - ability.addTarget(new TargetOpponentsCreaturePermanent()); - this.addAbility(ability); - } - - private MaladyInvoker(final MaladyInvoker card) { - super(card); - } - - @Override - public MaladyInvoker copy() { - return new MaladyInvoker(this); - } -} diff --git a/Mage.Sets/src/mage/cards/p/PhyrexianSkyflayer.java b/Mage.Sets/src/mage/cards/p/PhyrexianSkyflayer.java deleted file mode 100644 index 765afc12b0d..00000000000 --- a/Mage.Sets/src/mage/cards/p/PhyrexianSkyflayer.java +++ /dev/null @@ -1,44 +0,0 @@ -package mage.cards.p; - -import mage.MageInt; -import mage.abilities.keyword.FlyingAbility; -import mage.abilities.keyword.HasteAbility; -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 PhyrexianSkyflayer extends CardImpl { - - public PhyrexianSkyflayer(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, ""); - - this.subtype.add(SubType.PHYREXIAN); - this.subtype.add(SubType.ARTIFICER); - this.power = new MageInt(3); - this.toughness = new MageInt(4); - this.color.setWhite(true); - this.color.setRed(true); - this.nightCard = true; - - // Flying - this.addAbility(FlyingAbility.getInstance()); - - // Haste - this.addAbility(HasteAbility.getInstance()); - } - - private PhyrexianSkyflayer(final PhyrexianSkyflayer card) { - super(card); - } - - @Override - public PhyrexianSkyflayer copy() { - return new PhyrexianSkyflayer(this); - } -} diff --git a/Mage.Sets/src/mage/cards/r/RiphookRaider.java b/Mage.Sets/src/mage/cards/r/RiphookRaider.java deleted file mode 100644 index f423c55b5f8..00000000000 --- a/Mage.Sets/src/mage/cards/r/RiphookRaider.java +++ /dev/null @@ -1,42 +0,0 @@ -package mage.cards.r; - -import mage.MageInt; -import mage.abilities.keyword.DauntAbility; -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 RiphookRaider extends CardImpl { - - public RiphookRaider(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, ""); - - this.subtype.add(SubType.WEREWOLF); - this.power = new MageInt(6); - this.toughness = new MageInt(4); - this.color.setGreen(true); - this.nightCard = true; - - // Riphook Raider can't be blocked by creatures with power 2 or less. - this.addAbility(new DauntAbility()); - - // Nightbound - this.addAbility(new NightboundAbility()); - } - - private RiphookRaider(final RiphookRaider card) { - super(card); - } - - @Override - public RiphookRaider copy() { - return new RiphookRaider(this); - } -} diff --git a/Mage.Sets/src/mage/cards/r/RoarOfTheFifthPeople.java b/Mage.Sets/src/mage/cards/r/RoarOfTheFifthPeople.java deleted file mode 100644 index 6a4bbba19af..00000000000 --- a/Mage.Sets/src/mage/cards/r/RoarOfTheFifthPeople.java +++ /dev/null @@ -1,100 +0,0 @@ -package mage.cards.r; - -import mage.abilities.Ability; -import mage.abilities.common.SagaAbility; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.common.CreateTokenEffect; -import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; -import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; -import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; -import mage.abilities.keyword.DoubleStrikeAbility; -import mage.abilities.keyword.TrampleAbility; -import mage.abilities.mana.GreenManaAbility; -import mage.abilities.mana.RedManaAbility; -import mage.abilities.mana.WhiteManaAbility; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.SagaChapter; -import mage.constants.SubType; -import mage.filter.FilterCard; -import mage.filter.StaticFilters; -import mage.filter.common.FilterControlledPermanent; -import mage.game.permanent.token.DinosaurVanillaToken; -import mage.target.common.TargetCardInLibrary; - -import java.util.UUID; - -/** - * @author Susucr - */ -public final class RoarOfTheFifthPeople extends CardImpl { - - private static final FilterCard filterCard = new FilterCard("Dinosaur card"); - private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.DINOSAUR, "Dinosaurs you control"); - - static { - filterCard.add(SubType.DINOSAUR.getPredicate()); - } - - public RoarOfTheFifthPeople(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, ""); - - this.color.setWhite(true); - this.color.setGreen(true); - this.color.setRed(true); - this.subtype.add(SubType.SAGA); - this.nightCard = true; - - // (As this Saga enters and after your draw step, add a lore counter. Sacrifice after IV.) - SagaAbility sagaAbility = new SagaAbility(this, SagaChapter.CHAPTER_IV); - - // I -- Create two 3/3 green Dinosaur creature tokens. - sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_I, new CreateTokenEffect(new DinosaurVanillaToken(), 2)); - - // II -- Roar of the Fifth People gains "Creatures you control have '{T}: Add {R}, {G}, or {W}.'" - - // Note: splitting the mana ability in 3 makes it easier on the UI. - Ability gainedAbility = new SimpleStaticAbility(new GainAbilityControlledEffect( - new RedManaAbility(), Duration.WhileOnBattlefield, StaticFilters.FILTER_CONTROLLED_CREATURES, false - ).setText("Creatures you control have '{T}: Add {R}")); - gainedAbility.addEffect(new GainAbilityControlledEffect( - new GreenManaAbility(), Duration.WhileOnBattlefield, StaticFilters.FILTER_CONTROLLED_CREATURES, false - ).setText(", {G}")); - gainedAbility.addEffect(new GainAbilityControlledEffect( - new WhiteManaAbility(), Duration.WhileOnBattlefield, StaticFilters.FILTER_CONTROLLED_CREATURES, false - ).setText(", or {W}.'")); - - sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_II, - new GainAbilitySourceEffect(gainedAbility, Duration.WhileOnBattlefield) - .setText("{this} gains \"Creatures you control have '{T}: Add {R}, {G}, or {W}.'\"") - ); - - // III -- Search your library for a Dinosaur card, reveal it, put it into your hand, then shuffle. - TargetCardInLibrary target = new TargetCardInLibrary(filterCard); - sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new SearchLibraryPutInHandEffect(target, true)); - - // IV -- Dinosaurs you control gain double strike and trample until end of turn. - sagaAbility.addChapterEffect( - this, SagaChapter.CHAPTER_IV, - new GainAbilityControlledEffect( - DoubleStrikeAbility.getInstance(), Duration.EndOfTurn, filter - ).setText("Dinosaurs you control gain double strike"), - new GainAbilityControlledEffect( - TrampleAbility.getInstance(), Duration.EndOfTurn, filter - ).setText("and trample until end of turn") - ); - - this.addAbility(sagaAbility); - } - - private RoarOfTheFifthPeople(final RoarOfTheFifthPeople card) { - super(card); - } - - @Override - public RoarOfTheFifthPeople copy() { - return new RoarOfTheFifthPeople(this); - } -} diff --git a/Mage.Sets/src/mage/cards/s/ScroungedScythe.java b/Mage.Sets/src/mage/cards/s/ScroungedScythe.java deleted file mode 100644 index 0d3e7b0075b..00000000000 --- a/Mage.Sets/src/mage/cards/s/ScroungedScythe.java +++ /dev/null @@ -1,54 +0,0 @@ -package mage.cards.s; - -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.EquippedHasSubtypeCondition; -import mage.abilities.decorator.ConditionalContinuousEffect; -import mage.abilities.effects.common.continuous.BoostEquippedEffect; -import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; -import mage.abilities.keyword.EquipAbility; -import mage.abilities.keyword.MenaceAbility; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.AttachmentType; -import mage.constants.CardType; -import mage.constants.SubType; - -import java.util.UUID; - -/** - * @author fireshoes - */ -public final class ScroungedScythe extends CardImpl { - - private static final Condition condition = new EquippedHasSubtypeCondition(SubType.HUMAN); - - public ScroungedScythe(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, ""); - this.subtype.add(SubType.EQUIPMENT); - - this.nightCard = true; - - // Equipped creature gets +1/+1. - this.addAbility(new SimpleStaticAbility(new BoostEquippedEffect(1, 1))); - - // As long as equipped creature is a Human, it has menace. - this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( - new GainAbilityAttachedEffect(new MenaceAbility(false), AttachmentType.EQUIPMENT), - condition, "As long as equipped creature is a Human, it has menace. " + - "(It can't be blocked except by two or more creatures.)" - ))); - - // Equip {2} - this.addAbility(new EquipAbility(2, false)); - } - - private ScroungedScythe(final ScroungedScythe card) { - super(card); - } - - @Override - public ScroungedScythe copy() { - return new ScroungedScythe(this); - } -} diff --git a/Mage.Sets/src/mage/cards/u/UntamedPup.java b/Mage.Sets/src/mage/cards/u/UntamedPup.java deleted file mode 100644 index 4dbcd4007c9..00000000000 --- a/Mage.Sets/src/mage/cards/u/UntamedPup.java +++ /dev/null @@ -1,74 +0,0 @@ -package mage.cards.u; - -import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; -import mage.abilities.effects.common.counter.AddCountersTargetEffect; -import mage.abilities.keyword.NightboundAbility; -import mage.abilities.keyword.TrampleAbility; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.SubType; -import mage.counters.CounterType; -import mage.filter.FilterPermanent; -import mage.filter.predicate.Predicates; -import mage.target.common.TargetCreaturePermanent; - -import java.util.UUID; - -/** - * @author TheElk801 - */ -public final class UntamedPup extends CardImpl { - - private static final FilterPermanent filter = new FilterPermanent("Wolves and Werewolves"); - - static { - filter.add(Predicates.or( - SubType.WOLF.getPredicate(), - SubType.WEREWOLF.getPredicate() - )); - } - - public UntamedPup(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, ""); - - this.subtype.add(SubType.WEREWOLF); - this.power = new MageInt(4); - this.toughness = new MageInt(4); - this.color.setGreen(true); - this.nightCard = true; - - // Trample - this.addAbility(TrampleAbility.getInstance()); - - // Other Wolves and Werewolves you control have trample. - this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( - TrampleAbility.getInstance(), Duration.WhileOnBattlefield, filter, true - ))); - - // {3}{G}: Put a +1/+1 counter on target creature. - Ability ability = new SimpleActivatedAbility( - new AddCountersTargetEffect(CounterType.P1P1.createInstance()), new ManaCostsImpl<>("{3}{G}") - ); - ability.addTarget(new TargetCreaturePermanent()); - this.addAbility(ability); - - // Nightbound - this.addAbility(new NightboundAbility()); - } - - private UntamedPup(final UntamedPup card) { - super(card); - } - - @Override - public UntamedPup copy() { - return new UntamedPup(this); - } -} diff --git a/Mage.Sets/src/mage/cards/v/VesselOfTheAllConsuming.java b/Mage.Sets/src/mage/cards/v/VesselOfTheAllConsuming.java deleted file mode 100644 index a4ac3365a20..00000000000 --- a/Mage.Sets/src/mage/cards/v/VesselOfTheAllConsuming.java +++ /dev/null @@ -1,121 +0,0 @@ -package mage.cards.v; - -import mage.MageInt; -import mage.MageObjectReference; -import mage.abilities.Ability; -import mage.abilities.common.DealsDamageSourceTriggeredAbility; -import mage.abilities.common.DealsDamageToAPlayerTriggeredAbility; -import mage.abilities.condition.Condition; -import mage.abilities.effects.common.LoseGameTargetPlayerEffect; -import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.abilities.keyword.TrampleAbility; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.WatcherScope; -import mage.counters.CounterType; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.watchers.Watcher; - -import java.util.AbstractMap; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.UUID; - -/** - * @author TheElk801 - */ -public final class VesselOfTheAllConsuming extends CardImpl { - - public VesselOfTheAllConsuming(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, ""); - - this.subtype.add(SubType.OGRE); - this.subtype.add(SubType.SHAMAN); - this.power = new MageInt(3); - this.toughness = new MageInt(3); - this.color.setBlack(true); - this.color.setRed(true); - this.nightCard = true; - - // Trample - this.addAbility(TrampleAbility.getInstance()); - - // Whenever Vessel of the All-Consuming deals damage, put a +1/+1 counter on it. - this.addAbility(new DealsDamageSourceTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()))); - - // Whenever Vessel of the All-Consuming deals damage to a player, if it has dealt 10 or more damage to that player this turn, they lose the game. - this.addAbility(new DealsDamageToAPlayerTriggeredAbility( - new LoseGameTargetPlayerEffect().setText("they lose the game"), false, true - ).withInterveningIf(VesselOfTheAllConsumingCondition.instance)); - } - - private VesselOfTheAllConsuming(final VesselOfTheAllConsuming card) { - super(card); - } - - @Override - public VesselOfTheAllConsuming copy() { - return new VesselOfTheAllConsuming(this); - } - - public static Watcher makeWatcher() { - return new VesselOfTheAllConsumingWatcher(); - } -} - -enum VesselOfTheAllConsumingCondition implements Condition { - instance; - - @Override - public boolean apply(Game game, Ability source) { - return VesselOfTheAllConsumingWatcher.checkPermanent(game, source); - } - - @Override - public String toString() { - return "it has dealt 10 or more damage to that player this turn"; - } -} - -class VesselOfTheAllConsumingWatcher extends Watcher { - - private final Map, Integer> morMap = new HashMap<>(); - - VesselOfTheAllConsumingWatcher() { - super(WatcherScope.GAME); - } - - @Override - public void watch(GameEvent event, Game game) { - if (event.getType() != GameEvent.EventType.DAMAGED_PLAYER) { - return; - } - Permanent permanent = game.getPermanent(event.getSourceId()); - if (permanent != null) { - int damage = event.getAmount(); - morMap.compute(new AbstractMap.SimpleImmutableEntry(new MageObjectReference(permanent, game), event.getTargetId()), - (u, i) -> i == null ? damage : Integer.sum(i, damage)); - } - } - - @Override - public void reset() { - super.reset(); - morMap.clear(); - } - - static boolean checkPermanent(Game game, Ability source) { - Map, Integer> morMap = game.getState() - .getWatcher(VesselOfTheAllConsumingWatcher.class) - .morMap; - Entry key = new AbstractMap.SimpleImmutableEntry( - new MageObjectReference(game.getPermanent(source.getSourceId()), game), - source.getEffects().get(0).getTargetPointer().getFirst(game, source)); - return morMap.getOrDefault(key, 0) >= 10; - } -} diff --git a/Mage.Sets/src/mage/cards/w/WestvaleCultLeader.java b/Mage.Sets/src/mage/cards/w/WestvaleCultLeader.java deleted file mode 100644 index 2cdb7950a39..00000000000 --- a/Mage.Sets/src/mage/cards/w/WestvaleCultLeader.java +++ /dev/null @@ -1,49 +0,0 @@ -package mage.cards.w; - -import mage.MageInt; -import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.dynamicvalue.common.CreaturesYouControlCount; -import mage.abilities.effects.common.CreateTokenEffect; -import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect; -import mage.abilities.hint.common.CreaturesYouControlHint; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.*; -import mage.game.permanent.token.HumanClericToken; - -import java.util.UUID; - -/** - * @author fireshoes - */ -public final class WestvaleCultLeader extends CardImpl { - - public WestvaleCultLeader(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, ""); - this.subtype.add(SubType.HUMAN); - this.subtype.add(SubType.CLERIC); - this.power = new MageInt(0); - this.toughness = new MageInt(0); - this.color.setWhite(true); - - // this card is the second face of double-faced card - this.nightCard = true; - - // Westvale Cult Leader's power and toughness are each equal to the number of creatures you control. - this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetBasePowerToughnessSourceEffect(CreaturesYouControlCount.PLURAL)) - .addHint(CreaturesYouControlHint.instance)); - - // At the beginning of your end step, create a 1/1 white and black Human Cleric creature token. - this.addAbility(new BeginningOfEndStepTriggeredAbility(new CreateTokenEffect(new HumanClericToken()))); - } - - private WestvaleCultLeader(final WestvaleCultLeader card) { - super(card); - } - - @Override - public WestvaleCultLeader copy() { - return new WestvaleCultLeader(this); - } -} diff --git a/Mage.Sets/src/mage/cards/w/WildsongHowler.java b/Mage.Sets/src/mage/cards/w/WildsongHowler.java deleted file mode 100644 index dad0a4f2a96..00000000000 --- a/Mage.Sets/src/mage/cards/w/WildsongHowler.java +++ /dev/null @@ -1,49 +0,0 @@ -package mage.cards.w; - -import mage.MageInt; -import mage.abilities.common.TransformsOrEntersTriggeredAbility; -import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; -import mage.abilities.keyword.NightboundAbility; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.PutCards; -import mage.constants.SubType; -import mage.filter.StaticFilters; - -import java.util.UUID; - -/** - * @author TheElk801 - */ -public final class WildsongHowler extends CardImpl { - - public WildsongHowler(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, ""); - - this.subtype.add(SubType.WEREWOLF); - this.power = new MageInt(4); - this.toughness = new MageInt(4); - this.color.setGreen(true); - this.nightCard = true; - - // Whenever this creature enters the battlefield or transforms into Wildsong Howler, look at the top six cards of your library. - // You may reveal a 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 TransformsOrEntersTriggeredAbility( - new LookLibraryAndPickControllerEffect(6, 1, StaticFilters.FILTER_CARD_CREATURE_A, PutCards.HAND, PutCards.BOTTOM_RANDOM), - false)); - - // Nightbound - this.addAbility(new NightboundAbility()); - } - - private WildsongHowler(final WildsongHowler card) { - super(card); - } - - @Override - public WildsongHowler copy() { - return new WildsongHowler(this); - } -} diff --git a/Mage.Sets/src/mage/cards/w/WingedTempleOfOrazca.java b/Mage.Sets/src/mage/cards/w/WingedTempleOfOrazca.java deleted file mode 100644 index 8b286c53754..00000000000 --- a/Mage.Sets/src/mage/cards/w/WingedTempleOfOrazca.java +++ /dev/null @@ -1,88 +0,0 @@ -package mage.cards.w; - -import mage.abilities.Ability; -import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.ContinuousEffect; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.continuous.BoostTargetEffect; -import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; -import mage.abilities.keyword.FlyingAbility; -import mage.abilities.mana.AnyColorManaAbility; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.*; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.target.common.TargetControlledCreaturePermanent; -import mage.target.targetpointer.FixedTarget; - -import java.util.UUID; - -/** - * - * @author LevelX2 - */ -public final class WingedTempleOfOrazca extends CardImpl { - - public WingedTempleOfOrazca(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); - - this.supertype.add(SuperType.LEGENDARY); - - this.nightCard = true; - - // (Transforms from Hadana's Climb.) - - // {T}: Add one mana of any color. - this.addAbility(new AnyColorManaAbility()); - - // {1}{G}{U}, {T}: Target creature you control gains flying and gets +X/+X until end of turn, where X is its power. - Ability ability = new SimpleActivatedAbility(new WingedTempleOfOrazcaEffect(), new ManaCostsImpl<>("{1}{G}{U}")); - ability.addCost(new TapSourceCost()); - ability.addTarget(new TargetControlledCreaturePermanent()); - this.addAbility(ability); - } - - private WingedTempleOfOrazca(final WingedTempleOfOrazca card) { - super(card); - } - - @Override - public WingedTempleOfOrazca copy() { - return new WingedTempleOfOrazca(this); - } -} - -class WingedTempleOfOrazcaEffect extends OneShotEffect { - - WingedTempleOfOrazcaEffect() { - super(Outcome.Benefit); - this.staticText = "target creature you control gains flying and gets +X/+X until end of turn, where X is its power"; - } - - private WingedTempleOfOrazcaEffect(final WingedTempleOfOrazcaEffect effect) { - super(effect); - } - - @Override - public WingedTempleOfOrazcaEffect copy() { - return new WingedTempleOfOrazcaEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent creature = game.getPermanent(getTargetPointer().getFirst(game, source)); - if (creature != null && creature.isCreature(game)) { - int pow = creature.getPower().getValue(); - ContinuousEffect effect = new BoostTargetEffect(pow, pow, Duration.EndOfTurn); - effect.setTargetPointer(new FixedTarget(creature, game)); - game.addEffect(effect, source); - effect = new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn); - effect.setTargetPointer(new FixedTarget(creature, game)); - game.addEffect(effect, source); - } - return true; - } -} diff --git a/Mage.Sets/src/mage/sets/DarkAscension.java b/Mage.Sets/src/mage/sets/DarkAscension.java index 0514b53479c..695dec3f829 100644 --- a/Mage.Sets/src/mage/sets/DarkAscension.java +++ b/Mage.Sets/src/mage/sets/DarkAscension.java @@ -119,7 +119,6 @@ public final class DarkAscension extends ExpansionSet { cards.add(new SetCardInfo("Helvault", 151, Rarity.MYTHIC, mage.cards.h.Helvault.class)); cards.add(new SetCardInfo("Highborn Ghoul", 68, Rarity.COMMON, mage.cards.h.HighbornGhoul.class)); cards.add(new SetCardInfo("Hinterland Hermit", 94, Rarity.COMMON, mage.cards.h.HinterlandHermit.class)); - cards.add(new SetCardInfo("Hinterland Scourge", 94, Rarity.COMMON, mage.cards.h.HinterlandScourge.class)); cards.add(new SetCardInfo("Hollowhenge Beast", 118, Rarity.COMMON, mage.cards.h.HollowhengeBeast.class)); cards.add(new SetCardInfo("Hollowhenge Spirit", 10, Rarity.UNCOMMON, mage.cards.h.HollowhengeSpirit.class)); cards.add(new SetCardInfo("Hunger of the Howlpack", 119, Rarity.COMMON, mage.cards.h.HungerOfTheHowlpack.class)); diff --git a/Mage.Sets/src/mage/sets/Innistrad.java b/Mage.Sets/src/mage/sets/Innistrad.java index da91f42dbd5..0db4878763a 100644 --- a/Mage.Sets/src/mage/sets/Innistrad.java +++ b/Mage.Sets/src/mage/sets/Innistrad.java @@ -48,7 +48,6 @@ public final class Innistrad extends ExpansionSet { cards.add(new SetCardInfo("Avacynian Priest", 4, Rarity.COMMON, mage.cards.a.AvacynianPriest.class)); cards.add(new SetCardInfo("Back from the Brink", 44, Rarity.RARE, mage.cards.b.BackFromTheBrink.class)); cards.add(new SetCardInfo("Balefire Dragon", 129, Rarity.MYTHIC, mage.cards.b.BalefireDragon.class)); - cards.add(new SetCardInfo("Bane of Hanweir", 145, Rarity.UNCOMMON, mage.cards.b.BaneOfHanweir.class)); cards.add(new SetCardInfo("Battleground Geist", 45, Rarity.UNCOMMON, mage.cards.b.BattlegroundGeist.class)); cards.add(new SetCardInfo("Bitterheart Witch", 88, Rarity.UNCOMMON, mage.cards.b.BitterheartWitch.class)); cards.add(new SetCardInfo("Blasphemous Act", 130, Rarity.RARE, mage.cards.b.BlasphemousAct.class)); diff --git a/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java b/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java index 3b20bb905a6..ff32e1a9792 100644 --- a/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java +++ b/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java @@ -235,9 +235,6 @@ public final class InnistradCrimsonVow extends ExpansionSet { cards.add(new SetCardInfo("Henrika Domnathi", 119, Rarity.MYTHIC, mage.cards.h.HenrikaDomnathi.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Henrika Domnathi", 293, Rarity.MYTHIC, mage.cards.h.HenrikaDomnathi.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Henrika Domnathi", 335, Rarity.MYTHIC, mage.cards.h.HenrikaDomnathi.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Henrika, Infernal Seer", 119, Rarity.MYTHIC, mage.cards.h.HenrikaInfernalSeer.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Henrika, Infernal Seer", 293, Rarity.MYTHIC, mage.cards.h.HenrikaInfernalSeer.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Henrika, Infernal Seer", 335, Rarity.MYTHIC, mage.cards.h.HenrikaInfernalSeer.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Hero's Downfall", 120, Rarity.UNCOMMON, mage.cards.h.HerosDownfall.class)); cards.add(new SetCardInfo("Heron of Hope", 18, Rarity.COMMON, mage.cards.h.HeronOfHope.class)); cards.add(new SetCardInfo("Heron-Blessed Geist", 19, Rarity.COMMON, mage.cards.h.HeronBlessedGeist.class)); @@ -372,7 +369,6 @@ public final class InnistradCrimsonVow extends ExpansionSet { cards.add(new SetCardInfo("Restless Bloodseeker", 128, Rarity.UNCOMMON, mage.cards.r.RestlessBloodseeker.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Restless Bloodseeker", 295, Rarity.UNCOMMON, mage.cards.r.RestlessBloodseeker.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Retrieve", 215, Rarity.UNCOMMON, mage.cards.r.Retrieve.class)); - cards.add(new SetCardInfo("Riphook Raider", 203, Rarity.COMMON, mage.cards.r.RiphookRaider.class)); cards.add(new SetCardInfo("Rot-Tide Gargantua", 129, Rarity.COMMON, mage.cards.r.RotTideGargantua.class)); cards.add(new SetCardInfo("Runebound Wolf", 176, Rarity.UNCOMMON, mage.cards.r.RuneboundWolf.class)); cards.add(new SetCardInfo("Runo Stromkirk", 246, Rarity.RARE, mage.cards.r.RunoStromkirk.class, NON_FULL_USE_VARIOUS)); @@ -488,8 +484,6 @@ public final class InnistradCrimsonVow extends ExpansionSet { cards.add(new SetCardInfo("Welcoming Vampire", 287, Rarity.RARE, mage.cards.w.WelcomingVampire.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Welcoming Vampire", 46, Rarity.RARE, mage.cards.w.WelcomingVampire.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Whispering Wizard", 88, Rarity.UNCOMMON, mage.cards.w.WhisperingWizard.class)); - cards.add(new SetCardInfo("Wildsong Howler", 205, Rarity.RARE, mage.cards.w.WildsongHowler.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Wildsong Howler", 392, Rarity.RARE, mage.cards.w.WildsongHowler.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Winged Portent", 365, Rarity.RARE, mage.cards.w.WingedPortent.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Winged Portent", 89, Rarity.RARE, mage.cards.w.WingedPortent.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Witch's Web", 227, Rarity.COMMON, mage.cards.w.WitchsWeb.class)); diff --git a/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java b/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java index a07389c7fc3..d8340b7fea4 100644 --- a/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java +++ b/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java @@ -144,7 +144,6 @@ public final class InnistradDoubleFeature extends ExpansionSet { cards.add(new SetCardInfo("Cradle of Safety", 321, Rarity.COMMON, mage.cards.c.CradleOfSafety.class)); cards.add(new SetCardInfo("Crawl from the Cellar", 93, Rarity.COMMON, mage.cards.c.CrawlFromTheCellar.class)); cards.add(new SetCardInfo("Crawling Infestation", 460, Rarity.UNCOMMON, mage.cards.c.CrawlingInfestation.class)); - cards.add(new SetCardInfo("Creeping Inn", 264, Rarity.MYTHIC, mage.cards.c.CreepingInn.class)); cards.add(new SetCardInfo("Creepy Puppeteer", 418, Rarity.RARE, mage.cards.c.CreepyPuppeteer.class)); cards.add(new SetCardInfo("Croaking Counterpart", 215, Rarity.RARE, mage.cards.c.CroakingCounterpart.class)); cards.add(new SetCardInfo("Crossroads Candleguide", 253, Rarity.COMMON, mage.cards.c.CrossroadsCandleguide.class)); @@ -275,7 +274,6 @@ public final class InnistradDoubleFeature extends ExpansionSet { cards.add(new SetCardInfo("Hallowed Haunting", 284, Rarity.MYTHIC, mage.cards.h.HallowedHaunting.class)); cards.add(new SetCardInfo("Hallowed Respite", 227, Rarity.RARE, mage.cards.h.HallowedRespite.class)); cards.add(new SetCardInfo("Hamlet Vanguard", 468, Rarity.RARE, mage.cards.h.HamletVanguard.class)); - cards.add(new SetCardInfo("Harvesttide Assailant", 143, Rarity.COMMON, mage.cards.h.HarvesttideAssailant.class)); cards.add(new SetCardInfo("Harvesttide Infiltrator", 143, Rarity.COMMON, mage.cards.h.HarvesttideInfiltrator.class)); cards.add(new SetCardInfo("Harvesttide Sentry", 186, Rarity.COMMON, mage.cards.h.HarvesttideSentry.class)); cards.add(new SetCardInfo("Hauken's Insight", 332, Rarity.MYTHIC, mage.cards.h.HaukensInsight.class)); @@ -284,7 +282,6 @@ public final class InnistradDoubleFeature extends ExpansionSet { cards.add(new SetCardInfo("Hedgewitch's Mask", 23, Rarity.COMMON, mage.cards.h.HedgewitchsMask.class)); cards.add(new SetCardInfo("Heirloom Mirror", 105, Rarity.UNCOMMON, mage.cards.h.HeirloomMirror.class)); cards.add(new SetCardInfo("Henrika Domnathi", 386, Rarity.MYTHIC, mage.cards.h.HenrikaDomnathi.class)); - cards.add(new SetCardInfo("Henrika, Infernal Seer", 386, Rarity.MYTHIC, mage.cards.h.HenrikaInfernalSeer.class)); cards.add(new SetCardInfo("Hero's Downfall", 387, Rarity.UNCOMMON, mage.cards.h.HerosDownfall.class)); cards.add(new SetCardInfo("Heron of Hope", 285, Rarity.COMMON, mage.cards.h.HeronOfHope.class)); cards.add(new SetCardInfo("Heron-Blessed Geist", 286, Rarity.COMMON, mage.cards.h.HeronBlessedGeist.class)); @@ -309,7 +306,6 @@ public final class InnistradDoubleFeature extends ExpansionSet { cards.add(new SetCardInfo("Infernal Grasp", 107, Rarity.UNCOMMON, mage.cards.i.InfernalGrasp.class)); cards.add(new SetCardInfo("Infestation Expert", 473, Rarity.UNCOMMON, mage.cards.i.InfestationExpert.class)); cards.add(new SetCardInfo("Infested Werewolf", 473, Rarity.UNCOMMON, mage.cards.i.InfestedWerewolf.class)); - cards.add(new SetCardInfo("Inherited Fiend", 105, Rarity.UNCOMMON, mage.cards.i.InheritedFiend.class)); cards.add(new SetCardInfo("Innocent Traveler", 388, Rarity.UNCOMMON, mage.cards.i.InnocentTraveler.class)); cards.add(new SetCardInfo("Inspired Idea", 331, Rarity.RARE, mage.cards.i.InspiredIdea.class)); cards.add(new SetCardInfo("Into the Night", 430, Rarity.UNCOMMON, mage.cards.i.IntoTheNight.class)); @@ -447,7 +443,6 @@ public final class InnistradDoubleFeature extends ExpansionSet { cards.add(new SetCardInfo("Retrieve", 482, Rarity.UNCOMMON, mage.cards.r.Retrieve.class)); cards.add(new SetCardInfo("Return to Nature", 195, Rarity.COMMON, mage.cards.r.ReturnToNature.class)); cards.add(new SetCardInfo("Revenge of the Drowned", 72, Rarity.COMMON, mage.cards.r.RevengeOfTheDrowned.class)); - cards.add(new SetCardInfo("Riphook Raider", 470, Rarity.COMMON, mage.cards.r.RiphookRaider.class)); cards.add(new SetCardInfo("Rise of the Ants", 196, Rarity.UNCOMMON, mage.cards.r.RiseOfTheAnts.class)); cards.add(new SetCardInfo("Rite of Harmony", 236, Rarity.RARE, mage.cards.r.RiteOfHarmony.class)); cards.add(new SetCardInfo("Rite of Oblivion", 237, Rarity.UNCOMMON, mage.cards.r.RiteOfOblivion.class)); @@ -570,7 +565,6 @@ public final class InnistradDoubleFeature extends ExpansionSet { cards.add(new SetCardInfo("Unnatural Growth", 206, Rarity.RARE, mage.cards.u.UnnaturalGrowth.class)); cards.add(new SetCardInfo("Unnatural Moonrise", 247, Rarity.UNCOMMON, mage.cards.u.UnnaturalMoonrise.class)); cards.add(new SetCardInfo("Unruly Mob", 40, Rarity.COMMON, mage.cards.u.UnrulyMob.class)); - cards.add(new SetCardInfo("Untamed Pup", 187, Rarity.UNCOMMON, mage.cards.u.UntamedPup.class)); cards.add(new SetCardInfo("Vadrik, Astral Archmage", 248, Rarity.RARE, mage.cards.v.VadrikAstralArchmage.class)); cards.add(new SetCardInfo("Valorous Stance", 309, Rarity.UNCOMMON, mage.cards.v.ValorousStance.class)); cards.add(new SetCardInfo("Vampire Interloper", 125, Rarity.COMMON, mage.cards.v.VampireInterloper.class)); @@ -606,7 +600,6 @@ public final class InnistradDoubleFeature extends ExpansionSet { cards.add(new SetCardInfo("Wedding Security", 405, Rarity.UNCOMMON, mage.cards.w.WeddingSecurity.class)); cards.add(new SetCardInfo("Welcoming Vampire", 313, Rarity.RARE, mage.cards.w.WelcomingVampire.class)); cards.add(new SetCardInfo("Whispering Wizard", 355, Rarity.UNCOMMON, mage.cards.w.WhisperingWizard.class)); - cards.add(new SetCardInfo("Wildsong Howler", 472, Rarity.RARE, mage.cards.w.WildsongHowler.class)); cards.add(new SetCardInfo("Willow Geist", 207, Rarity.RARE, mage.cards.w.WillowGeist.class)); cards.add(new SetCardInfo("Winged Portent", 356, Rarity.RARE, mage.cards.w.WingedPortent.class)); cards.add(new SetCardInfo("Winterthorn Blessing", 251, Rarity.UNCOMMON, mage.cards.w.WinterthornBlessing.class)); diff --git a/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java b/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java index 5b0fe66be0b..b29263fa60c 100644 --- a/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java +++ b/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java @@ -116,8 +116,6 @@ public final class InnistradMidnightHunt extends ExpansionSet { cards.add(new SetCardInfo("Covert Cutpurse", 92, Rarity.UNCOMMON, mage.cards.c.CovertCutpurse.class)); cards.add(new SetCardInfo("Covetous Castaway", 45, Rarity.UNCOMMON, mage.cards.c.CovetousCastaway.class)); cards.add(new SetCardInfo("Crawl from the Cellar", 93, Rarity.COMMON, mage.cards.c.CrawlFromTheCellar.class)); - cards.add(new SetCardInfo("Creeping Inn", 264, Rarity.MYTHIC, mage.cards.c.CreepingInn.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Creeping Inn", 379, Rarity.MYTHIC, mage.cards.c.CreepingInn.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Croaking Counterpart", 215, Rarity.RARE, mage.cards.c.CroakingCounterpart.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Croaking Counterpart", 369, Rarity.RARE, mage.cards.c.CroakingCounterpart.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Crossroads Candleguide", 253, Rarity.COMMON, mage.cards.c.CrossroadsCandleguide.class)); @@ -213,8 +211,6 @@ public final class InnistradMidnightHunt extends ExpansionSet { cards.add(new SetCardInfo("Grizzly Ghoul", 226, Rarity.UNCOMMON, mage.cards.g.GrizzlyGhoul.class)); cards.add(new SetCardInfo("Hallowed Respite", 227, Rarity.RARE, mage.cards.h.HallowedRespite.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Hallowed Respite", 373, Rarity.RARE, mage.cards.h.HallowedRespite.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Harvesttide Assailant", 143, Rarity.COMMON, mage.cards.h.HarvesttideAssailant.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Harvesttide Assailant", 293, Rarity.COMMON, mage.cards.h.HarvesttideAssailant.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Harvesttide Infiltrator", 143, Rarity.COMMON, mage.cards.h.HarvesttideInfiltrator.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Harvesttide Infiltrator", 293, Rarity.COMMON, mage.cards.h.HarvesttideInfiltrator.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Harvesttide Sentry", 186, Rarity.COMMON, mage.cards.h.HarvesttideSentry.class)); @@ -233,7 +229,6 @@ public final class InnistradMidnightHunt extends ExpansionSet { cards.add(new SetCardInfo("Immolation", 144, Rarity.COMMON, mage.cards.i.Immolation.class)); cards.add(new SetCardInfo("Infernal Grasp", 107, Rarity.UNCOMMON, mage.cards.i.InfernalGrasp.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Infernal Grasp", 389, Rarity.UNCOMMON, mage.cards.i.InfernalGrasp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Inherited Fiend", 105, Rarity.UNCOMMON, mage.cards.i.InheritedFiend.class)); cards.add(new SetCardInfo("Intrepid Adversary", 25, Rarity.MYTHIC, mage.cards.i.IntrepidAdversary.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Intrepid Adversary", 329, Rarity.MYTHIC, mage.cards.i.IntrepidAdversary.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Island", 270, Rarity.LAND, mage.cards.basiclands.Island.class, FULL_ART_BFZ_VARIOUS)); @@ -452,8 +447,6 @@ public final class InnistradMidnightHunt extends ExpansionSet { cards.add(new SetCardInfo("Unnatural Growth", 365, Rarity.RARE, mage.cards.u.UnnaturalGrowth.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Unnatural Moonrise", 247, Rarity.UNCOMMON, mage.cards.u.UnnaturalMoonrise.class)); cards.add(new SetCardInfo("Unruly Mob", 40, Rarity.COMMON, mage.cards.u.UnrulyMob.class)); - cards.add(new SetCardInfo("Untamed Pup", 187, Rarity.UNCOMMON, mage.cards.u.UntamedPup.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Untamed Pup", 302, Rarity.UNCOMMON, mage.cards.u.UntamedPup.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Vadrik, Astral Archmage", 248, Rarity.RARE, mage.cards.v.VadrikAstralArchmage.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Vadrik, Astral Archmage", 325, Rarity.RARE, mage.cards.v.VadrikAstralArchmage.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Vampire Interloper", 125, Rarity.COMMON, mage.cards.v.VampireInterloper.class)); diff --git a/Mage.Sets/src/mage/sets/InnistradRemastered.java b/Mage.Sets/src/mage/sets/InnistradRemastered.java index b7e16be6fd4..d9fbc5da324 100644 --- a/Mage.Sets/src/mage/sets/InnistradRemastered.java +++ b/Mage.Sets/src/mage/sets/InnistradRemastered.java @@ -63,7 +63,6 @@ public class InnistradRemastered extends ExpansionSet { cards.add(new SetCardInfo("Awoken Horror", 460, Rarity.RARE, mage.cards.a.AwokenHorror.class, RETRO_ART_USE_VARIOUS)); cards.add(new SetCardInfo("Awoken Horror", 91, Rarity.RARE, mage.cards.a.AwokenHorror.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Balefire Dragon", 479, Rarity.MYTHIC, mage.cards.b.BalefireDragon.class, RETRO_ART)); - cards.add(new SetCardInfo("Bane of Hanweir", 158, Rarity.COMMON, mage.cards.b.BaneOfHanweir.class)); cards.add(new SetCardInfo("Battleground Geist", 53, Rarity.COMMON, mage.cards.b.BattlegroundGeist.class)); cards.add(new SetCardInfo("Bedlam Reveler", 142, Rarity.RARE, mage.cards.b.BedlamReveler.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Bedlam Reveler", 312, Rarity.RARE, mage.cards.b.BedlamReveler.class, NON_FULL_USE_VARIOUS)); @@ -404,7 +403,6 @@ public class InnistradRemastered extends ExpansionSet { cards.add(new SetCardInfo("Savage Alliance", 169, Rarity.UNCOMMON, mage.cards.s.SavageAlliance.class)); cards.add(new SetCardInfo("Scorned Villager", 212, Rarity.COMMON, mage.cards.s.ScornedVillager.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Scorned Villager", 468, Rarity.COMMON, mage.cards.s.ScornedVillager.class, RETRO_ART_USE_VARIOUS)); - cards.add(new SetCardInfo("Scrounged Scythe", 265, Rarity.COMMON, mage.cards.s.ScroungedScythe.class)); cards.add(new SetCardInfo("Second Harvest", 213, Rarity.RARE, mage.cards.s.SecondHarvest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Second Harvest", 417, Rarity.RARE, mage.cards.s.SecondHarvest.class, RETRO_ART_USE_VARIOUS)); cards.add(new SetCardInfo("Seize the Storm", 170, Rarity.COMMON, mage.cards.s.SeizeTheStorm.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage.Sets/src/mage/sets/JumpstartHistoricHorizons.java b/Mage.Sets/src/mage/sets/JumpstartHistoricHorizons.java index b2c2b9b6e99..08b6d104555 100644 --- a/Mage.Sets/src/mage/sets/JumpstartHistoricHorizons.java +++ b/Mage.Sets/src/mage/sets/JumpstartHistoricHorizons.java @@ -170,7 +170,6 @@ public final class JumpstartHistoricHorizons extends ExpansionSet { cards.add(new SetCardInfo("Haunted Dead", 336, Rarity.UNCOMMON, mage.cards.h.HauntedDead.class)); cards.add(new SetCardInfo("Healer's Flock", 91, Rarity.UNCOMMON, mage.cards.h.HealersFlock.class)); cards.add(new SetCardInfo("Heir of Falkenrath", 338, Rarity.UNCOMMON, mage.cards.h.HeirOfFalkenrath.class)); - cards.add(new SetCardInfo("Heir to the Night", 338, Rarity.UNCOMMON, mage.cards.h.HeirToTheNight.class)); cards.add(new SetCardInfo("Hell Mongrel", 339, Rarity.COMMON, mage.cards.h.HellMongrel.class)); cards.add(new SetCardInfo("Herd Baloth", 584, Rarity.UNCOMMON, mage.cards.h.HerdBaloth.class)); cards.add(new SetCardInfo("Hive Stirrings", 94, Rarity.COMMON, mage.cards.h.HiveStirrings.class)); @@ -378,7 +377,6 @@ public final class JumpstartHistoricHorizons extends ExpansionSet { cards.add(new SetCardInfo("Warteye Witch", 404, Rarity.COMMON, mage.cards.w.WarteyeWitch.class)); cards.add(new SetCardInfo("Wavesifter", 726, Rarity.COMMON, mage.cards.w.Wavesifter.class)); cards.add(new SetCardInfo("Webweaver Changeling", 666, Rarity.UNCOMMON, mage.cards.w.WebweaverChangeling.class)); - cards.add(new SetCardInfo("Westvale Cult Leader", 90, Rarity.RARE, mage.cards.w.WestvaleCultLeader.class)); cards.add(new SetCardInfo("Windcaller Aven", 275, Rarity.COMMON, mage.cards.w.WindcallerAven.class)); cards.add(new SetCardInfo("Winding Way", 670, Rarity.COMMON, mage.cards.w.WindingWay.class)); cards.add(new SetCardInfo("Winged Shepherd", 158, Rarity.COMMON, mage.cards.w.WingedShepherd.class)); diff --git a/Mage.Sets/src/mage/sets/KamigawaNeonDynasty.java b/Mage.Sets/src/mage/sets/KamigawaNeonDynasty.java index a60fac005fd..ef391d49bb0 100644 --- a/Mage.Sets/src/mage/sets/KamigawaNeonDynasty.java +++ b/Mage.Sets/src/mage/sets/KamigawaNeonDynasty.java @@ -571,9 +571,6 @@ public final class KamigawaNeonDynasty extends ExpansionSet { cards.add(new SetCardInfo("Upriser Renegade", 170, Rarity.UNCOMMON, mage.cards.u.UpriserRenegade.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Upriser Renegade", 324, Rarity.UNCOMMON, mage.cards.u.UpriserRenegade.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Vector Glider", 66, Rarity.COMMON, mage.cards.v.VectorGlider.class)); - cards.add(new SetCardInfo("Vessel of the All-Consuming", 221, Rarity.MYTHIC, mage.cards.v.VesselOfTheAllConsuming.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Vessel of the All-Consuming", 361, Rarity.MYTHIC, mage.cards.v.VesselOfTheAllConsuming.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Vessel of the All-Consuming", 486, Rarity.MYTHIC, mage.cards.v.VesselOfTheAllConsuming.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Virus Beetle", 128, Rarity.COMMON, mage.cards.v.VirusBeetle.class)); cards.add(new SetCardInfo("Voltage Surge", 171, Rarity.COMMON, mage.cards.v.VoltageSurge.class)); cards.add(new SetCardInfo("Walking Skyscraper", 263, Rarity.UNCOMMON, mage.cards.w.WalkingSkyscraper.class)); diff --git a/Mage.Sets/src/mage/sets/MagicOnlinePromos.java b/Mage.Sets/src/mage/sets/MagicOnlinePromos.java index 88772257d8b..75665dc54d0 100644 --- a/Mage.Sets/src/mage/sets/MagicOnlinePromos.java +++ b/Mage.Sets/src/mage/sets/MagicOnlinePromos.java @@ -534,7 +534,6 @@ public class MagicOnlinePromos extends ExpansionSet { cards.add(new SetCardInfo("Crash the Party", 99839, Rarity.RARE, mage.cards.c.CrashTheParty.class)); cards.add(new SetCardInfo("Crawling Barrens", 83732, Rarity.RARE, mage.cards.c.CrawlingBarrens.class)); cards.add(new SetCardInfo("Creative Technique", 90122, Rarity.RARE, mage.cards.c.CreativeTechnique.class)); - cards.add(new SetCardInfo("Creeping Inn", 94088, Rarity.MYTHIC, mage.cards.c.CreepingInn.class)); cards.add(new SetCardInfo("Creeping Mold", 32525, Rarity.UNCOMMON, mage.cards.c.CreepingMold.class, RETRO_ART)); cards.add(new SetCardInfo("Creepy Puppeteer", 95365, Rarity.RARE, mage.cards.c.CreepyPuppeteer.class)); cards.add(new SetCardInfo("Crippling Fear", 88286, Rarity.RARE, mage.cards.c.CripplingFear.class)); @@ -2978,7 +2977,6 @@ public class MagicOnlinePromos extends ExpansionSet { cards.add(new SetCardInfo("Verazol, the Split Current", 83820, Rarity.RARE, mage.cards.v.VerazolTheSplitCurrent.class)); cards.add(new SetCardInfo("Verdant Catacombs", 91403, Rarity.RARE, mage.cards.v.VerdantCatacombs.class)); cards.add(new SetCardInfo("Verdant Mastery", 90138, Rarity.RARE, mage.cards.v.VerdantMastery.class)); - cards.add(new SetCardInfo("Vessel of the All-Consuming", 98105, Rarity.MYTHIC, mage.cards.v.VesselOfTheAllConsuming.class)); cards.add(new SetCardInfo("Vesuvan Duplimancy", 103402, Rarity.MYTHIC, mage.cards.v.VesuvanDuplimancy.class)); cards.add(new SetCardInfo("Vexing Shusher", 32533, Rarity.RARE, mage.cards.v.VexingShusher.class)); cards.add(new SetCardInfo("Veyran, Voice of Duality", 90282, Rarity.MYTHIC, mage.cards.v.VeyranVoiceOfDuality.class)); @@ -3061,7 +3059,6 @@ public class MagicOnlinePromos extends ExpansionSet { cards.add(new SetCardInfo("Wild-Magic Sorcerer", 92752, Rarity.RARE, mage.cards.w.WildMagicSorcerer.class)); cards.add(new SetCardInfo("Wildcall", 55749, Rarity.RARE, mage.cards.w.Wildcall.class)); cards.add(new SetCardInfo("Wildfire Eternal", 64989, Rarity.RARE, mage.cards.w.WildfireEternal.class)); - cards.add(new SetCardInfo("Wildsong Howler", 95425, Rarity.RARE, mage.cards.w.WildsongHowler.class)); cards.add(new SetCardInfo("Willbender", 36258, Rarity.UNCOMMON, mage.cards.w.Willbender.class)); cards.add(new SetCardInfo("Willow Geist", 94024, Rarity.RARE, mage.cards.w.WillowGeist.class)); cards.add(new SetCardInfo("Willowdusk, Essence Seer", 90288, Rarity.MYTHIC, mage.cards.w.WillowduskEssenceSeer.class)); diff --git a/Mage.Sets/src/mage/sets/MarchOfTheMachine.java b/Mage.Sets/src/mage/sets/MarchOfTheMachine.java index da0138bcee6..af91b11fb6b 100644 --- a/Mage.Sets/src/mage/sets/MarchOfTheMachine.java +++ b/Mage.Sets/src/mage/sets/MarchOfTheMachine.java @@ -195,8 +195,6 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Harried Artisan", 143, Rarity.UNCOMMON, mage.cards.h.HarriedArtisan.class)); cards.add(new SetCardInfo("Heliod, the Radiant Dawn", 17, Rarity.RARE, mage.cards.h.HeliodTheRadiantDawn.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Heliod, the Radiant Dawn", 293, Rarity.RARE, mage.cards.h.HeliodTheRadiantDawn.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Heliod, the Warped Eclipse", 17, Rarity.RARE, mage.cards.h.HeliodTheWarpedEclipse.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Heliod, the Warped Eclipse", 293, Rarity.RARE, mage.cards.h.HeliodTheWarpedEclipse.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Herbology Instructor", 189, Rarity.UNCOMMON, mage.cards.h.HerbologyInstructor.class)); cards.add(new SetCardInfo("Hideous Fleshwheeler", 119, Rarity.UNCOMMON, mage.cards.h.HideousFleshwheeler.class)); cards.add(new SetCardInfo("Hidetsugu and Kairi", 228, Rarity.RARE, mage.cards.h.HidetsuguAndKairi.class, NON_FULL_USE_VARIOUS)); @@ -280,7 +278,6 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Leyline Surge", 193, Rarity.MYTHIC, mage.cards.l.LeylineSurge.class)); cards.add(new SetCardInfo("Lightshield Array", 22, Rarity.RARE, mage.cards.l.LightshieldArray.class)); cards.add(new SetCardInfo("Lithomantic Barrage", 152, Rarity.UNCOMMON, mage.cards.l.LithomanticBarrage.class)); - cards.add(new SetCardInfo("Malady Invoker", 189, Rarity.UNCOMMON, mage.cards.m.MaladyInvoker.class)); cards.add(new SetCardInfo("Marauding Dreadship", 153, Rarity.COMMON, mage.cards.m.MaraudingDreadship.class)); cards.add(new SetCardInfo("Marchesa, Resolute Monarch", 114, Rarity.RARE, mage.cards.m.MarchesaResoluteMonarch.class)); cards.add(new SetCardInfo("Marshal of Zhalfir", 246, Rarity.UNCOMMON, mage.cards.m.MarshalOfZhalfir.class)); @@ -323,7 +320,6 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Phyrexian Censor", 31, Rarity.UNCOMMON, mage.cards.p.PhyrexianCensor.class)); cards.add(new SetCardInfo("Phyrexian Gargantua", 121, Rarity.UNCOMMON, mage.cards.p.PhyrexianGargantua.class)); cards.add(new SetCardInfo("Phyrexian Pegasus", 324, Rarity.COMMON, mage.cards.p.PhyrexianPegasus.class)); - cards.add(new SetCardInfo("Phyrexian Skyflayer", 143, Rarity.UNCOMMON, mage.cards.p.PhyrexianSkyflayer.class)); cards.add(new SetCardInfo("Pile On", 122, Rarity.RARE, mage.cards.p.PileOn.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Pile On", 361, Rarity.RARE, mage.cards.p.PileOn.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Placid Rottentail", 199, Rarity.COMMON, mage.cards.p.PlacidRottentail.class)); diff --git a/Mage.Sets/src/mage/sets/RivalsOfIxalan.java b/Mage.Sets/src/mage/sets/RivalsOfIxalan.java index 1aaf20ca64d..1de7bb9051a 100644 --- a/Mage.Sets/src/mage/sets/RivalsOfIxalan.java +++ b/Mage.Sets/src/mage/sets/RivalsOfIxalan.java @@ -241,7 +241,6 @@ public final class RivalsOfIxalan extends ExpansionSet { cards.add(new SetCardInfo("Warkite Marauder", 60, Rarity.RARE, mage.cards.w.WarkiteMarauder.class)); cards.add(new SetCardInfo("Waterknot", 61, Rarity.COMMON, mage.cards.w.Waterknot.class)); cards.add(new SetCardInfo("Wayward Swordtooth", 150, Rarity.RARE, mage.cards.w.WaywardSwordtooth.class)); - cards.add(new SetCardInfo("Winged Temple of Orazca", 158, Rarity.RARE, mage.cards.w.WingedTempleOfOrazca.class)); cards.add(new SetCardInfo("Woodland Stream", 191, Rarity.UNCOMMON, mage.cards.w.WoodlandStream.class)); cards.add(new SetCardInfo("World Shaper", 151, Rarity.RARE, mage.cards.w.WorldShaper.class)); cards.add(new SetCardInfo("Zacama, Primal Calamity", 174, Rarity.MYTHIC, mage.cards.z.ZacamaPrimalCalamity.class)); diff --git a/Mage.Sets/src/mage/sets/RivalsOfIxalanPromos.java b/Mage.Sets/src/mage/sets/RivalsOfIxalanPromos.java index f93acb7a741..10e4b17f1fb 100644 --- a/Mage.Sets/src/mage/sets/RivalsOfIxalanPromos.java +++ b/Mage.Sets/src/mage/sets/RivalsOfIxalanPromos.java @@ -113,7 +113,6 @@ public class RivalsOfIxalanPromos extends ExpansionSet { cards.add(new SetCardInfo("Warkite Marauder", "60s", Rarity.RARE, mage.cards.w.WarkiteMarauder.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Wayward Swordtooth", "150p", Rarity.RARE, mage.cards.w.WaywardSwordtooth.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Wayward Swordtooth", "150s", Rarity.RARE, mage.cards.w.WaywardSwordtooth.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Winged Temple of Orazca", "158s", Rarity.RARE, mage.cards.w.WingedTempleOfOrazca.class)); cards.add(new SetCardInfo("World Shaper", "151p", Rarity.RARE, mage.cards.w.WorldShaper.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("World Shaper", "151s", Rarity.RARE, mage.cards.w.WorldShaper.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Zacama, Primal Calamity", "174p", Rarity.MYTHIC, mage.cards.z.ZacamaPrimalCalamity.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage.Sets/src/mage/sets/SecretLairDrop.java b/Mage.Sets/src/mage/sets/SecretLairDrop.java index b82f513aa06..d0a232a5461 100644 --- a/Mage.Sets/src/mage/sets/SecretLairDrop.java +++ b/Mage.Sets/src/mage/sets/SecretLairDrop.java @@ -616,7 +616,6 @@ public class SecretLairDrop extends ExpansionSet { cards.add(new SetCardInfo("Rogue's Passage", 607, Rarity.RARE, mage.cards.r.RoguesPassage.class)); cards.add(new SetCardInfo("Darksteel Citadel", 608, Rarity.RARE, mage.cards.d.DarksteelCitadel.class)); cards.add(new SetCardInfo("Havengul Laboratory", 609, Rarity.RARE, mage.cards.h.HavengulLaboratory.class)); - cards.add(new SetCardInfo("Havengul Mystery", 609, Rarity.RARE, mage.cards.h.HavengulMystery.class)); cards.add(new SetCardInfo("Bonescythe Sliver", 610, Rarity.RARE, mage.cards.b.BonescytheSliver.class)); cards.add(new SetCardInfo("Constricting Sliver", 611, Rarity.RARE, mage.cards.c.ConstrictingSliver.class)); cards.add(new SetCardInfo("Essence Sliver", 612, Rarity.RARE, mage.cards.e.EssenceSliver.class)); diff --git a/Mage.Sets/src/mage/sets/ShadowsOverInnistrad.java b/Mage.Sets/src/mage/sets/ShadowsOverInnistrad.java index 9fcedd562d5..effdf462efd 100644 --- a/Mage.Sets/src/mage/sets/ShadowsOverInnistrad.java +++ b/Mage.Sets/src/mage/sets/ShadowsOverInnistrad.java @@ -156,7 +156,6 @@ public final class ShadowsOverInnistrad extends ExpansionSet { cards.add(new SetCardInfo("Harvest Hand", 256, Rarity.UNCOMMON, mage.cards.h.HarvestHand.class)); cards.add(new SetCardInfo("Haunted Cloak", 257, Rarity.UNCOMMON, mage.cards.h.HauntedCloak.class)); cards.add(new SetCardInfo("Heir of Falkenrath", 116, Rarity.UNCOMMON, mage.cards.h.HeirOfFalkenrath.class)); - cards.add(new SetCardInfo("Heir to the Night", 116, Rarity.UNCOMMON, mage.cards.h.HeirToTheNight.class)); cards.add(new SetCardInfo("Hermit of the Natterknolls", 209, Rarity.UNCOMMON, mage.cards.h.HermitOfTheNatterknolls.class)); cards.add(new SetCardInfo("Highland Lake", 277, Rarity.UNCOMMON, mage.cards.h.HighlandLake.class)); cards.add(new SetCardInfo("Hinterland Logger", 210, Rarity.COMMON, mage.cards.h.HinterlandLogger.class)); @@ -191,7 +190,6 @@ public final class ShadowsOverInnistrad extends ExpansionSet { cards.add(new SetCardInfo("Lightning Axe", 170, Rarity.UNCOMMON, mage.cards.l.LightningAxe.class)); cards.add(new SetCardInfo("Liliana's Indignation", 120, Rarity.UNCOMMON, mage.cards.l.LilianasIndignation.class)); cards.add(new SetCardInfo("Loam Dryad", 216, Rarity.COMMON, mage.cards.l.LoamDryad.class)); - cards.add(new SetCardInfo("Lone Wolf of the Natterknolls", 209, Rarity.UNCOMMON, mage.cards.l.LoneWolfOfTheNatterknolls.class)); cards.add(new SetCardInfo("Macabre Waltz", 121, Rarity.COMMON, mage.cards.m.MacabreWaltz.class)); cards.add(new SetCardInfo("Mad Prophet", 171, Rarity.UNCOMMON, mage.cards.m.MadProphet.class)); cards.add(new SetCardInfo("Magmatic Chasm", 172, Rarity.COMMON, mage.cards.m.MagmaticChasm.class)); @@ -262,7 +260,6 @@ public final class ShadowsOverInnistrad extends ExpansionSet { cards.add(new SetCardInfo("Sanguinary Mage", 178, Rarity.COMMON, mage.cards.s.SanguinaryMage.class)); cards.add(new SetCardInfo("Sanitarium Skeleton", 133, Rarity.COMMON, mage.cards.s.SanitariumSkeleton.class)); cards.add(new SetCardInfo("Scourge Wolf", 179, Rarity.RARE, mage.cards.s.ScourgeWolf.class)); - cards.add(new SetCardInfo("Scrounged Scythe", 256, Rarity.UNCOMMON, mage.cards.s.ScroungedScythe.class)); cards.add(new SetCardInfo("Seagraf Skaab", 84, Rarity.COMMON, mage.cards.s.SeagrafSkaab.class)); cards.add(new SetCardInfo("Seasons Past", 226, Rarity.MYTHIC, mage.cards.s.SeasonsPast.class)); cards.add(new SetCardInfo("Second Harvest", 227, Rarity.RARE, mage.cards.s.SecondHarvest.class)); @@ -350,7 +347,6 @@ public final class ShadowsOverInnistrad extends ExpansionSet { cards.add(new SetCardInfo("Welcome to the Fold", 96, Rarity.RARE, mage.cards.w.WelcomeToTheFold.class)); cards.add(new SetCardInfo("Werewolf of Ancient Hunger", 225, Rarity.RARE, mage.cards.w.WerewolfOfAncientHunger.class)); cards.add(new SetCardInfo("Westvale Abbey", 281, Rarity.RARE, mage.cards.w.WestvaleAbbey.class)); - cards.add(new SetCardInfo("Westvale Cult Leader", 21, Rarity.RARE, mage.cards.w.WestvaleCultLeader.class)); cards.add(new SetCardInfo("Wicker Witch", 268, Rarity.COMMON, mage.cards.w.WickerWitch.class)); cards.add(new SetCardInfo("Wild-Field Scarecrow", 269, Rarity.UNCOMMON, mage.cards.w.WildFieldScarecrow.class)); cards.add(new SetCardInfo("Wolf of Devil's Breach", 192, Rarity.MYTHIC, mage.cards.w.WolfOfDevilsBreach.class)); diff --git a/Mage.Sets/src/mage/sets/ShadowsOverInnistradPromos.java b/Mage.Sets/src/mage/sets/ShadowsOverInnistradPromos.java index 9c11add782d..6072500d9ab 100644 --- a/Mage.Sets/src/mage/sets/ShadowsOverInnistradPromos.java +++ b/Mage.Sets/src/mage/sets/ShadowsOverInnistradPromos.java @@ -112,7 +112,6 @@ public class ShadowsOverInnistradPromos extends ExpansionSet { cards.add(new SetCardInfo("Welcome to the Fold", "96s", Rarity.RARE, mage.cards.w.WelcomeToTheFold.class)); cards.add(new SetCardInfo("Werewolf of Ancient Hunger", "225s", Rarity.RARE, mage.cards.w.WerewolfOfAncientHunger.class)); cards.add(new SetCardInfo("Westvale Abbey", "281s", Rarity.RARE, mage.cards.w.WestvaleAbbey.class)); - cards.add(new SetCardInfo("Westvale Cult Leader", "21s", Rarity.RARE, mage.cards.w.WestvaleCultLeader.class)); cards.add(new SetCardInfo("Wolf of Devil's Breach", "192s", Rarity.MYTHIC, mage.cards.w.WolfOfDevilsBreach.class)); } } diff --git a/Mage.Sets/src/mage/sets/ShadowsOverInnistradRemastered.java b/Mage.Sets/src/mage/sets/ShadowsOverInnistradRemastered.java index c4375f7ec2b..9f77d965483 100644 --- a/Mage.Sets/src/mage/sets/ShadowsOverInnistradRemastered.java +++ b/Mage.Sets/src/mage/sets/ShadowsOverInnistradRemastered.java @@ -259,7 +259,6 @@ public class ShadowsOverInnistradRemastered extends ExpansionSet { cards.add(new SetCardInfo("Sage of Ancient Lore", 211, Rarity.RARE, mage.cards.s.SageOfAncientLore.class)); cards.add(new SetCardInfo("Sanitarium Skeleton", 133, Rarity.COMMON, mage.cards.s.SanitariumSkeleton.class)); cards.add(new SetCardInfo("Scourge Wolf", 175, Rarity.UNCOMMON, mage.cards.s.ScourgeWolf.class)); - cards.add(new SetCardInfo("Scrounged Scythe", 252, Rarity.UNCOMMON, mage.cards.s.ScroungedScythe.class)); cards.add(new SetCardInfo("Seasons Past", 212, Rarity.MYTHIC, mage.cards.s.SeasonsPast.class)); cards.add(new SetCardInfo("Second Harvest", 213, Rarity.RARE, mage.cards.s.SecondHarvest.class)); cards.add(new SetCardInfo("Selfless Spirit", 42, Rarity.RARE, mage.cards.s.SelflessSpirit.class)); diff --git a/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java b/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java index 4dba2652837..810438c919d 100644 --- a/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java +++ b/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java @@ -347,9 +347,6 @@ public final class TheLostCavernsOfIxalan extends ExpansionSet { cards.add(new SetCardInfo("River Herald Scout", 72, Rarity.COMMON, mage.cards.r.RiverHeraldScout.class)); cards.add(new SetCardInfo("Roaming Throne", 258, Rarity.RARE, mage.cards.r.RoamingThrone.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Roaming Throne", 344, Rarity.RARE, mage.cards.r.RoamingThrone.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Roar of the Fifth People", 189, Rarity.MYTHIC, mage.cards.r.RoarOfTheFifthPeople.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Roar of the Fifth People", 296, Rarity.MYTHIC, mage.cards.r.RoarOfTheFifthPeople.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Roar of the Fifth People", 339, Rarity.MYTHIC, mage.cards.r.RoarOfTheFifthPeople.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ruin-Lurker Bat", 33, Rarity.UNCOMMON, mage.cards.r.RuinLurkerBat.class)); cards.add(new SetCardInfo("Rumbling Rockslide", 163, Rarity.COMMON, mage.cards.r.RumblingRockslide.class)); cards.add(new SetCardInfo("Runaway Boulder", 259, Rarity.COMMON, mage.cards.r.RunawayBoulder.class)); diff --git a/Mage.Sets/src/mage/sets/UniversesWithin.java b/Mage.Sets/src/mage/sets/UniversesWithin.java index 4c79b8ba2de..c125b00b5e0 100644 --- a/Mage.Sets/src/mage/sets/UniversesWithin.java +++ b/Mage.Sets/src/mage/sets/UniversesWithin.java @@ -37,7 +37,6 @@ public final class UniversesWithin extends ExpansionSet { cards.add(new SetCardInfo("Hansk, Slayer Zealot", 22, Rarity.MYTHIC, mage.cards.h.HanskSlayerZealot.class)); cards.add(new SetCardInfo("Hargilde, Kindly Runechanter", 5, Rarity.RARE, mage.cards.h.HargildeKindlyRunechanter.class)); cards.add(new SetCardInfo("Havengul Laboratory", 9, Rarity.RARE, mage.cards.h.HavengulLaboratory.class)); - cards.add(new SetCardInfo("Havengul Mystery", 9, Rarity.RARE, mage.cards.h.HavengulMystery.class)); cards.add(new SetCardInfo("Immard, the Stormcleaver", 14, Rarity.RARE, mage.cards.i.ImmardTheStormcleaver.class)); cards.add(new SetCardInfo("Jurin, Leading the Charge", 27, Rarity.RARE, mage.cards.j.JurinLeadingTheCharge.class)); cards.add(new SetCardInfo("Maarika, Brutal Gladiator", 15, Rarity.RARE, mage.cards.m.MaarikaBrutalGladiator.class));