diff --git a/Mage.Sets/src/mage/cards/d/DavrielRogueShadowmage.java b/Mage.Sets/src/mage/cards/d/DavrielRogueShadowmage.java new file mode 100644 index 00000000000..7209a035552 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DavrielRogueShadowmage.java @@ -0,0 +1,65 @@ +package mage.cards.d; + +import mage.abilities.Ability; +import mage.abilities.LoyaltyAbility; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; +import mage.abilities.condition.Condition; +import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.discard.DiscardTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetPlayer; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class DavrielRogueShadowmage extends CardImpl { + + public DavrielRogueShadowmage(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{B}"); + + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.DAVRIEL); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3)); + + // At the beginning of each opponent's upkeep, if that player has one or fewer cards in hand, Davriel, Rogue Shadowmage deals 2 damage to them. + this.addAbility(new ConditionalInterveningIfTriggeredAbility( + new BeginningOfUpkeepTriggeredAbility( + Zone.BATTLEFIELD, new DamageTargetEffect(2), + TargetController.OPPONENT, false, true + ), DavrielRogueShadowmageCondition.instance, "At the beginning of each opponent's upkeep, " + + "if that player has one or fewer cards in hand, {this} deals 2 damage to them." + )); + + // -1: Target player discards a card. + Ability ability = new LoyaltyAbility(new DiscardTargetEffect(1), -1); + ability.addTarget(new TargetPlayer()); + this.addAbility(ability); + } + + private DavrielRogueShadowmage(final DavrielRogueShadowmage card) { + super(card); + } + + @Override + public DavrielRogueShadowmage copy() { + return new DavrielRogueShadowmage(this); + } +} + +enum DavrielRogueShadowmageCondition implements Condition { + instance; + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(game.getActivePlayerId()); + return player != null && player.getHand().size() < 2; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/s/ShriekingAffliction.java b/Mage.Sets/src/mage/cards/s/ShriekingAffliction.java index 58a756bbe82..27b1459b505 100644 --- a/Mage.Sets/src/mage/cards/s/ShriekingAffliction.java +++ b/Mage.Sets/src/mage/cards/s/ShriekingAffliction.java @@ -1,47 +1,40 @@ - - package mage.cards.s; -import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.condition.Condition; +import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; +import mage.abilities.effects.common.LoseLifeTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; +import mage.constants.TargetController; import mage.constants.Zone; import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.permanent.Permanent; import mage.players.Player; -import mage.target.targetpointer.FixedTarget; + +import java.util.UUID; /** - * http://www.wizards.com/magic/magazine/article.aspx?x=mtg/faq/rtr - * Shrieking Affliction's ability will trigger only if an opponent begins his or - * her upkeep with one or fewer cards in hand. - * The ability will check the number of cards in that player's hand again when - * it tries to resolve. If that player has two or more cards in hand at that time, - * that player won't lose life. - * * @author LevelX2 */ public final class ShriekingAffliction extends CardImpl { - static final String rule = "At the beginning of the upkeep of enchanted creature's controller, that player loses 2 life"; - - public ShriekingAffliction (UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{B}"); - + public ShriekingAffliction(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{B}"); // At the beginning of each opponent's upkeep, if that player has one or fewer cards in hand, he or she loses 3 life. - this.addAbility(new ShriekingAfflictionTriggeredAbility()); + this.addAbility(new ConditionalInterveningIfTriggeredAbility( + new BeginningOfUpkeepTriggeredAbility( + Zone.BATTLEFIELD, new LoseLifeTargetEffect(3), + TargetController.OPPONENT, false, true + ), ShriekingAfflictionCondition.instance, "At the beginning of each opponent’s upkeep, " + + "if that player has one or fewer cards in hand, they lose 3 life." + )); } - public ShriekingAffliction (final ShriekingAffliction card) { + private ShriekingAffliction(final ShriekingAffliction card) { super(card); } @@ -51,74 +44,12 @@ public final class ShriekingAffliction extends CardImpl { } } -class ShriekingAfflictionTriggeredAbility extends TriggeredAbilityImpl { - - public ShriekingAfflictionTriggeredAbility() { - super(Zone.BATTLEFIELD, null); - } - - public ShriekingAfflictionTriggeredAbility(final ShriekingAfflictionTriggeredAbility ability) { - super(ability); - } - - @Override - public ShriekingAfflictionTriggeredAbility copy() { - return new ShriekingAfflictionTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.UPKEEP_STEP_PRE; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (game.getOpponents(controllerId).contains(event.getPlayerId())) { - Player player = game.getPlayer(event.getPlayerId()); - if (player != null && player.getHand().size() < 2) { - this.getEffects().clear(); - ShriekingAfflictionTargetEffect effect = new ShriekingAfflictionTargetEffect(); - effect.setTargetPointer(new FixedTarget(player.getId())); - this.addEffect(effect); - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "At the beginning of each opponent's upkeep, if that player has one or fewer cards in hand, he or she loses 3 life."; - } -} -class ShriekingAfflictionTargetEffect extends OneShotEffect { - - public ShriekingAfflictionTargetEffect() { - super(Outcome.Damage); - staticText = "he or she loses 3 life"; - } - - public ShriekingAfflictionTargetEffect(final ShriekingAfflictionTargetEffect effect) { - super(effect); - } - - @Override - public ShriekingAfflictionTargetEffect copy() { - return new ShriekingAfflictionTargetEffect(this); - } +enum ShriekingAfflictionCondition implements Condition { + instance; @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(targetPointer.getFirst(game, source)); - if (player != null && player.getHand().size() < 2) { - Permanent sourcePermanent = game.getPermanent(source.getSourceId()); - if (sourcePermanent != null) { - game.informPlayers(sourcePermanent.getName() + ": " + player.getLogName() + " loses 3 life"); - } - player.loseLife(3, game, false); - return true; - } - return false; + Player player = game.getPlayer(game.getActivePlayerId()); + return player != null && player.getHand().size() < 2; } - -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/WarOfTheSpark.java b/Mage.Sets/src/mage/sets/WarOfTheSpark.java index ddd000dc9f1..65a9bd6ab0d 100644 --- a/Mage.Sets/src/mage/sets/WarOfTheSpark.java +++ b/Mage.Sets/src/mage/sets/WarOfTheSpark.java @@ -32,6 +32,7 @@ public final class WarOfTheSpark extends ExpansionSet { cards.add(new SetCardInfo("Cruel Celebrant", 188, Rarity.UNCOMMON, mage.cards.c.CruelCelebrant.class)); cards.add(new SetCardInfo("Crush Dissent", 47, Rarity.COMMON, mage.cards.c.CrushDissent.class)); cards.add(new SetCardInfo("Davriel's Shadowfuge", 84, Rarity.COMMON, mage.cards.d.DavrielsShadowfuge.class)); + cards.add(new SetCardInfo("Davriel, Rogue Shadowmage", 83, Rarity.UNCOMMON, mage.cards.d.DavrielRogueShadowmage.class)); cards.add(new SetCardInfo("Dovin's Veto", 193, Rarity.COMMON, mage.cards.d.DovinsVeto.class)); cards.add(new SetCardInfo("Dreadhorde Invasion", 86, Rarity.RARE, mage.cards.d.DreadhordeInvasion.class)); cards.add(new SetCardInfo("Emergence Zone", 245, Rarity.UNCOMMON, mage.cards.e.EmergenceZone.class)); diff --git a/Mage/src/main/java/mage/constants/SubType.java b/Mage/src/main/java/mage/constants/SubType.java index 2a4ed036c2f..49450f0e3e5 100644 --- a/Mage/src/main/java/mage/constants/SubType.java +++ b/Mage/src/main/java/mage/constants/SubType.java @@ -380,6 +380,7 @@ public enum SubType { CHANDRA("Chandra", SubTypeSet.PlaneswalkerType), DACK("Dack", SubTypeSet.PlaneswalkerType), DARETTI("Daretti", SubTypeSet.PlaneswalkerType), + DAVRIEL("Davriel", SubTypeSet.PlaneswalkerType), DOMRI("Domri", SubTypeSet.PlaneswalkerType), DOOKU("Dooku", SubTypeSet.PlaneswalkerType, true), // Star Wars DOVIN("Dovin", SubTypeSet.PlaneswalkerType),