diff --git a/Mage.Sets/src/mage/cards/w/WrathfulRedDragon.java b/Mage.Sets/src/mage/cards/w/WrathfulRedDragon.java new file mode 100644 index 00000000000..3e9e0aed501 --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WrathfulRedDragon.java @@ -0,0 +1,135 @@ +package mage.cards.w; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.FlyingAbility; +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.filter.common.FilterCreaturePlayerOrPlaneswalker; +import mage.filter.predicate.Predicates; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetAnyTarget; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class WrathfulRedDragon extends CardImpl { + + public WrathfulRedDragon(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}{R}"); + + this.subtype.add(SubType.DRAGON); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever a Dragon you control is dealt damage, it deals that much damage to any target that isn't a Dragon. + this.addAbility(new WrathfulRedDragonTriggeredAbility()); + } + + private WrathfulRedDragon(final WrathfulRedDragon card) { + super(card); + } + + @Override + public WrathfulRedDragon copy() { + return new WrathfulRedDragon(this); + } +} + +class WrathfulRedDragonTriggeredAbility extends TriggeredAbilityImpl { + + private static final FilterCreaturePlayerOrPlaneswalker filter + = new FilterCreaturePlayerOrPlaneswalker("any target that isn't a Dragon"); + + static { + filter.getPermanentFilter().add(Predicates.not(SubType.DRAGON.getPredicate())); + } + + WrathfulRedDragonTriggeredAbility() { + super(Zone.BATTLEFIELD, new WrathfulRedDragonEffect()); + this.addTarget(new TargetAnyTarget(filter)); + } + + private WrathfulRedDragonTriggeredAbility(final WrathfulRedDragonTriggeredAbility ability) { + super(ability); + } + + @Override + public WrathfulRedDragonTriggeredAbility copy() { + return new WrathfulRedDragonTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DAMAGED_PERMANENT_BATCH; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Permanent dragon = game.getPermanent(event.getTargetId()); + int damage = event.getAmount(); + if (dragon == null || damage < 1 + || !dragon.isControlledBy(getControllerId()) + || !dragon.hasSubtype(SubType.DRAGON, game)) { + return false; + } + this.getEffects().setValue("damagedPermanent", dragon); + this.getEffects().setValue("damage", damage); + return true; + } + + @Override + public String getRule() { + return "Whenever a Dragon you control is dealt damage, " + + "it deals that much damage to any target that isn't a Dragon."; + } +} + +class WrathfulRedDragonEffect extends OneShotEffect { + + WrathfulRedDragonEffect() { + super(Outcome.Benefit); + } + + private WrathfulRedDragonEffect(final WrathfulRedDragonEffect effect) { + super(effect); + } + + @Override + public WrathfulRedDragonEffect copy() { + return new WrathfulRedDragonEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent dragon = (Permanent) getValue("damagedPermanent"); + Integer damage = (Integer) getValue("damage"); + if (dragon == null || damage == null) { + return false; + } + UUID targetId = getTargetPointer().getFirst(game, source); + Permanent permanent = game.getPermanent(targetId); + if (permanent != null) { + return permanent.damage(damage, dragon.getId(), source, game) > 0; + } + Player player = game.getPlayer(targetId); + if (player != null) { + return player.damage(damage, dragon.getId(), source, game) > 0; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java b/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java index 9e9dbc9d2dc..b4ceec88e81 100644 --- a/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java +++ b/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java @@ -611,6 +611,7 @@ public final class CommanderLegendsBattleForBaldursGate extends ExpansionSet { cards.add(new SetCardInfo("Winter Eladrin", 104, Rarity.COMMON, mage.cards.w.WinterEladrin.class)); cards.add(new SetCardInfo("Wizards of Thay", 105, Rarity.RARE, mage.cards.w.WizardsOfThay.class)); cards.add(new SetCardInfo("Woe Strider", 774, Rarity.RARE, mage.cards.w.WoeStrider.class)); + cards.add(new SetCardInfo("Wrathful Red Dragon", 207, Rarity.RARE, mage.cards.w.WrathfulRedDragon.class)); cards.add(new SetCardInfo("Wyll's Reversal", 209, Rarity.RARE, mage.cards.w.WyllsReversal.class)); cards.add(new SetCardInfo("Wyll, Blade of Frontiers", 208, Rarity.RARE, mage.cards.w.WyllBladeOfFrontiers.class)); cards.add(new SetCardInfo("Wyrm's Crossing Patrol", 51, Rarity.COMMON, mage.cards.w.WyrmsCrossingPatrol.class)); diff --git a/Mage/src/main/java/mage/game/events/DamagedBatchEvent.java b/Mage/src/main/java/mage/game/events/DamagedBatchEvent.java index 1d04ed124ac..b8ddca2b12b 100644 --- a/Mage/src/main/java/mage/game/events/DamagedBatchEvent.java +++ b/Mage/src/main/java/mage/game/events/DamagedBatchEvent.java @@ -1,7 +1,9 @@ package mage.game.events; import java.util.HashSet; +import java.util.Objects; import java.util.Set; +import java.util.UUID; /** * @author TheElk801 @@ -20,6 +22,24 @@ public abstract class DamagedBatchEvent extends GameEvent { return events; } + @Override + public int getAmount() { + return events + .stream() + .mapToInt(GameEvent::getAmount) + .sum(); + } + + @Override + public UUID getTargetId() { + return events + .stream() + .map(GameEvent::getTargetId) + .filter(Objects::nonNull) + .findFirst() + .orElse(null); + } + public void addEvent(DamagedEvent event) { this.events.add(event); } @@ -29,13 +49,15 @@ public abstract class DamagedBatchEvent extends GameEvent { } public static DamagedBatchEvent makeEvent(DamagedEvent damagedEvent) { - DamagedBatchEvent event = null; + DamagedBatchEvent event; if (damagedEvent instanceof DamagedPlayerEvent) { event = new DamagedPlayerBatchEvent(); event.addEvent(damagedEvent); } else if (damagedEvent instanceof DamagedPermanentEvent) { event = new DamagedPermanentBatchEvent(); event.addEvent(damagedEvent); + } else { + event = null; } return event; }