From 1a1f7ec588252412d9a9414554c2fb3bdb63e8ab Mon Sep 17 00:00:00 2001 From: xenohedron <12538125+xenohedron@users.noreply.github.com> Date: Mon, 10 Nov 2025 01:37:28 -0500 Subject: [PATCH] update all cards that deal damage to two or more specific things simultaneously --- Mage.Sets/src/mage/cards/a/ArcTrail.java | 6 ++- .../src/mage/cards/a/AssembledAlphas.java | 13 ++--- .../src/mage/cards/b/BellowingFiend.java | 20 ++++--- .../src/mage/cards/b/BurningSunsAvatar.java | 15 +++--- .../src/mage/cards/c/CarnivalCarnage.java | 5 +- .../src/mage/cards/c/ChandraFlamesFury.java | 48 ++--------------- .../src/mage/cards/c/ChandraPyromaster.java | 9 ++-- .../src/mage/cards/c/ConductElectricity.java | 14 ++--- Mage.Sets/src/mage/cards/c/CunningStrike.java | 22 +++----- .../src/mage/cards/c/CuombajjWitches.java | 5 +- Mage.Sets/src/mage/cards/d/DaggerCaster.java | 38 ++++++++++--- .../src/mage/cards/d/DragonsparkReactor.java | 3 +- .../mage/cards/d/DrakusethMawOfFlames.java | 50 ++--------------- .../src/mage/cards/e/ExplosiveWelcome.java | 22 +++----- Mage.Sets/src/mage/cards/f/FearFireFoes.java | 5 +- .../src/mage/cards/f/FireAndBrimstone.java | 6 +-- Mage.Sets/src/mage/cards/f/Fireslinger.java | 6 +-- Mage.Sets/src/mage/cards/f/Firespout.java | 47 +++++++++++++--- Mage.Sets/src/mage/cards/f/FirstVolley.java | 10 +--- Mage.Sets/src/mage/cards/f/ForgeDevil.java | 17 ++---- .../src/mage/cards/g/GoblinArtillery.java | 8 +-- .../src/mage/cards/g/GrangerGuildmage.java | 13 ++--- Mage.Sets/src/mage/cards/h/HailStorm.java | 41 ++++++++++++-- Mage.Sets/src/mage/cards/h/HungryFlames.java | 48 ++--------------- Mage.Sets/src/mage/cards/i/InsultInjury.java | 40 ++------------ .../src/mage/cards/i/InvasionOfRegatha.java | 19 ++----- Mage.Sets/src/mage/cards/j/JudgmentBolt.java | 38 ++++++++++--- Mage.Sets/src/mage/cards/k/KamahlsSledge.java | 15 +++--- Mage.Sets/src/mage/cards/l/Lunge.java | 18 +++---- Mage.Sets/src/mage/cards/n/NeonatesRush.java | 41 ++------------ .../src/mage/cards/o/OrcishArtillery.java | 11 ++-- .../src/mage/cards/o/OrcishCannonade.java | 14 ++--- .../src/mage/cards/o/OrcishCannoneers.java | 15 ++---- Mage.Sets/src/mage/cards/p/PsionicBlast.java | 6 +-- Mage.Sets/src/mage/cards/p/PsionicEntity.java | 13 ++--- Mage.Sets/src/mage/cards/p/PsionicSliver.java | 18 ++----- .../src/mage/cards/p/PunishTheEnemy.java | 15 +++--- .../src/mage/cards/r/RadiatingLightning.java | 11 ++-- .../src/mage/cards/r/RakdosFirewheeler.java | 11 ++-- Mage.Sets/src/mage/cards/r/RecklessRage.java | 15 ++---- Mage.Sets/src/mage/cards/s/SeismicWave.java | 6 +-- Mage.Sets/src/mage/cards/s/SelfDestruct.java | 2 +- .../src/mage/cards/s/ShadowGuildmage.java | 12 ++--- .../src/mage/cards/s/ShockerUnshakable.java | 6 +-- .../src/mage/cards/s/ShowerOfSparks.java | 13 ++--- .../src/mage/cards/s/SoulOfShandalar.java | 3 +- Mage.Sets/src/mage/cards/s/Sparksmith.java | 54 +++++++++++++------ .../src/mage/cards/s/SunflareShaman.java | 15 +++--- .../mage/cards/s/SynchronizedSpellcraft.java | 23 ++------ .../src/mage/cards/t/TheFallOfKroog.java | 12 ++--- Mage.Sets/src/mage/cards/t/TrickShot.java | 10 +--- Mage.Sets/src/mage/cards/u/UnleashShell.java | 10 ++-- Mage.Sets/src/mage/cards/w/WildfireHowl.java | 2 + .../DamageTargetAndAllControlledEffect.java | 18 +++++-- ...DamageTargetAndTargetControllerEffect.java | 12 +++-- 55 files changed, 397 insertions(+), 572 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/ArcTrail.java b/Mage.Sets/src/mage/cards/a/ArcTrail.java index 2a7a57ede4f..703e3c7ecf8 100644 --- a/Mage.Sets/src/mage/cards/a/ArcTrail.java +++ b/Mage.Sets/src/mage/cards/a/ArcTrail.java @@ -29,8 +29,10 @@ public final class ArcTrail extends CardImpl { // Arc Trail deals 2 damage to any target and 1 damage to another target this.getSpellAbility().addEffect(new DamageTargetAndTargetEffect(2, 1)); - this.getSpellAbility().addTarget(new TargetPermanentOrPlayer(filter1).setTargetTag(1)); - this.getSpellAbility().addTarget(new TargetPermanentOrPlayer(filter2).setTargetTag(2)); + this.getSpellAbility().addTarget(new TargetPermanentOrPlayer(filter1) + .withChooseHint("to deal 2 damage").setTargetTag(1)); + this.getSpellAbility().addTarget(new TargetPermanentOrPlayer(filter2) + .withChooseHint("to deal 1 damage").setTargetTag(2)); } private ArcTrail(final ArcTrail card) { diff --git a/Mage.Sets/src/mage/cards/a/AssembledAlphas.java b/Mage.Sets/src/mage/cards/a/AssembledAlphas.java index dd5ca0e07cf..fbb15e6b892 100644 --- a/Mage.Sets/src/mage/cards/a/AssembledAlphas.java +++ b/Mage.Sets/src/mage/cards/a/AssembledAlphas.java @@ -1,16 +1,14 @@ package mage.cards.a; -import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility; -import mage.abilities.effects.common.DamageTargetControllerEffect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndTargetControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -25,9 +23,8 @@ public final class AssembledAlphas extends CardImpl { this.toughness = new MageInt(5); // Whenever Assembled Alphas blocks or becomes blocked by a creature, Assembled Alphas deals 3 damage to that creature and 3 damage to that creature's controller. - Ability ability = new BlocksOrBlockedByCreatureSourceTriggeredAbility(new DamageTargetEffect(3, true, "that creature")); - ability.addEffect(new DamageTargetControllerEffect(3).setText("and 3 damage to that creature's controller")); - this.addAbility(ability); + this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility( + new DamageTargetAndTargetControllerEffect(3, 3))); } private AssembledAlphas(final AssembledAlphas card) { diff --git a/Mage.Sets/src/mage/cards/b/BellowingFiend.java b/Mage.Sets/src/mage/cards/b/BellowingFiend.java index 7638ae26eb9..b38acec47c7 100644 --- a/Mage.Sets/src/mage/cards/b/BellowingFiend.java +++ b/Mage.Sets/src/mage/cards/b/BellowingFiend.java @@ -3,9 +3,7 @@ package mage.cards.b; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.DealsDamageToACreatureTriggeredAbility; -import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.DamageControllerEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -31,12 +29,10 @@ public final class BellowingFiend extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); + // Whenever Bellowing Fiend deals damage to a creature, Bellowing Fiend deals 3 damage to that creature's controller and 3 damage to you. - Ability ability = new DealsDamageToACreatureTriggeredAbility(new BellowingFiendEffect(), false, false, true); - Effect effect = new DamageControllerEffect(3); - effect.setText("and 3 damage to you"); - ability.addEffect(effect); - this.addAbility(ability); + this.addAbility(new DealsDamageToACreatureTriggeredAbility( + new BellowingFiendEffect(), false, false, true)); } private BellowingFiend(final BellowingFiend card) { @@ -53,7 +49,7 @@ class BellowingFiendEffect extends OneShotEffect { BellowingFiendEffect() { super(Outcome.Detriment); - this.staticText = "{this} deals 3 damage to that creature's controller"; + this.staticText = "{this} deals 3 damage to that creature's controller and 3 damage to you"; } private BellowingFiendEffect(final BellowingFiendEffect effect) { @@ -67,15 +63,17 @@ class BellowingFiendEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - boolean applied = false; Permanent damagedCreature = getTargetPointer().getFirstTargetPermanentOrLKI(game, source); if (damagedCreature != null) { Player controller = game.getPlayer(damagedCreature.getControllerId()); if (controller != null) { controller.damage(3, source.getSourceId(), source, game); - applied = true; } } - return applied; + Player you = game.getPlayer(source.getControllerId()); + if (you != null) { + you.damage(3, source.getSourceId(), source, game); + } + return true; } } diff --git a/Mage.Sets/src/mage/cards/b/BurningSunsAvatar.java b/Mage.Sets/src/mage/cards/b/BurningSunsAvatar.java index 0aca1c22fc8..4394b57717d 100644 --- a/Mage.Sets/src/mage/cards/b/BurningSunsAvatar.java +++ b/Mage.Sets/src/mage/cards/b/BurningSunsAvatar.java @@ -1,12 +1,9 @@ - package mage.cards.b; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.Effect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -14,6 +11,8 @@ import mage.constants.SubType; import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetOpponentOrPlaneswalker; +import java.util.UUID; + /** * * @author TheElk801 @@ -29,11 +28,9 @@ public final class BurningSunsAvatar extends CardImpl { this.toughness = new MageInt(6); // When Burning Sun's Avatar enters the battlefield, it deals 3 damage to target opponent and 3 damage to up to one target creature. - Effect effect = new DamageTargetEffect(3); - effect.setText("it deals 3 damage to target opponent or planeswalker and 3 damage to up to one target creature"); - Ability ability = new EntersBattlefieldTriggeredAbility(effect, false); - ability.addTarget(new TargetOpponentOrPlaneswalker()); - ability.addTarget(new TargetCreaturePermanent(0, 1)); + Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetAndTargetEffect(3, 3)); + ability.addTarget(new TargetOpponentOrPlaneswalker().setTargetTag(1)); + ability.addTarget(new TargetCreaturePermanent(0, 1).setTargetTag(2)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/c/CarnivalCarnage.java b/Mage.Sets/src/mage/cards/c/CarnivalCarnage.java index 8ff9875068c..33452f3972e 100644 --- a/Mage.Sets/src/mage/cards/c/CarnivalCarnage.java +++ b/Mage.Sets/src/mage/cards/c/CarnivalCarnage.java @@ -1,6 +1,6 @@ package mage.cards.c; -import mage.abilities.effects.common.DamageTargetControllerEffect; +import mage.abilities.effects.common.DamageTargetAndTargetControllerEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.discard.DiscardTargetEffect; import mage.cards.CardSetInfo; @@ -22,8 +22,7 @@ public final class CarnivalCarnage extends SplitCard { // Carnival // Carnival deals 1 damage to target creature or planeswalker and 1 damage to that permanent's controller. - this.getLeftHalfCard().getSpellAbility().addEffect(new DamageTargetEffect(1)); - this.getLeftHalfCard().getSpellAbility().addEffect(new DamageTargetControllerEffect(1).setText("and 1 damage to that permanent's controller")); + this.getLeftHalfCard().getSpellAbility().addEffect(new DamageTargetAndTargetControllerEffect(1, 1)); this.getLeftHalfCard().getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker()); // Carnage diff --git a/Mage.Sets/src/mage/cards/c/ChandraFlamesFury.java b/Mage.Sets/src/mage/cards/c/ChandraFlamesFury.java index a3303380cae..16beae1a99b 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraFlamesFury.java +++ b/Mage.Sets/src/mage/cards/c/ChandraFlamesFury.java @@ -2,19 +2,14 @@ package mage.cards.c; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.DamageAllControlledTargetEffect; +import mage.abilities.effects.common.DamageTargetAndAllControlledEffect; +import mage.abilities.effects.common.DamageTargetAndTargetControllerEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.SubType; import mage.constants.SuperType; -import mage.filter.StaticFilters; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; import mage.target.TargetPlayer; import mage.target.common.TargetAnyTarget; import mage.target.common.TargetCreaturePermanent; @@ -39,15 +34,12 @@ public final class ChandraFlamesFury extends CardImpl { this.addAbility(ability); // −2: Chandra, Flame's Fury deals 4 damage to target creature and 2 damage to that creature's controller. - ability = new LoyaltyAbility(new ChandraFlamesFuryEffect(), -2); + ability = new LoyaltyAbility(new DamageTargetAndTargetControllerEffect(4, 2), -2); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); // −8: Chandra, Flame's Fury deals 10 damage to target player and each creature that player controls. - ability = new LoyaltyAbility(new DamageTargetEffect(10), -8); - ability.addEffect(new DamageAllControlledTargetEffect( - 10, StaticFilters.FILTER_PERMANENT_CREATURE - ).setText("and each creature that player controls")); + ability = new LoyaltyAbility(new DamageTargetAndAllControlledEffect(10), -8); ability.addTarget(new TargetPlayer()); this.addAbility(ability); } @@ -61,35 +53,3 @@ public final class ChandraFlamesFury extends CardImpl { return new ChandraFlamesFury(this); } } - -class ChandraFlamesFuryEffect extends OneShotEffect { - - ChandraFlamesFuryEffect() { - super(Outcome.Benefit); - staticText = "{this} deals 4 damage to target creature and 2 damage to that creature's controller."; - } - - private ChandraFlamesFuryEffect(final ChandraFlamesFuryEffect effect) { - super(effect); - } - - @Override - public ChandraFlamesFuryEffect copy() { - return new ChandraFlamesFuryEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getFirstTarget()); - if (permanent == null) { - return false; - } - Player player = game.getPlayer(permanent.getControllerId()); - if (player == null) { - return false; - } - permanent.damage(4, source.getSourceId(), source, game); - player.damage(2, source.getSourceId(), source, game); - return true; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/c/ChandraPyromaster.java b/Mage.Sets/src/mage/cards/c/ChandraPyromaster.java index 035f31d6a6d..8a8b4880a1b 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraPyromaster.java +++ b/Mage.Sets/src/mage/cards/c/ChandraPyromaster.java @@ -36,8 +36,7 @@ public final class ChandraPyromaster extends CardImpl { this.setStartingLoyalty(4); - // +1: Chandra, Pyromaster deals 1 damage to target player and 1 damage to - // up to one target creature that player controls. That creature can't block this turn. + // +1: Chandra, Pyromaster deals 1 damage to target player and 1 damage to up to one target creature that player controls. That creature can't block this turn. LoyaltyAbility ability1 = new LoyaltyAbility(new ChandraPyromasterEffect1(), 1); Target target1 = new TargetPlayerOrPlaneswalker(); ability1.addTarget(target1); @@ -68,7 +67,7 @@ public final class ChandraPyromaster extends CardImpl { class ChandraPyromasterEffect1 extends OneShotEffect { - public ChandraPyromasterEffect1() { + ChandraPyromasterEffect1() { super(Outcome.Damage); staticText = "{this} deals 1 damage to target player or planeswalker " + "and 1 damage to up to one target creature that player or that " @@ -101,7 +100,7 @@ class ChandraPyromasterEffect1 extends OneShotEffect { class ChandraPyromasterTarget extends TargetPermanent { - public ChandraPyromasterTarget() { + ChandraPyromasterTarget() { super(0, 1, new FilterCreaturePermanent("creature that the targeted player " + "or planeswalker's controller controls"), false); } @@ -138,7 +137,7 @@ class ChandraPyromasterTarget extends TargetPermanent { class ChandraPyromasterEffect2 extends OneShotEffect { - public ChandraPyromasterEffect2() { + ChandraPyromasterEffect2() { super(Outcome.Detriment); this.staticText = "Exile the top card of your library. You may play it this turn"; } diff --git a/Mage.Sets/src/mage/cards/c/ConductElectricity.java b/Mage.Sets/src/mage/cards/c/ConductElectricity.java index 335dae1cb40..339fddbc851 100644 --- a/Mage.Sets/src/mage/cards/c/ConductElectricity.java +++ b/Mage.Sets/src/mage/cards/c/ConductElectricity.java @@ -1,13 +1,12 @@ package mage.cards.c; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.StaticFilters; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetpointer.SecondTargetPointer; import java.util.UUID; @@ -20,16 +19,11 @@ public final class ConductElectricity extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{R}"); // Conduct Electricity deals 6 damage to target creature and 2 damage to up to one target creature token. - this.getSpellAbility().addEffect(new DamageTargetEffect( - 6, true, "", true - )); - this.getSpellAbility().addEffect(new DamageTargetEffect( - 2, true, "", true - ).setTargetPointer(new SecondTargetPointer()).setText("and 2 damage to up to one target creature token")); - this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addEffect(new DamageTargetAndTargetEffect(6, 2)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent().setTargetTag(1)); this.getSpellAbility().addTarget(new TargetPermanent( 0, 1, StaticFilters.FILTER_CREATURE_TOKEN - )); + ).setTargetTag(2)); } private ConductElectricity(final ConductElectricity card) { diff --git a/Mage.Sets/src/mage/cards/c/CunningStrike.java b/Mage.Sets/src/mage/cards/c/CunningStrike.java index e3bdf684b9d..0b1d21da301 100644 --- a/Mage.Sets/src/mage/cards/c/CunningStrike.java +++ b/Mage.Sets/src/mage/cards/c/CunningStrike.java @@ -1,17 +1,14 @@ - package mage.cards.c; -import java.util.UUID; -import mage.abilities.dynamicvalue.common.StaticValue; -import mage.abilities.effects.Effect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndTargetEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetPlayerOrPlaneswalker; -import mage.target.targetpointer.SecondTargetPointer; + +import java.util.UUID; /** * @@ -22,14 +19,11 @@ public final class CunningStrike extends CardImpl { public CunningStrike(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{U}{R}"); - // Cunning Strike deals 2 damage to target creature and 2 damage to target player. - this.getSpellAbility().addEffect(new DamageTargetEffect(StaticValue.get(2), true, "", true)); - this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - Effect effect = new DamageTargetEffect(StaticValue.get(2), true, "", true); - effect.setTargetPointer(new SecondTargetPointer()); - effect.setText("and 2 damage to target player or planeswalker"); - this.getSpellAbility().addEffect(effect); - this.getSpellAbility().addTarget(new TargetPlayerOrPlaneswalker()); + // Cunning Strike deals 2 damage to target creature and 2 damage to target player or planeswalker. + this.getSpellAbility().addEffect(new DamageTargetAndTargetEffect(2, 2)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent().setTargetTag(1)); + this.getSpellAbility().addTarget(new TargetPlayerOrPlaneswalker().setTargetTag(2)); + // Draw a card. this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("
")); } diff --git a/Mage.Sets/src/mage/cards/c/CuombajjWitches.java b/Mage.Sets/src/mage/cards/c/CuombajjWitches.java index 2389a6b11b8..79029a89b03 100644 --- a/Mage.Sets/src/mage/cards/c/CuombajjWitches.java +++ b/Mage.Sets/src/mage/cards/c/CuombajjWitches.java @@ -1,4 +1,3 @@ - package mage.cards.c; import mage.MageInt; @@ -12,13 +11,13 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; -import mage.constants.Zone; import mage.game.Game; import mage.players.Player; import mage.target.Target; import mage.target.common.TargetAnyTarget; import mage.target.common.TargetOpponent; import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetpointer.EachTargetPointer; import java.util.UUID; @@ -35,7 +34,7 @@ public final class CuombajjWitches extends CardImpl { this.toughness = new MageInt(3); // {T}: Cuombajj Witches deals 1 damage to any target and 1 damage to any target of an opponent's choice. - Effect effect = new DamageTargetEffect(1); + Effect effect = new DamageTargetEffect(1).setTargetPointer(new EachTargetPointer()); effect.setText("{this} deals 1 damage to any target and 1 damage to any target of an opponent's choice"); Ability ability = new SimpleActivatedAbility(effect, new TapSourceCost()); ability.addTarget(new TargetAnyTarget()); diff --git a/Mage.Sets/src/mage/cards/d/DaggerCaster.java b/Mage.Sets/src/mage/cards/d/DaggerCaster.java index aed8e187569..18a7388ae79 100644 --- a/Mage.Sets/src/mage/cards/d/DaggerCaster.java +++ b/Mage.Sets/src/mage/cards/d/DaggerCaster.java @@ -3,14 +3,17 @@ package mage.cards.d; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.effects.common.DamagePlayersEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.Outcome; import mage.constants.SubType; import mage.constants.TargetController; import mage.filter.StaticFilters; +import mage.game.Game; import java.util.UUID; @@ -28,14 +31,7 @@ public final class DaggerCaster extends CardImpl { this.toughness = new MageInt(3); // When Dagger Caster enters the battlefield, it deals 1 damage to each opponent and 1 damage to each creature your opponents control. - Ability ability = new EntersBattlefieldTriggeredAbility(new DamagePlayersEffect( - 1, TargetController.OPPONENT, "it" - )); - ability.addEffect( - new DamageAllEffect(1, StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE) - .setText("and 1 damage to each creature your opponents control") - ); - this.addAbility(ability); + this.addAbility(new EntersBattlefieldTriggeredAbility(new DaggerCasterEffect())); } private DaggerCaster(final DaggerCaster card) { @@ -47,3 +43,29 @@ public final class DaggerCaster extends CardImpl { return new DaggerCaster(this); } } + +// needed for simultaneous damage +class DaggerCasterEffect extends OneShotEffect { + + DaggerCasterEffect() { + super(Outcome.Damage); + staticText = "it deals 1 damage to each opponent and 1 damage to each creature your opponents control"; + } + + private DaggerCasterEffect(final DaggerCasterEffect effect) { + super(effect); + } + + @Override + public DaggerCasterEffect copy() { + return new DaggerCasterEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + new DamagePlayersEffect(1, TargetController.OPPONENT, "it").apply(game, source); + new DamageAllEffect(1, StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE).apply(game, source); + return true; + } + +} diff --git a/Mage.Sets/src/mage/cards/d/DragonsparkReactor.java b/Mage.Sets/src/mage/cards/d/DragonsparkReactor.java index 45469a4de18..0f9d6fcbdd3 100644 --- a/Mage.Sets/src/mage/cards/d/DragonsparkReactor.java +++ b/Mage.Sets/src/mage/cards/d/DragonsparkReactor.java @@ -16,6 +16,7 @@ import mage.counters.CounterType; import mage.filter.StaticFilters; import mage.target.TargetPlayer; import mage.target.common.TargetCreaturePermanent; +import mage.target.targetpointer.EachTargetPointer; import java.util.UUID; @@ -40,7 +41,7 @@ public final class DragonsparkReactor extends CardImpl { new DamageTargetEffect(xValue).setText( "it deals damage equal to the number of charge counters on it to target player " + "and that much damage to up to one target creature" - ), new GenericManaCost(4) + ).setTargetPointer(new EachTargetPointer()), new GenericManaCost(4) ); ability.addCost(new SacrificeSourceCost()); ability.addTarget(new TargetPlayer()); diff --git a/Mage.Sets/src/mage/cards/d/DrakusethMawOfFlames.java b/Mage.Sets/src/mage/cards/d/DrakusethMawOfFlames.java index 5b05e77d8d3..be989545f08 100644 --- a/Mage.Sets/src/mage/cards/d/DrakusethMawOfFlames.java +++ b/Mage.Sets/src/mage/cards/d/DrakusethMawOfFlames.java @@ -3,20 +3,16 @@ package mage.cards.d; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DamageTargetAndTargetEffect; 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.SuperType; import mage.filter.common.FilterAnyTarget; import mage.filter.common.FilterPermanentOrPlayer; import mage.filter.predicate.other.AnotherTargetPredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; import mage.target.common.TargetAnyTarget; import mage.target.common.TargetPermanentOrPlayer; @@ -26,6 +22,7 @@ import java.util.UUID; * @author TheElk801 */ public final class DrakusethMawOfFlames extends CardImpl { + private static final FilterPermanentOrPlayer filter = new FilterAnyTarget("any target"); static { @@ -45,7 +42,8 @@ public final class DrakusethMawOfFlames extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever Drakuseth, Maw of Flames attacks, it deals 4 damage to any target and 3 damage to each of up to two other targets. - Ability ability = new AttacksTriggeredAbility(new DrakusethMawOfFlamesEffect(), false); + Ability ability = new AttacksTriggeredAbility(new DamageTargetAndTargetEffect(4, 3) + .setText("it deals 4 damage to any target and 3 damage to each of up to two other targets")); ability.addTarget(new TargetAnyTarget().withChooseHint("to deal 4 damage").setTargetTag(1)); ability.addTarget(new TargetPermanentOrPlayer( 0, 2, filter, false @@ -62,43 +60,3 @@ public final class DrakusethMawOfFlames extends CardImpl { return new DrakusethMawOfFlames(this); } } - -class DrakusethMawOfFlamesEffect extends OneShotEffect { - - DrakusethMawOfFlamesEffect() { - super(Outcome.Damage); - staticText = "it deals 4 damage to any target and 3 damage to each of " - + "up to two other targets."; - } - - private DrakusethMawOfFlamesEffect(final DrakusethMawOfFlamesEffect effect) { - super(effect); - } - - @Override - public DrakusethMawOfFlamesEffect copy() { - return new DrakusethMawOfFlamesEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - damage(4, source.getTargets().get(0).getFirstTarget(), game, source); - source.getTargets() - .get(1) - .getTargets() - .stream() - .forEach(targetId -> damage(3, targetId, game, source)); - return true; - } - - private static void damage(int damage, UUID targetId, Game game, Ability source) { - Permanent permanent = game.getPermanent(targetId); - if (permanent != null) { - permanent.damage(damage, source.getSourceId(), source, game, false, true); - } - Player player = game.getPlayer(targetId); - if (player != null) { - player.damage(damage, source.getSourceId(), source, game); - } - } -} diff --git a/Mage.Sets/src/mage/cards/e/ExplosiveWelcome.java b/Mage.Sets/src/mage/cards/e/ExplosiveWelcome.java index a38deebd541..34d261a336d 100644 --- a/Mage.Sets/src/mage/cards/e/ExplosiveWelcome.java +++ b/Mage.Sets/src/mage/cards/e/ExplosiveWelcome.java @@ -1,8 +1,7 @@ package mage.cards.e; import mage.Mana; -import mage.abilities.dynamicvalue.common.StaticValue; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndTargetEffect; import mage.abilities.effects.mana.BasicManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -11,10 +10,8 @@ import mage.constants.ManaType; import mage.filter.common.FilterAnyTarget; import mage.filter.common.FilterPermanentOrPlayer; import mage.filter.predicate.other.AnotherTargetPredicate; -import mage.target.Target; import mage.target.common.TargetAnyTarget; import mage.target.common.TargetPermanentOrPlayer; -import mage.target.targetpointer.SecondTargetPointer; import java.util.UUID; @@ -34,19 +31,12 @@ public final class ExplosiveWelcome extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{7}{R}"); // Explosive Welcome deals 5 damage to any target and 3 damage to any other target. Add {R}{R}{R}. - this.getSpellAbility().addEffect(new DamageTargetEffect(StaticValue.get(5), true, "", true)); - this.getSpellAbility().addEffect( - new DamageTargetEffect(StaticValue.get(3), true, "", true) - .setTargetPointer(new SecondTargetPointer()) - .setText("and 3 damage to any other target.") - ); + this.getSpellAbility().addEffect(new DamageTargetAndTargetEffect(5, 3)); this.getSpellAbility().addEffect(new BasicManaEffect(new Mana(ManaType.RED, 3))); - Target target = new TargetAnyTarget(); - target.setTargetTag(1); - this.getSpellAbility().addTarget(target); - target = new TargetPermanentOrPlayer(filter); - target.setTargetTag(2); - this.getSpellAbility().addTarget(target); + this.getSpellAbility().addTarget(new TargetAnyTarget() + .withChooseHint("to deal 5 damage").setTargetTag(1)); + this.getSpellAbility().addTarget(new TargetPermanentOrPlayer(filter) + .withChooseHint("to deal 3 damage").setTargetTag(2)); } private ExplosiveWelcome(final ExplosiveWelcome card) { diff --git a/Mage.Sets/src/mage/cards/f/FearFireFoes.java b/Mage.Sets/src/mage/cards/f/FearFireFoes.java index 230a0c21a29..0e598e70321 100644 --- a/Mage.Sets/src/mage/cards/f/FearFireFoes.java +++ b/Mage.Sets/src/mage/cards/f/FearFireFoes.java @@ -34,7 +34,6 @@ public final class FearFireFoes extends CardImpl { this.getSpellAbility().addEffect(new DamageCantBePreventedEffect( Duration.EndOfTurn )); - this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); this.getSpellAbility().addEffect(new FearFireFoesEffect()); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } @@ -53,7 +52,8 @@ class FearFireFoesEffect extends OneShotEffect { FearFireFoesEffect() { super(Outcome.Benefit); - staticText = "and 1 damage to each other creature with the same controller"; + staticText = "{this} deals X damage to target creature " + + "and 1 damage to each other creature with the same controller"; } private FearFireFoesEffect(final FearFireFoesEffect effect) { @@ -67,6 +67,7 @@ class FearFireFoesEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { + new DamageTargetEffect(GetXValue.instance).apply(game, source); Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); if (permanent == null) { return false; diff --git a/Mage.Sets/src/mage/cards/f/FireAndBrimstone.java b/Mage.Sets/src/mage/cards/f/FireAndBrimstone.java index f7258a53ac3..701183efdd5 100644 --- a/Mage.Sets/src/mage/cards/f/FireAndBrimstone.java +++ b/Mage.Sets/src/mage/cards/f/FireAndBrimstone.java @@ -1,7 +1,6 @@ package mage.cards.f; -import mage.abilities.effects.common.DamageControllerEffect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndYouEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -30,8 +29,7 @@ public final class FireAndBrimstone extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{W}{W}"); // Fire and Brimstone deals 4 damage to target player who attacked this turn and 4 damage to you. - this.getSpellAbility().addEffect(new DamageTargetEffect(4)); - this.getSpellAbility().addEffect(new DamageControllerEffect(4).setText("and 4 damage to you")); + this.getSpellAbility().addEffect(new DamageTargetAndYouEffect(4)); this.getSpellAbility().addTarget(new TargetPlayer(1, 1, false, filter)); } diff --git a/Mage.Sets/src/mage/cards/f/Fireslinger.java b/Mage.Sets/src/mage/cards/f/Fireslinger.java index d0312a29d12..92e78e6cb22 100644 --- a/Mage.Sets/src/mage/cards/f/Fireslinger.java +++ b/Mage.Sets/src/mage/cards/f/Fireslinger.java @@ -4,8 +4,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.DamageControllerEffect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndYouEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -26,8 +25,7 @@ public final class Fireslinger extends CardImpl { this.power = new MageInt(1); this.toughness = new MageInt(1); - Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(1), new TapSourceCost()); - ability.addEffect(new DamageControllerEffect(1).setText("and 1 damage to you")); + Ability ability = new SimpleActivatedAbility(new DamageTargetAndYouEffect(1), new TapSourceCost()); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/f/Firespout.java b/Mage.Sets/src/mage/cards/f/Firespout.java index c8ed77f2799..a992ca121da 100644 --- a/Mage.Sets/src/mage/cards/f/Firespout.java +++ b/Mage.Sets/src/mage/cards/f/Firespout.java @@ -1,17 +1,20 @@ - package mage.cards.f; +import mage.abilities.Ability; import mage.abilities.condition.common.ManaWasSpentCondition; import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.Outcome; import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.AbilityPredicate; +import mage.game.Game; import java.util.UUID; @@ -30,12 +33,8 @@ public final class Firespout extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{R/G}"); // Firespout deals 3 damage to each creature without flying if {R} was spent to cast Firespout and 3 damage to each creature with flying if {G} was spent to cast it. - this.getSpellAbility().addEffect(new ConditionalOneShotEffect( - new DamageAllEffect(3, filter1), - ManaWasSpentCondition.RED, "{this} deals 3 damage to each creature without flying if {R} was spent to cast this spell")); - this.getSpellAbility().addEffect(new ConditionalOneShotEffect( - new DamageAllEffect(3, StaticFilters.FILTER_CREATURE_FLYING), - ManaWasSpentCondition.GREEN, "and 3 damage to each creature with flying if {G} was spent to cast this spell. (Do both if {R}{G} was spent.)")); + this.getSpellAbility().addEffect(new FirespoutEffect()); + } private Firespout(final Firespout card) { @@ -47,3 +46,37 @@ public final class Firespout extends CardImpl { return new Firespout(this); } } + +// needed for simultaneous damage +class FirespoutEffect extends OneShotEffect { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature without flying"); + static { + filter.add(Predicates.not(new AbilityPredicate(FlyingAbility.class))); + } + + FirespoutEffect() { + super(Outcome.Benefit); + staticText = "{this} deals 3 damage to each creature without flying if {R} was spent to cast this spell " + + "and 3 damage to each creature with flying if {G} was spent to cast this spell. " + + "(Do both if {R}{G} was spent.)"; + } + + private FirespoutEffect(final FirespoutEffect effect) { + super(effect); + } + + @Override + public FirespoutEffect copy() { + return new FirespoutEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + new ConditionalOneShotEffect(new DamageAllEffect(3, filter), + ManaWasSpentCondition.RED).apply(game, source); + new ConditionalOneShotEffect(new DamageAllEffect(3, StaticFilters.FILTER_CREATURE_FLYING), + ManaWasSpentCondition.GREEN).apply(game, source); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/f/FirstVolley.java b/Mage.Sets/src/mage/cards/f/FirstVolley.java index 8186188eeae..da125cec8a0 100644 --- a/Mage.Sets/src/mage/cards/f/FirstVolley.java +++ b/Mage.Sets/src/mage/cards/f/FirstVolley.java @@ -1,9 +1,6 @@ - package mage.cards.f; -import mage.abilities.effects.Effect; -import mage.abilities.effects.common.DamageTargetControllerEffect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndTargetControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -23,10 +20,7 @@ public final class FirstVolley extends CardImpl { this.subtype.add(SubType.ARCANE); // First Volley deals 1 damage to target creature and 1 damage to that creature's controller. - this.getSpellAbility().addEffect(new DamageTargetEffect(1)); - Effect effect = new DamageTargetControllerEffect(1); - effect.setText("and 1 damage to that creature's controller"); - this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addEffect(new DamageTargetAndTargetControllerEffect(1, 1)); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } diff --git a/Mage.Sets/src/mage/cards/f/ForgeDevil.java b/Mage.Sets/src/mage/cards/f/ForgeDevil.java index 6229e8bbba7..a5ce17b7fa7 100644 --- a/Mage.Sets/src/mage/cards/f/ForgeDevil.java +++ b/Mage.Sets/src/mage/cards/f/ForgeDevil.java @@ -1,22 +1,20 @@ - package mage.cards.f; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.Effect; -import mage.abilities.effects.common.DamageControllerEffect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndYouEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** * - * @author anonymous + * @author xenohedron */ public final class ForgeDevil extends CardImpl { @@ -28,13 +26,8 @@ public final class ForgeDevil extends CardImpl { this.toughness = new MageInt(1); // When Forge Devil enters the battlefield, it deals 1 damage to target creature and 1 damage to you. - Effect effect = new DamageTargetEffect(1); - effect.setText("it deals 1 damage to target creature"); - Ability ability = new EntersBattlefieldTriggeredAbility(effect); + Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetAndYouEffect(1)); ability.addTarget(new TargetCreaturePermanent()); - effect = new DamageControllerEffect(1); - effect.setText("and 1 damage to you"); - ability.addEffect(effect); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/g/GoblinArtillery.java b/Mage.Sets/src/mage/cards/g/GoblinArtillery.java index 77b0946d7be..c5c19053734 100644 --- a/Mage.Sets/src/mage/cards/g/GoblinArtillery.java +++ b/Mage.Sets/src/mage/cards/g/GoblinArtillery.java @@ -4,8 +4,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.DamageControllerEffect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndYouEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -26,8 +25,9 @@ public final class GoblinArtillery extends CardImpl { this.power = new MageInt(1); this.toughness = new MageInt(3); - Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(2), new TapSourceCost()); - ability.addEffect(new DamageControllerEffect(3).setText("and 3 damage to you")); + + // {T}: This creature deals 2 damage to any target and 3 damage to you. + Ability ability = new SimpleActivatedAbility(new DamageTargetAndYouEffect(2, 3), new TapSourceCost()); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/g/GrangerGuildmage.java b/Mage.Sets/src/mage/cards/g/GrangerGuildmage.java index aa45d3eb1c8..c7dbd57ec8f 100644 --- a/Mage.Sets/src/mage/cards/g/GrangerGuildmage.java +++ b/Mage.Sets/src/mage/cards/g/GrangerGuildmage.java @@ -1,25 +1,23 @@ - package mage.cards.g; -import java.util.UUID; import mage.MageInt; 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.common.DamageControllerEffect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndYouEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.FirstStrikeAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; -import mage.constants.Zone; +import mage.constants.SubType; import mage.target.common.TargetAnyTarget; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** * * @author fireshoes @@ -34,9 +32,8 @@ public final class GrangerGuildmage extends CardImpl { this.toughness = new MageInt(1); // {R}, {tap}: Granger Guildmage deals 1 damage to any target and 1 damage to you. - Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(1), new ManaCostsImpl<>("{R}")); + Ability ability = new SimpleActivatedAbility(new DamageTargetAndYouEffect(1, 1), new ManaCostsImpl<>("{R}")); ability.addCost(new TapSourceCost()); - ability.addEffect(new DamageControllerEffect(1).setText("and 1 damage to you")); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/h/HailStorm.java b/Mage.Sets/src/mage/cards/h/HailStorm.java index 8668f420724..71c0938b515 100644 --- a/Mage.Sets/src/mage/cards/h/HailStorm.java +++ b/Mage.Sets/src/mage/cards/h/HailStorm.java @@ -1,14 +1,18 @@ - package mage.cards.h; -import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.effects.common.DamageControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.Outcome; import mage.filter.StaticFilters; import mage.filter.common.FilterAttackingCreature; +import mage.game.Game; + +import java.util.UUID; /** * @@ -20,9 +24,7 @@ public final class HailStorm extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{G}{G}"); // Hail Storm deals 2 damage to each attacking creature and 1 damage to you and each creature you control. - this.getSpellAbility().addEffect(new DamageAllEffect(2, new FilterAttackingCreature())); - this.getSpellAbility().addEffect(new DamageControllerEffect(1).setText("and 1 damage to you")); - this.getSpellAbility().addEffect(new DamageAllEffect(1, StaticFilters.FILTER_PERMANENT_CREATURE_CONTROLLED).setText("and each creature you control.")); + this.getSpellAbility().addEffect(new HailStormEffect()); } private HailStorm(final HailStorm card) { @@ -34,3 +36,32 @@ public final class HailStorm extends CardImpl { return new HailStorm(this); } } + +// needed for simultaneous damage +class HailStormEffect extends OneShotEffect { + + private static final FilterAttackingCreature filter = new FilterAttackingCreature(); + + HailStormEffect() { + super(Outcome.Benefit); + staticText = "{this} deals 2 damage to each attacking creature " + + "and 1 damage to you and each creature you control"; + } + + private HailStormEffect(final HailStormEffect effect) { + super(effect); + } + + @Override + public HailStormEffect copy() { + return new HailStormEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + new DamageAllEffect(2, filter).apply(game, source); + new DamageControllerEffect(1).apply(game, source); + new DamageAllEffect(1, StaticFilters.FILTER_PERMANENT_CREATURE_CONTROLLED).apply(game, source); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/h/HungryFlames.java b/Mage.Sets/src/mage/cards/h/HungryFlames.java index bd704cb8b14..d458bb6b8d2 100644 --- a/Mage.Sets/src/mage/cards/h/HungryFlames.java +++ b/Mage.Sets/src/mage/cards/h/HungryFlames.java @@ -1,14 +1,9 @@ package mage.cards.h; -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DamageTargetAndTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetPlayerOrPlaneswalker; @@ -22,10 +17,10 @@ public final class HungryFlames extends CardImpl { public HungryFlames(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{R}"); - // Hungry Flames deals 3 damage to target creature and 2 damage to target player. - this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - this.getSpellAbility().addTarget(new TargetPlayerOrPlaneswalker()); - this.getSpellAbility().addEffect(new HungryFlamesEffect()); + // Hungry Flames deals 3 damage to target creature and 2 damage to target player or planeswalker. + this.getSpellAbility().addTarget(new TargetCreaturePermanent().setTargetTag(1)); + this.getSpellAbility().addTarget(new TargetPlayerOrPlaneswalker().setTargetTag(2)); + this.getSpellAbility().addEffect(new DamageTargetAndTargetEffect(3, 2)); } private HungryFlames(final HungryFlames card) { @@ -37,37 +32,4 @@ public final class HungryFlames extends CardImpl { return new HungryFlames(this); } - private static class HungryFlamesEffect extends OneShotEffect { - - HungryFlamesEffect() { - super(Outcome.Damage); - this.staticText = "{this} deals 3 damage to target creature and 2 damage to target player or planeswalker"; - } - - private HungryFlamesEffect(final HungryFlamesEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getTargets().get(0).getFirstTarget()); - Player player = game.getPlayer(source.getTargets().get(1).getFirstTarget()); - - if (permanent != null) { - permanent.damage(3, source.getSourceId(), source, game, false, true); - } - - if (player != null) { - player.damage(2, source.getSourceId(), source, game); - } - - return true; - } - - @Override - public HungryFlamesEffect copy() { - return new HungryFlamesEffect(this); - } - } - } diff --git a/Mage.Sets/src/mage/cards/i/InsultInjury.java b/Mage.Sets/src/mage/cards/i/InsultInjury.java index 9a9caea0e0c..a55864cd52c 100644 --- a/Mage.Sets/src/mage/cards/i/InsultInjury.java +++ b/Mage.Sets/src/mage/cards/i/InsultInjury.java @@ -1,8 +1,8 @@ package mage.cards.i; import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.continuous.DamageCantBePreventedEffect; import mage.abilities.keyword.AftermathAbility; import mage.cards.CardSetInfo; @@ -13,10 +13,9 @@ import mage.constants.Outcome; import mage.constants.SpellAbilityType; import mage.game.Game; import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.players.Player; import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetPlayerOrPlaneswalker; +import mage.target.targetpointer.EachTargetPointer; import mage.util.CardUtil; import java.util.UUID; @@ -41,7 +40,7 @@ public final class InsultInjury extends SplitCard { getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true)); getRightHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent()); getRightHalfCard().getSpellAbility().addTarget(new TargetPlayerOrPlaneswalker()); - getRightHalfCard().getSpellAbility().addEffect(new InjuryEffect()); + getRightHalfCard().getSpellAbility().addEffect(new DamageTargetEffect(2).setTargetPointer(new EachTargetPointer())); } private InsultInjury(final InsultInjury card) { @@ -87,36 +86,3 @@ class InsultDoubleDamageEffect extends ReplacementEffectImpl { return false; } } - -class InjuryEffect extends OneShotEffect { - - InjuryEffect() { - super(Outcome.Damage); - this.staticText = "{this} deals 2 damage to target creature and 2 damage to target player or planeswalker"; - } - - private InjuryEffect(final InjuryEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getTargets().get(0).getFirstTarget()); - Player player = game.getPlayer(source.getTargets().get(1).getFirstTarget()); - - if (permanent != null) { - permanent.damage(2, source.getSourceId(), source, game, false, true); - } - - if (player != null) { - player.damage(2, source.getSourceId(), source, game); - } - - return true; - } - - @Override - public InjuryEffect copy() { - return new InjuryEffect(this); - } -} diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfRegatha.java b/Mage.Sets/src/mage/cards/i/InvasionOfRegatha.java index 6096e876853..f6068787a4b 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfRegatha.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfRegatha.java @@ -3,7 +3,7 @@ package mage.cards.i; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -14,7 +14,6 @@ import mage.filter.common.FilterPermanentOrPlayer; import mage.filter.predicate.mageobject.AnotherPredicate; import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetPermanentOrPlayer; -import mage.target.targetpointer.SecondTargetPointer; import java.util.UUID; @@ -43,19 +42,9 @@ public final class InvasionOfRegatha extends CardImpl { this.addAbility(new SiegeAbility()); // When Invasion of Regatha enters the battlefield, it deals 4 damage to another target battle or opponent and 1 damage to up to one target creature. - Ability ability = new EntersBattlefieldTriggeredAbility( - new DamageTargetEffect( - 4, true, - "another target battle or opponent", "it" - - ).setUseOnlyTargetPointer(true) - ); - ability.addTarget(new TargetPermanentOrPlayer(filter)); - ability.addEffect(new DamageTargetEffect(1) - .setUseOnlyTargetPointer(true) - .setTargetPointer(new SecondTargetPointer()) - .setText("and 1 damage to up to one target creature")); - ability.addTarget(new TargetCreaturePermanent(0, 1)); + Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetAndTargetEffect(4, 1)); + ability.addTarget(new TargetPermanentOrPlayer(filter).setTargetTag(1)); + ability.addTarget(new TargetCreaturePermanent(0, 1).setTargetTag(2)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/j/JudgmentBolt.java b/Mage.Sets/src/mage/cards/j/JudgmentBolt.java index d0581aa5d85..164fc2740aa 100644 --- a/Mage.Sets/src/mage/cards/j/JudgmentBolt.java +++ b/Mage.Sets/src/mage/cards/j/JudgmentBolt.java @@ -1,16 +1,19 @@ package mage.cards.j; +import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; -import mage.abilities.effects.common.DamageTargetControllerEffect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DamageTargetAndTargetControllerEffect; import mage.abilities.hint.Hint; import mage.abilities.hint.ValueHint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.Outcome; import mage.constants.SubType; import mage.filter.common.FilterControlledPermanent; +import mage.game.Game; import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -20,16 +23,14 @@ import java.util.UUID; */ public final class JudgmentBolt extends CardImpl { - private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(new FilterControlledPermanent(SubType.EQUIPMENT)); + static final DynamicValue xValue = new PermanentsOnBattlefieldCount(new FilterControlledPermanent(SubType.EQUIPMENT)); private static final Hint hint = new ValueHint("Equipment you control", xValue); public JudgmentBolt(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{R}"); // Judgment Bolt deals 5 damage to target creature and X damage to that creature's controller, where X is the number of Equipment you control. - this.getSpellAbility().addEffect(new DamageTargetEffect(5)); - this.getSpellAbility().addEffect(new DamageTargetControllerEffect(xValue) - .setText("and X damage to that creature's controller, where X is the number of Equipment you control")); + this.getSpellAbility().addEffect(new JudgmentBoltEffect()); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addHint(hint); } @@ -43,3 +44,28 @@ public final class JudgmentBolt extends CardImpl { return new JudgmentBolt(this); } } + +// too lazy to handle dynamic value properly in the common class +class JudgmentBoltEffect extends OneShotEffect { + + JudgmentBoltEffect() { + super(Outcome.Benefit); + staticText = "{this} deals 5 damage to target creature and X damage to that creature's controller," + + " where X is the number of Equipment you control"; + } + + private JudgmentBoltEffect(final JudgmentBoltEffect effect) { + super(effect); + } + + @Override + public JudgmentBoltEffect copy() { + return new JudgmentBoltEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return new DamageTargetAndTargetControllerEffect(5, JudgmentBolt.xValue.calculate(game, source, this)) + .apply(game, source); + } +} diff --git a/Mage.Sets/src/mage/cards/k/KamahlsSledge.java b/Mage.Sets/src/mage/cards/k/KamahlsSledge.java index 2349adb94c2..38f2f014855 100644 --- a/Mage.Sets/src/mage/cards/k/KamahlsSledge.java +++ b/Mage.Sets/src/mage/cards/k/KamahlsSledge.java @@ -2,7 +2,7 @@ package mage.cards.k; import mage.abilities.condition.common.ThresholdCondition; import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.DamageTargetControllerEffect; +import mage.abilities.effects.common.DamageTargetAndTargetControllerEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -21,15 +21,16 @@ public final class KamahlsSledge extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{5}{R}{R}"); // Kamahl's Sledge deals 4 damage to target creature. - this.getSpellAbility().addEffect(new DamageTargetEffect(4)); - this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - // Threshold - If seven or more cards are in your graveyard, instead Kamahl's Sledge deals 4 damage to that creature and 4 damage to that creature's controller. this.getSpellAbility().addEffect(new ConditionalOneShotEffect( - new DamageTargetControllerEffect(4), ThresholdCondition.instance, "
" + - AbilityWord.THRESHOLD.formatWord() + "If seven or more cards are in your graveyard, " + - "instead {this} deals 4 damage to that creature and 4 damage to that creature's controller." + new DamageTargetAndTargetControllerEffect(4, 4), + new DamageTargetEffect(4), + ThresholdCondition.instance, + "{this} deals 4 damage to target creature.
" + + AbilityWord.THRESHOLD.formatWord() + "If seven or more cards are in your graveyard, " + + "instead {this} deals 4 damage to that creature and 4 damage to that creature's controller." )); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } private KamahlsSledge(final KamahlsSledge card) { diff --git a/Mage.Sets/src/mage/cards/l/Lunge.java b/Mage.Sets/src/mage/cards/l/Lunge.java index b3bb6efb96f..feb397b976c 100644 --- a/Mage.Sets/src/mage/cards/l/Lunge.java +++ b/Mage.Sets/src/mage/cards/l/Lunge.java @@ -1,15 +1,13 @@ - package mage.cards.l; -import java.util.UUID; -import mage.abilities.effects.Effect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetPlayerOrPlaneswalker; -import mage.target.targetpointer.SecondTargetPointer; + +import java.util.UUID; /** * @@ -21,14 +19,10 @@ public final class Lunge extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{R}"); // Lunge deals 2 damage to target creature and 2 damage to target player. - this.getSpellAbility().addEffect(new DamageTargetEffect(2).setUseOnlyTargetPointer(true)); - this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addEffect(new DamageTargetAndTargetEffect(2, 2)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent().setTargetTag(1)); + this.getSpellAbility().addTarget(new TargetPlayerOrPlaneswalker().setTargetTag(2)); - Effect effect = new DamageTargetEffect(2).setUseOnlyTargetPointer(true); - effect.setTargetPointer(new SecondTargetPointer()); - effect.setText("and 2 damage to target player or planeswalker"); - this.getSpellAbility().addEffect(effect); - this.getSpellAbility().addTarget(new TargetPlayerOrPlaneswalker()); } private Lunge(final Lunge card) { diff --git a/Mage.Sets/src/mage/cards/n/NeonatesRush.java b/Mage.Sets/src/mage/cards/n/NeonatesRush.java index 148c3eeb053..b907fd0b0b3 100644 --- a/Mage.Sets/src/mage/cards/n/NeonatesRush.java +++ b/Mage.Sets/src/mage/cards/n/NeonatesRush.java @@ -1,10 +1,9 @@ package mage.cards.n; -import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DamageTargetAndTargetControllerEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.cost.SpellCostReductionSourceEffect; import mage.abilities.hint.ConditionHint; @@ -12,13 +11,9 @@ import mage.abilities.hint.Hint; 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.FilterPermanent; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -42,7 +37,8 @@ public final class NeonatesRush extends CardImpl { ).addHint(hint).setRuleAtTheTop(true)); // Neonate's Rush deals 1 damage to target creature and 1 damage to its controller. Draw a card. - this.getSpellAbility().addEffect(new NeonatesRushEffect()); + this.getSpellAbility().addEffect(new DamageTargetAndTargetControllerEffect(1, 1) + .setText("{this} deals 1 damage to target creature and 1 damage to its controller")); this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } @@ -56,34 +52,3 @@ public final class NeonatesRush extends CardImpl { return new NeonatesRush(this); } } - -class NeonatesRushEffect extends OneShotEffect { - - NeonatesRushEffect() { - super(Outcome.Benefit); - staticText = "{this} deals 1 damage to target creature and 1 damage to its controller."; - } - - private NeonatesRushEffect(final NeonatesRushEffect effect) { - super(effect); - } - - @Override - public NeonatesRushEffect copy() { - return new NeonatesRushEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getFirstTarget()); - if (permanent == null) { - return false; - } - permanent.damage(1, source.getSourceId(), source, game); - Player player = game.getPlayer(permanent.getControllerId()); - if (player != null) { - player.damage(1, source.getSourceId(), source, game); - } - return true; - } -} diff --git a/Mage.Sets/src/mage/cards/o/OrcishArtillery.java b/Mage.Sets/src/mage/cards/o/OrcishArtillery.java index c4589153f12..52f7b05ec24 100644 --- a/Mage.Sets/src/mage/cards/o/OrcishArtillery.java +++ b/Mage.Sets/src/mage/cards/o/OrcishArtillery.java @@ -1,20 +1,18 @@ - package mage.cards.o; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.DamageControllerEffect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndYouEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.Zone; import mage.target.common.TargetAnyTarget; +import java.util.UUID; + /** * * @author Plopman @@ -30,9 +28,8 @@ public final class OrcishArtillery extends CardImpl { this.toughness = new MageInt(3); // {tap}: Orcish Artillery deals 2 damage to any target and 3 damage to you. - Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(2), new TapSourceCost()); + Ability ability = new SimpleActivatedAbility(new DamageTargetAndYouEffect(2, 3), new TapSourceCost()); ability.addTarget(new TargetAnyTarget()); - ability.addEffect(new DamageControllerEffect(3).setText("and 3 damage to you")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/o/OrcishCannonade.java b/Mage.Sets/src/mage/cards/o/OrcishCannonade.java index fe965ea9193..c33c70f1ae6 100644 --- a/Mage.Sets/src/mage/cards/o/OrcishCannonade.java +++ b/Mage.Sets/src/mage/cards/o/OrcishCannonade.java @@ -1,16 +1,14 @@ - package mage.cards.o; -import java.util.UUID; -import mage.abilities.effects.Effect; -import mage.abilities.effects.common.DamageControllerEffect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndYouEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.target.common.TargetAnyTarget; +import java.util.UUID; + /** * * @author LevelX2 @@ -21,11 +19,9 @@ public final class OrcishCannonade extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{R}{R}"); // Orcish Cannonade deals 2 damage to any target and 3 damage to you. - this.getSpellAbility().addEffect(new DamageTargetEffect(2)); + this.getSpellAbility().addEffect(new DamageTargetAndYouEffect(2, 3)); this.getSpellAbility().addTarget(new TargetAnyTarget()); - Effect effect = new DamageControllerEffect(3); - effect.setText("and 3 damage to you"); - this.getSpellAbility().addEffect(effect); + // Draw a card. this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("
")); } diff --git a/Mage.Sets/src/mage/cards/o/OrcishCannoneers.java b/Mage.Sets/src/mage/cards/o/OrcishCannoneers.java index bf873ae3736..a2ad2abab8a 100644 --- a/Mage.Sets/src/mage/cards/o/OrcishCannoneers.java +++ b/Mage.Sets/src/mage/cards/o/OrcishCannoneers.java @@ -1,21 +1,18 @@ - package mage.cards.o; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.Effect; -import mage.abilities.effects.common.DamageControllerEffect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndYouEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.Zone; import mage.target.common.TargetAnyTarget; +import java.util.UUID; + /** * * @author LoneFox @@ -31,10 +28,8 @@ public final class OrcishCannoneers extends CardImpl { this.toughness = new MageInt(3); // {tap}: Orcish Cannoneers deals 2 damage to any target and 3 damage to you. - Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(2), new TapSourceCost()); ability.addTarget(new TargetAnyTarget()); - Effect effect = new DamageControllerEffect(3); - effect.setText("and 3 damage to you"); - ability.addEffect(effect); + Ability ability = new SimpleActivatedAbility(new DamageTargetAndYouEffect(2, 3), new TapSourceCost()); + ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/p/PsionicBlast.java b/Mage.Sets/src/mage/cards/p/PsionicBlast.java index 254ff05fe3d..47ca09ad239 100644 --- a/Mage.Sets/src/mage/cards/p/PsionicBlast.java +++ b/Mage.Sets/src/mage/cards/p/PsionicBlast.java @@ -1,7 +1,6 @@ package mage.cards.p; -import mage.abilities.effects.common.DamageControllerEffect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndYouEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -18,8 +17,7 @@ public final class PsionicBlast extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}"); // Psionic Blast deals 4 damage to any target and 2 damage to you. - this.getSpellAbility().addEffect(new DamageTargetEffect(4)); - this.getSpellAbility().addEffect(new DamageControllerEffect(2).setText("and 2 damage to you")); + this.getSpellAbility().addEffect(new DamageTargetAndYouEffect(4, 2)); this.getSpellAbility().addTarget(new TargetAnyTarget()); } diff --git a/Mage.Sets/src/mage/cards/p/PsionicEntity.java b/Mage.Sets/src/mage/cards/p/PsionicEntity.java index 02b0b3a1e10..3c7121bef86 100644 --- a/Mage.Sets/src/mage/cards/p/PsionicEntity.java +++ b/Mage.Sets/src/mage/cards/p/PsionicEntity.java @@ -1,20 +1,18 @@ - package mage.cards.p; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.DamageSelfEffect; -import mage.abilities.effects.common.DamageTargetEffect; -import mage.constants.SubType; +import mage.abilities.effects.common.DamageTargetAndSelfEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Zone; +import mage.constants.SubType; import mage.target.common.TargetAnyTarget; +import java.util.UUID; + /** * * @author TheElk801 @@ -29,8 +27,7 @@ public final class PsionicEntity extends CardImpl { this.toughness = new MageInt(2); // {tap}: Psionic Entity deals 2 damage to any target and 3 damage to itself. - Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(2), new TapSourceCost()); - ability.addEffect(new DamageSelfEffect(3).setText("and 3 damage to itself")); + Ability ability = new SimpleActivatedAbility(new DamageTargetAndSelfEffect(2, 3), new TapSourceCost()); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/p/PsionicSliver.java b/Mage.Sets/src/mage/cards/p/PsionicSliver.java index beb44bdeed6..08eb41473cb 100644 --- a/Mage.Sets/src/mage/cards/p/PsionicSliver.java +++ b/Mage.Sets/src/mage/cards/p/PsionicSliver.java @@ -1,28 +1,24 @@ - package mage.cards.p; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.DamageSelfEffect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndSelfEffect; import mage.abilities.effects.common.continuous.GainAbilityAllEffect; 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 mage.filter.common.FilterCreaturePermanent; import mage.target.common.TargetAnyTarget; +import java.util.UUID; + /** - * - * @author anonymous - * @see mage.sets.seventhedition.RecklessEmbermage + * @author xenohedron */ public final class PsionicSliver extends CardImpl { @@ -35,11 +31,7 @@ public final class PsionicSliver extends CardImpl { this.toughness = new MageInt(2); // All Sliver creatures have "{T}: This creature deals 2 damage to any target and 3 damage to itself." - Ability ability = new SimpleActivatedAbility( - new DamageTargetEffect(2).setText("This creature deals 2 damage to any target"), - new TapSourceCost() - ); - ability.addEffect(new DamageSelfEffect(3).setText("3 damage to itself.")); + Ability ability = new SimpleActivatedAbility(new DamageTargetAndSelfEffect(2, 3), new TapSourceCost()); ability.addTarget(new TargetAnyTarget()); this.addAbility( new SimpleStaticAbility(new GainAbilityAllEffect(ability, Duration.WhileOnBattlefield, filter, diff --git a/Mage.Sets/src/mage/cards/p/PunishTheEnemy.java b/Mage.Sets/src/mage/cards/p/PunishTheEnemy.java index aa474c088ee..a56e57185f6 100644 --- a/Mage.Sets/src/mage/cards/p/PunishTheEnemy.java +++ b/Mage.Sets/src/mage/cards/p/PunishTheEnemy.java @@ -1,15 +1,14 @@ - package mage.cards.p; -import java.util.UUID; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.target.Target; import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetPlayerOrPlaneswalker; +import java.util.UUID; + /** * * @author LevelX2 @@ -20,11 +19,9 @@ public final class PunishTheEnemy extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{R}"); // Punish the Enemy deals 3 damage to target player and 3 damage to target creature. - this.getSpellAbility().addEffect(new DamageTargetEffect(3, true, "target player or planeswalker and 3 damage to target creature")); - Target target = new TargetPlayerOrPlaneswalker(); - this.getSpellAbility().addTarget(target); - target = new TargetCreaturePermanent(); - this.getSpellAbility().addTarget(target); + this.getSpellAbility().addEffect(new DamageTargetAndTargetEffect(3, 3)); + this.getSpellAbility().addTarget(new TargetPlayerOrPlaneswalker().setTargetTag(1)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent().setTargetTag(2)); } private PunishTheEnemy(final PunishTheEnemy card) { diff --git a/Mage.Sets/src/mage/cards/r/RadiatingLightning.java b/Mage.Sets/src/mage/cards/r/RadiatingLightning.java index 106f3759b40..afd1b213b5d 100644 --- a/Mage.Sets/src/mage/cards/r/RadiatingLightning.java +++ b/Mage.Sets/src/mage/cards/r/RadiatingLightning.java @@ -1,12 +1,10 @@ - package mage.cards.r; -import mage.abilities.effects.common.DamageAllControlledTargetEffect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndAllControlledEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.target.TargetPlayer; import java.util.UUID; @@ -20,10 +18,9 @@ public final class RadiatingLightning extends CardImpl { public RadiatingLightning(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{3}{R}"); - // Radiating Lightning deals 3 damage to target player and 1 damage to each creature that player controls. - this.getSpellAbility().addEffect(new DamageTargetEffect(3)); - this.getSpellAbility().addEffect(new DamageAllControlledTargetEffect(1, new FilterCreaturePermanent()).setText("and 1 damage to each creature that player controls")); + this.getSpellAbility().addEffect(new DamageTargetAndAllControlledEffect( + 3, 1, StaticFilters.FILTER_PERMANENT_CREATURE)); this.getSpellAbility().addTarget(new TargetPlayer()); } diff --git a/Mage.Sets/src/mage/cards/r/RakdosFirewheeler.java b/Mage.Sets/src/mage/cards/r/RakdosFirewheeler.java index e9db64acfe7..aa004843f01 100644 --- a/Mage.Sets/src/mage/cards/r/RakdosFirewheeler.java +++ b/Mage.Sets/src/mage/cards/r/RakdosFirewheeler.java @@ -3,8 +3,7 @@ package mage.cards.r; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.Effect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -29,11 +28,9 @@ public final class RakdosFirewheeler extends CardImpl { this.toughness = new MageInt(3); // When Rakdos Firewheeler enters the battlefield, it deals 2 damage to target opponent and 2 damage to up to one target creature or planeswalker. - Effect effect = new DamageTargetEffect(2); - effect.setText("it deals 2 damage to target opponent and 2 damage to up to one target creature or planeswalker"); - Ability ability = new EntersBattlefieldTriggeredAbility(effect, false); - ability.addTarget(new TargetOpponent()); - ability.addTarget(new TargetCreatureOrPlaneswalker(0, 1)); + Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetAndTargetEffect(2, 2)); + ability.addTarget(new TargetOpponent().setTargetTag(1)); + ability.addTarget(new TargetCreatureOrPlaneswalker(0, 1).setTargetTag(2)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/r/RecklessRage.java b/Mage.Sets/src/mage/cards/r/RecklessRage.java index 79b30f0ec35..c052f4c0c8a 100644 --- a/Mage.Sets/src/mage/cards/r/RecklessRage.java +++ b/Mage.Sets/src/mage/cards/r/RecklessRage.java @@ -1,19 +1,15 @@ package mage.cards.r; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.StaticFilters; import mage.target.TargetPermanent; import mage.target.common.TargetControlledCreaturePermanent; -import mage.target.common.TargetCreaturePermanent; -import mage.target.targetpointer.SecondTargetPointer; import java.util.UUID; -import static mage.filter.StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL; - /** * @author JayDi85 */ @@ -23,12 +19,9 @@ public final class RecklessRage extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{R}"); // Reckless Rage deals 4 damage to target creature you don't control and 2 damage to target creature you control. - this.getSpellAbility().addTarget(new TargetPermanent(FILTER_CREATURE_YOU_DONT_CONTROL)); - this.getSpellAbility().addEffect(new DamageTargetEffect(4).setUseOnlyTargetPointer(true)); - this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent()); - this.getSpellAbility().addEffect(new DamageTargetEffect(2).setUseOnlyTargetPointer(true) - .setText("and 2 damage to target creature you control") - .setTargetPointer(new SecondTargetPointer())); + this.getSpellAbility().addEffect(new DamageTargetAndTargetEffect(4, 2)); + this.getSpellAbility().addTarget(new TargetPermanent(StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL).setTargetTag(1)); + this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent().setTargetTag(2)); } private RecklessRage(final RecklessRage card) { diff --git a/Mage.Sets/src/mage/cards/s/SeismicWave.java b/Mage.Sets/src/mage/cards/s/SeismicWave.java index ebc6f6a8e18..e3cf4e810a4 100644 --- a/Mage.Sets/src/mage/cards/s/SeismicWave.java +++ b/Mage.Sets/src/mage/cards/s/SeismicWave.java @@ -28,8 +28,8 @@ public final class SeismicWave extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{R}"); // Seismic Wave deals 2 damage to any target and 1 damage to each nonartifact creature target opponent controls. - this.getSpellAbility().addTarget(new TargetAnyTarget().withChooseHint("2 damage")); - this.getSpellAbility().addTarget(new TargetOpponent().withChooseHint("1 damage to each nonartifact creature target opponent controls")); + this.getSpellAbility().addTarget(new TargetAnyTarget().withChooseHint("to deal 2 damage")); + this.getSpellAbility().addTarget(new TargetOpponent().withChooseHint("1 damage to each nonartifact creature they control")); this.getSpellAbility().addEffect(new SeismicWaveEffect()); } @@ -51,7 +51,7 @@ class SeismicWaveEffect extends OneShotEffect { filter.add(Predicates.not(CardType.ARTIFACT.getPredicate())); } - public SeismicWaveEffect() { + SeismicWaveEffect() { super(Outcome.Damage); this.staticText = "{this} deals 2 damage to any target and 1 damage to each nonartifact creature target opponent controls"; } diff --git a/Mage.Sets/src/mage/cards/s/SelfDestruct.java b/Mage.Sets/src/mage/cards/s/SelfDestruct.java index 8e57a76ef4c..4d4fbb70754 100644 --- a/Mage.Sets/src/mage/cards/s/SelfDestruct.java +++ b/Mage.Sets/src/mage/cards/s/SelfDestruct.java @@ -89,7 +89,7 @@ class SelfDestructEffect extends OneShotEffect { if (player != null) { player.damage(power, creature.getId(), source, game); } - permanent.damage(power, permanent.getId(), source, game); + creature.damage(power, creature.getId(), source, game); return true; } } diff --git a/Mage.Sets/src/mage/cards/s/ShadowGuildmage.java b/Mage.Sets/src/mage/cards/s/ShadowGuildmage.java index af5c2d262a4..eafc596a173 100644 --- a/Mage.Sets/src/mage/cards/s/ShadowGuildmage.java +++ b/Mage.Sets/src/mage/cards/s/ShadowGuildmage.java @@ -1,21 +1,20 @@ package mage.cards.s; -import java.util.UUID; import mage.MageInt; 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.common.DamageControllerEffect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndYouEffect; import mage.abilities.effects.common.PutOnLibraryTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.Zone; -import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetAnyTarget; +import mage.target.common.TargetControlledCreaturePermanent; + +import java.util.UUID; /** * @@ -37,9 +36,8 @@ public final class ShadowGuildmage extends CardImpl { this.addAbility(ability); // {R}, {tap}: Shadow Guildmage deals 1 damage to any target and 1 damage to you. - ability = new SimpleActivatedAbility(new DamageTargetEffect(1), new ManaCostsImpl<>("{R}")); + ability = new SimpleActivatedAbility(new DamageTargetAndYouEffect(1, 1), new ManaCostsImpl<>("{R}")); ability.addCost(new TapSourceCost()); - ability.addEffect(new DamageControllerEffect(1).setText("and 1 damage to you")); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/ShockerUnshakable.java b/Mage.Sets/src/mage/cards/s/ShockerUnshakable.java index 661ecfe7032..d4a1b2c57d1 100644 --- a/Mage.Sets/src/mage/cards/s/ShockerUnshakable.java +++ b/Mage.Sets/src/mage/cards/s/ShockerUnshakable.java @@ -6,8 +6,7 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.MyTurnCondition; import mage.abilities.decorator.ConditionalContinuousEffect; -import mage.abilities.effects.common.DamageTargetControllerEffect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndTargetControllerEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.FirstStrikeAbility; import mage.cards.CardImpl; @@ -42,8 +41,7 @@ public final class ShockerUnshakable extends CardImpl { ))); // Vibro-Shock Gauntlets -- When Shocker enters, he deals 2 damage to target creature and 2 damage to that creature's controller. - Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(2, "he")); - ability.addEffect(new DamageTargetControllerEffect(2).setText("and 2 damage to that creature's controller")); + Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetAndTargetControllerEffect(2, 2)); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability.withFlavorWord("Vibro-Shock Gauntlets")); } diff --git a/Mage.Sets/src/mage/cards/s/ShowerOfSparks.java b/Mage.Sets/src/mage/cards/s/ShowerOfSparks.java index db144515b38..8d13d17e372 100644 --- a/Mage.Sets/src/mage/cards/s/ShowerOfSparks.java +++ b/Mage.Sets/src/mage/cards/s/ShowerOfSparks.java @@ -1,13 +1,14 @@ package mage.cards.s; -import java.util.UUID; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetPlayerOrPlaneswalker; +import java.util.UUID; + /** * * @author LevelX2 @@ -17,10 +18,10 @@ public final class ShowerOfSparks extends CardImpl { public ShowerOfSparks(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{R}"); - // Shower of sparks deals 1 damage to target creature and 1 damage to target player. - this.getSpellAbility().addEffect(new DamageTargetEffect(1, true, "target creature and 1 damage to target player or planeswalker")); - this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - this.getSpellAbility().addTarget(new TargetPlayerOrPlaneswalker()); + // Shower of Sparks deals 1 damage to target creature and 1 damage to target player or planeswalker. + this.getSpellAbility().addEffect(new DamageTargetAndTargetEffect(1, 1)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent().setTargetTag(1)); + this.getSpellAbility().addTarget(new TargetPlayerOrPlaneswalker().setTargetTag(2)); } private ShowerOfSparks(final ShowerOfSparks card) { diff --git a/Mage.Sets/src/mage/cards/s/SoulOfShandalar.java b/Mage.Sets/src/mage/cards/s/SoulOfShandalar.java index f18b7cf1613..5b4fe81e8b6 100644 --- a/Mage.Sets/src/mage/cards/s/SoulOfShandalar.java +++ b/Mage.Sets/src/mage/cards/s/SoulOfShandalar.java @@ -1,4 +1,3 @@ - package mage.cards.s; import mage.MageInt; @@ -93,7 +92,7 @@ class SoulOfShandalarEffect extends OneShotEffect { class SoulOfShandalarTarget extends TargetPermanent { - public SoulOfShandalarTarget() { + SoulOfShandalarTarget() { super(0, 1, new FilterCreaturePermanent("creature that the targeted player or planeswalker's controller controls")); } diff --git a/Mage.Sets/src/mage/cards/s/Sparksmith.java b/Mage.Sets/src/mage/cards/s/Sparksmith.java index 7a11696bfc3..158c416bd05 100644 --- a/Mage.Sets/src/mage/cards/s/Sparksmith.java +++ b/Mage.Sets/src/mage/cards/s/Sparksmith.java @@ -1,35 +1,30 @@ - package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; -import mage.abilities.effects.common.DamageControllerEffect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DamageTargetAndYouEffect; 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.FilterPermanent; +import mage.game.Game; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** * * @author Plopman */ public final class Sparksmith extends CardImpl { - private static final FilterPermanent filter = new FilterPermanent("Goblins on the battlefield"); - static { - filter.add(SubType.GOBLIN.getPredicate()); - } - private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(filter); - public Sparksmith(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{R}"); this.subtype.add(SubType.GOBLIN); @@ -38,11 +33,8 @@ public final class Sparksmith extends CardImpl { this.toughness = new MageInt(1); // {tap}: Sparksmith deals X damage to target creature and X damage to you, where X is the number of Goblins on the battlefield. - Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(xValue) - .setText("{this} deals X damage to target creature"), new TapSourceCost()); + Ability ability = new SimpleActivatedAbility(new SparksmithEffect(), new TapSourceCost()); ability.addTarget(new TargetCreaturePermanent()); - ability.addEffect(new DamageControllerEffect(xValue) - .setText("and X damage to you, where X is the number of Goblins on the battlefield")); this.addAbility(ability); } @@ -55,3 +47,35 @@ public final class Sparksmith extends CardImpl { return new Sparksmith(this); } } + +// too lazy to handle dynamic value properly in the common class +class SparksmithEffect extends OneShotEffect { + + + private static final FilterPermanent filter = new FilterPermanent("Goblins on the battlefield"); + static { + filter.add(SubType.GOBLIN.getPredicate()); + } + private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(filter); + + SparksmithEffect() { + super(Outcome.Benefit); + staticText = "{this} deals X damage to target creature and X damage to you, " + + "where X is the number of Goblins on the battlefield"; + } + + private SparksmithEffect(final SparksmithEffect effect) { + super(effect); + } + + @Override + public SparksmithEffect copy() { + return new SparksmithEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + int amount = xValue.calculate(game, source, this); + return new DamageTargetAndYouEffect(amount, amount).apply(game, source); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SunflareShaman.java b/Mage.Sets/src/mage/cards/s/SunflareShaman.java index 70e6d1ada1a..31a468e6fa8 100644 --- a/Mage.Sets/src/mage/cards/s/SunflareShaman.java +++ b/Mage.Sets/src/mage/cards/s/SunflareShaman.java @@ -1,26 +1,24 @@ - package mage.cards.s; -import java.util.UUID; import mage.MageInt; 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.OneShotEffect; -import mage.abilities.effects.common.DamageSelfEffect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndSelfEffect; 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.FilterCard; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetAnyTarget; +import java.util.UUID; + /** * * @author jeffwadsworth @@ -60,7 +58,7 @@ class SunflareShamanEffect extends OneShotEffect { filter.add(SubType.ELEMENTAL.getPredicate()); } - public SunflareShamanEffect() { + SunflareShamanEffect() { super(Outcome.Damage); this.staticText = "{this} deals X damage to any target and X damage to itself, where X is the number of Elemental cards in your graveyard"; } @@ -78,9 +76,8 @@ class SunflareShamanEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - int ElementalsInYourGraveyard = controller.getGraveyard().count(filter, game); - new DamageTargetEffect(ElementalsInYourGraveyard).apply(game, source); - new DamageSelfEffect(ElementalsInYourGraveyard).apply(game, source); + int amount = controller.getGraveyard().count(filter, game); + new DamageTargetAndSelfEffect(amount, amount).apply(game, source); return true; } return false; diff --git a/Mage.Sets/src/mage/cards/s/SynchronizedSpellcraft.java b/Mage.Sets/src/mage/cards/s/SynchronizedSpellcraft.java index 1a4e756ff70..699427c2482 100644 --- a/Mage.Sets/src/mage/cards/s/SynchronizedSpellcraft.java +++ b/Mage.Sets/src/mage/cards/s/SynchronizedSpellcraft.java @@ -3,15 +3,13 @@ package mage.cards.s; import mage.abilities.Ability; import mage.abilities.dynamicvalue.common.PartyCount; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndTargetControllerEffect; import mage.abilities.hint.common.PartyCountHint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -25,7 +23,6 @@ public final class SynchronizedSpellcraft extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{R}"); // Synchronized Spellcraft deals 4 damage to target creature and X damage to that creature's controller, where X is the number of creatures in your party. - this.getSpellAbility().addEffect(new DamageTargetEffect(4)); this.getSpellAbility().addEffect(new SynchronizedSpellcraftEffect()); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addHint(PartyCountHint.instance); @@ -45,7 +42,8 @@ class SynchronizedSpellcraftEffect extends OneShotEffect { SynchronizedSpellcraftEffect() { super(Outcome.Benefit); - staticText = "and X damage to that creature's controller, " + + staticText = "{this} deals 4 damage to target creature " + + "and X damage to that creature's controller, " + "where X is the number of creatures in your party. " + PartyCount.getReminder(); } @@ -60,18 +58,7 @@ class SynchronizedSpellcraftEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int partyCount = PartyCount.instance.calculate(game, source, this); - if (partyCount < 1) { - return false; - } - Permanent permanent = game.getPermanentOrLKIBattlefield(source.getFirstTarget()); - if (permanent == null) { - return false; - } - Player player = game.getPlayer(permanent.getControllerId()); - if (player == null) { - return false; - } - return player.damage(partyCount, source.getSourceId(), source, game) > 0; + int amount = PartyCount.instance.calculate(game, source, this); + return new DamageTargetAndTargetControllerEffect(4, amount).apply(game, source); } } diff --git a/Mage.Sets/src/mage/cards/t/TheFallOfKroog.java b/Mage.Sets/src/mage/cards/t/TheFallOfKroog.java index 2d16a039f9d..c52ca2da726 100644 --- a/Mage.Sets/src/mage/cards/t/TheFallOfKroog.java +++ b/Mage.Sets/src/mage/cards/t/TheFallOfKroog.java @@ -2,8 +2,7 @@ package mage.cards.t; import mage.MageItem; import mage.abilities.Ability; -import mage.abilities.effects.common.DamageAllControlledTargetEffect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndAllControlledEffect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -32,12 +31,9 @@ public final class TheFallOfKroog extends CardImpl { this.getSpellAbility().addEffect(new DestroyTargetEffect() .setText("choose target opponent. Destroy target land that player controls") .setTargetPointer(new SecondTargetPointer())); - this.getSpellAbility().addEffect(new DamageTargetEffect( - 3, true, "that player" - )); - this.getSpellAbility().addEffect(new DamageAllControlledTargetEffect( - 1, StaticFilters.FILTER_PERMANENT_CREATURE - ).setText("and 1 damage to each creature they control")); + this.getSpellAbility().addEffect(new DamageTargetAndAllControlledEffect( + 3, 1, StaticFilters.FILTER_PERMANENT_CREATURE + ).setText("{this} deals 3 damage to that player and 1 damage to each creature they control")); this.getSpellAbility().addTarget(new TargetOpponent()); this.getSpellAbility().addTarget(new TheFallOfKroogTarget()); } diff --git a/Mage.Sets/src/mage/cards/t/TrickShot.java b/Mage.Sets/src/mage/cards/t/TrickShot.java index 9eeb2b6385f..e233fc090af 100644 --- a/Mage.Sets/src/mage/cards/t/TrickShot.java +++ b/Mage.Sets/src/mage/cards/t/TrickShot.java @@ -1,6 +1,6 @@ package mage.cards.t; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -9,7 +9,6 @@ import mage.filter.predicate.other.AnotherTargetPredicate; import mage.filter.predicate.permanent.TokenPredicate; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetpointer.SecondTargetPointer; import java.util.UUID; @@ -31,12 +30,7 @@ public final class TrickShot extends CardImpl { // Trick Shot deals 6 damage to target creature and 2 damage to up to one other target creature token. this.getSpellAbility().addTarget(new TargetCreaturePermanent().setTargetTag(1)); this.getSpellAbility().addTarget(new TargetPermanent(0, 1, filter).setTargetTag(2)); - this.getSpellAbility().addEffect(new DamageTargetEffect(6, true, "", true)); - this.getSpellAbility().addEffect( - new DamageTargetEffect(2, true, "", true) - .setTargetPointer(new SecondTargetPointer()) - .setText("and 2 damage to up to one other target creature token") - ); + this.getSpellAbility().addEffect(new DamageTargetAndTargetEffect(6, 2)); } private TrickShot(final TrickShot card) { diff --git a/Mage.Sets/src/mage/cards/u/UnleashShell.java b/Mage.Sets/src/mage/cards/u/UnleashShell.java index a52d7e657df..ffd4fd4c34d 100644 --- a/Mage.Sets/src/mage/cards/u/UnleashShell.java +++ b/Mage.Sets/src/mage/cards/u/UnleashShell.java @@ -1,14 +1,13 @@ package mage.cards.u; -import java.util.UUID; - -import mage.abilities.effects.common.DamageTargetControllerEffect; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DamageTargetAndTargetControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.target.common.TargetCreatureOrPlaneswalker; +import java.util.UUID; + /** * * @author weirddan455 @@ -19,9 +18,8 @@ public final class UnleashShell extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{R}{R}"); // Unleash Shell deals 5 damage to target creature or planeswalker and 2 damage to that permanent's controller. - this.getSpellAbility().addEffect(new DamageTargetEffect(5)); - this.getSpellAbility().addEffect(new DamageTargetControllerEffect(2).setText("and 2 damage to that permanent's controller")); this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker()); + this.getSpellAbility().addEffect(new DamageTargetAndTargetControllerEffect(5, 2)); } private UnleashShell(final UnleashShell card) { diff --git a/Mage.Sets/src/mage/cards/w/WildfireHowl.java b/Mage.Sets/src/mage/cards/w/WildfireHowl.java index c61f9d097a4..e897682c8de 100644 --- a/Mage.Sets/src/mage/cards/w/WildfireHowl.java +++ b/Mage.Sets/src/mage/cards/w/WildfireHowl.java @@ -33,6 +33,8 @@ public final class WildfireHowl extends CardImpl { GiftWasPromisedCondition.TRUE, "{this} deals 2 damage to each creature. " + "If the gift was promised, instead {this} deals 1 damage to any target and 2 damage to each creature" ).addEffect(new DamageAllEffect(2, StaticFilters.FILTER_PERMANENT_CREATURE))); + // ConditionalOneShotEffect doesn't call processAction between effects, so currently works + // if that gets changed (which it perhaps should?) then need to make this a single effect this.getSpellAbility().setTargetAdjuster(new ConditionalTargetAdjuster( GiftWasPromisedCondition.TRUE, new TargetAnyTarget() )); diff --git a/Mage/src/main/java/mage/abilities/effects/common/DamageTargetAndAllControlledEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DamageTargetAndAllControlledEffect.java index 843bd5609ce..b62896f7e90 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DamageTargetAndAllControlledEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DamageTargetAndAllControlledEffect.java @@ -5,6 +5,7 @@ import mage.abilities.Mode; import mage.abilities.effects.OneShotEffect; import mage.constants.Outcome; import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -18,6 +19,13 @@ public class DamageTargetAndAllControlledEffect extends OneShotEffect { private final int secondAmount; private final FilterPermanent filter; + /** + * Deals simultaneous damage to the target and to each creature the target controls + */ + public DamageTargetAndAllControlledEffect(int amount) { + this(amount, amount, StaticFilters.FILTER_PERMANENT_CREATURE); + } + /** * Deals simultaneous damage to the target and to each creature the target controls */ @@ -54,7 +62,7 @@ public class DamageTargetAndAllControlledEffect extends OneShotEffect { Player controller = game.getPlayerOrPlaneswalkerController(getTargetPointer().getFirst(game, source)); if (controller != null) { for (Permanent perm : game.getBattlefield().getAllActivePermanents(filter, controller.getId(), game)) { - perm.damage(secondAmount, source.getSourceId(), source, game, false, true); + perm.damage(secondAmount, source.getSourceId(), source, game); } } return true; @@ -65,9 +73,11 @@ public class DamageTargetAndAllControlledEffect extends OneShotEffect { if (staticText != null && !staticText.isEmpty()) { return staticText; } - return "{this} deals " + firstAmount + "damage to " + - getTargetPointer().describeTargets(mode.getTargets(), "that creature") + + String description = getTargetPointer().describeTargets(mode.getTargets(), "that player"); + return "{this} deals " + firstAmount + "damage to " + description + " and " + secondAmount + " damage to each " + filter.getMessage() + - " that player or that planeswalker's controller controls"; + " that player" + + (description.contains("planeswalker") ? " or that planeswalker's controller" : "") + + " controls"; } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/DamageTargetAndTargetControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DamageTargetAndTargetControllerEffect.java index de20b0cb6aa..50f4bbda6ec 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DamageTargetAndTargetControllerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DamageTargetAndTargetControllerEffect.java @@ -44,7 +44,10 @@ public class DamageTargetAndTargetControllerEffect extends OneShotEffect { Permanent permanent = game.getPermanent(targetId); if (permanent != null) { permanent.damage(firstAmount, source.getSourceId(), source, game); - Player player = game.getPlayer(permanent.getControllerId()); + } + Permanent lki = game.getPermanentOrLKIBattlefield(targetId); + if (lki != null) { + Player player = game.getPlayer(lki.getControllerId()); if (player != null) { player.damage(secondAmount, source.getSourceId(), source, game); } @@ -58,8 +61,9 @@ public class DamageTargetAndTargetControllerEffect extends OneShotEffect { if (staticText != null && !staticText.isEmpty()) { return staticText; } - return "{this} deals " + firstAmount + "damage to " + - getTargetPointer().describeTargets(mode.getTargets(), "that creature") + - " and " + secondAmount + "damage to that creature's controller"; + String description = getTargetPointer().describeTargets(mode.getTargets(), "that creature"); + return "{this} deals " + firstAmount + "damage to " + description + + " and " + secondAmount + "damage to that " + + (description.contains(" or ") ? "permanent's" : "creature's") + " controller"; } }