From a7f78e81904bd2fb7b80997878297ae6faa93ec0 Mon Sep 17 00:00:00 2001 From: xenohedron Date: Sat, 15 Jul 2023 16:49:40 -0400 Subject: [PATCH] Clean up triggered ability text generation (#10627) * move "or battle" to its own class * move "or planeswalker" to its own class * remove strange way of setting custom text * finally remove getTriggerPhrase * copy constructor visibility * fix Vraska --- .../src/mage/cards/a/ArchpriestOfShadows.java | 6 +- .../src/mage/cards/a/AttentiveSkywarden.java | 6 +- .../cards/b/BladewingDeathlessTyrant.java | 13 ++-- .../src/mage/cards/c/CovertTechnician.java | 2 +- .../src/mage/cards/d/DeeprootWayfinder.java | 4 +- .../src/mage/cards/d/DoomskarWarrior.java | 6 +- .../src/mage/cards/d/DreadhordeButcher.java | 6 +- Mage.Sets/src/mage/cards/f/FurnaceReins.java | 6 +- .../src/mage/cards/g/GarruksHarbinger.java | 6 +- .../src/mage/cards/g/GitaxianMindstinger.java | 4 +- .../src/mage/cards/g/GratefulApparition.java | 6 +- .../src/mage/cards/g/GuildpactInformant.java | 6 +- Mage.Sets/src/mage/cards/i/IG88B.java | 7 +- .../mage/cards/n/NehebDreadhordeChampion.java | 6 +- .../mage/cards/o/OtrimiTheEverPlayful.java | 8 +-- .../src/mage/cards/r/RankleAndTorbran.java | 7 +- .../src/mage/cards/r/RooftopSaboteurs.java | 7 +- .../src/mage/cards/s/SilentSubmersible.java | 8 +-- .../src/mage/cards/s/StormTheCitadel.java | 7 +- .../src/mage/cards/s/StorrevDevkarinLich.java | 7 +- .../src/mage/cards/t/TemperedSliver.java | 6 +- .../src/mage/cards/t/TheReaverCleaver.java | 7 +- .../src/mage/cards/t/TimotharBaronOfBats.java | 23 ++----- .../src/mage/cards/t/TrickstersTalisman.java | 11 +-- .../mage/cards/v/VraskaSchemingGorgon.java | 56 +++++++++++++--- .../java/mage/abilities/TriggeredAbility.java | 7 -- .../mage/abilities/TriggeredAbilityImpl.java | 12 +--- ...mageToAPlayerOrBattleTriggeredAbility.java | 53 +++++++++++++++ ...APlayerOrPlaneswalkerTriggeredAbility.java | 53 +++++++++++++++ ...CombatDamageToAPlayerTriggeredAbility.java | 67 +------------------ 30 files changed, 232 insertions(+), 191 deletions(-) create mode 100644 Mage/src/main/java/mage/abilities/common/DealsCombatDamageToAPlayerOrBattleTriggeredAbility.java create mode 100644 Mage/src/main/java/mage/abilities/common/DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility.java diff --git a/Mage.Sets/src/mage/cards/a/ArchpriestOfShadows.java b/Mage.Sets/src/mage/cards/a/ArchpriestOfShadows.java index b3fc883fed5..6ea0c6df40b 100644 --- a/Mage.Sets/src/mage/cards/a/ArchpriestOfShadows.java +++ b/Mage.Sets/src/mage/cards/a/ArchpriestOfShadows.java @@ -2,7 +2,7 @@ package mage.cards.a; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.DealsCombatDamageToAPlayerOrBattleTriggeredAbility; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; import mage.abilities.keyword.BackupAbility; import mage.abilities.keyword.DeathtouchAbility; @@ -36,9 +36,9 @@ public final class ArchpriestOfShadows extends CardImpl { backupAbility.addAbility(DeathtouchAbility.getInstance()); // Whenever this creature deals combat damage to a player or battle, return target creature card from your graveyard to the battlefield. - Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility( + Ability ability = new DealsCombatDamageToAPlayerOrBattleTriggeredAbility( new ReturnFromGraveyardToBattlefieldTargetEffect(), false - ).setOrBattle(true).setTriggerPhrase("Whenever this creature deals combat damage to a player or battle, "); + ).setTriggerPhrase("Whenever this creature deals combat damage to a player or battle, "); ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); backupAbility.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/a/AttentiveSkywarden.java b/Mage.Sets/src/mage/cards/a/AttentiveSkywarden.java index 3bdb617e58b..4ce4489da8b 100644 --- a/Mage.Sets/src/mage/cards/a/AttentiveSkywarden.java +++ b/Mage.Sets/src/mage/cards/a/AttentiveSkywarden.java @@ -2,7 +2,7 @@ package mage.cards.a; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.DealsCombatDamageToAPlayerOrBattleTriggeredAbility; import mage.abilities.effects.common.TransformTargetEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -39,9 +39,7 @@ public final class AttentiveSkywarden extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever Attentive Skywarden deals combat damage to a player or battle, transform up to one target Incubator token you control. - Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility( - new TransformTargetEffect(), false - ).setOrBattle(true); + Ability ability = new DealsCombatDamageToAPlayerOrBattleTriggeredAbility(new TransformTargetEffect(), false); ability.addTarget(new TargetPermanent(0, 1, filter)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/b/BladewingDeathlessTyrant.java b/Mage.Sets/src/mage/cards/b/BladewingDeathlessTyrant.java index 81608fd4bd2..4147ea2d130 100644 --- a/Mage.Sets/src/mage/cards/b/BladewingDeathlessTyrant.java +++ b/Mage.Sets/src/mage/cards/b/BladewingDeathlessTyrant.java @@ -1,7 +1,7 @@ package mage.cards.b; import mage.MageInt; -import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility; import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.keyword.FlyingAbility; @@ -38,14 +38,9 @@ public final class BladewingDeathlessTyrant extends CardImpl { // Whenever Bladewing, Deathless Tyrant deals combat damage to a player or planeswalker, // for each creature card in your graveyard, create a 2/2 black Zombie Knight creature token with menace. - this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility( - new CreateTokenEffect( - new ZombieKnightToken(), - new CardsInControllerGraveyardCount( - StaticFilters.FILTER_CARD_CREATURE - ) - ), false - ).setOrPlaneswalker(true)); + this.addAbility(new DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility( + new CreateTokenEffect(new ZombieKnightToken(), + new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_CREATURE)), false)); } private BladewingDeathlessTyrant(final BladewingDeathlessTyrant card) { diff --git a/Mage.Sets/src/mage/cards/c/CovertTechnician.java b/Mage.Sets/src/mage/cards/c/CovertTechnician.java index 95e3adf0d93..3e2e0242eca 100644 --- a/Mage.Sets/src/mage/cards/c/CovertTechnician.java +++ b/Mage.Sets/src/mage/cards/c/CovertTechnician.java @@ -37,7 +37,7 @@ public final class CovertTechnician extends CardImpl { // Whenever Covert Technician deals combat damage to a player, you may put an artifact card with mana value less than or equal to that damage from your hand onto the battlefield. this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility( - new CovertTechnicianEffect(), false, true, false + new CovertTechnicianEffect(), false, true )); } diff --git a/Mage.Sets/src/mage/cards/d/DeeprootWayfinder.java b/Mage.Sets/src/mage/cards/d/DeeprootWayfinder.java index 1fcf1fc180f..75c8bfdeeab 100644 --- a/Mage.Sets/src/mage/cards/d/DeeprootWayfinder.java +++ b/Mage.Sets/src/mage/cards/d/DeeprootWayfinder.java @@ -2,7 +2,7 @@ package mage.cards.d; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.DealsCombatDamageToAPlayerOrBattleTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.CardImpl; @@ -33,7 +33,7 @@ public final class DeeprootWayfinder extends CardImpl { this.toughness = new MageInt(3); // Whenever Deeproot Wayfinder deals combat damage to a player or battle, surveil 1, then you may return a land card from your graveyard to the battlefield tapped. - this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DeeprootWayfinderEffect(), false).setOrBattle(true)); + this.addAbility(new DealsCombatDamageToAPlayerOrBattleTriggeredAbility(new DeeprootWayfinderEffect(), false)); } private DeeprootWayfinder(final DeeprootWayfinder card) { diff --git a/Mage.Sets/src/mage/cards/d/DoomskarWarrior.java b/Mage.Sets/src/mage/cards/d/DoomskarWarrior.java index e2a51e8ba77..509443b6a9d 100644 --- a/Mage.Sets/src/mage/cards/d/DoomskarWarrior.java +++ b/Mage.Sets/src/mage/cards/d/DoomskarWarrior.java @@ -1,7 +1,7 @@ package mage.cards.d; import mage.MageInt; -import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.DealsCombatDamageToAPlayerOrBattleTriggeredAbility; import mage.abilities.dynamicvalue.common.SavedDamageValue; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.abilities.keyword.BackupAbility; @@ -36,13 +36,13 @@ public final class DoomskarWarrior extends CardImpl { backupAbility.addAbility(TrampleAbility.getInstance()); // Whenever this creature deals combat damage to a player or battle, look at that many cards from the top of your library. You may reveal a creature or land card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. - backupAbility.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility( + backupAbility.addAbility(new DealsCombatDamageToAPlayerOrBattleTriggeredAbility( new LookLibraryAndPickControllerEffect( SavedDamageValue.MANY, 1, StaticFilters.FILTER_CARD_CREATURE_OR_LAND, PutCards.HAND, PutCards.BOTTOM_RANDOM ), false - ).setOrBattle(true).setTriggerPhrase("Whenever this creature deals combat damage to a player or battle, ")); + ).setTriggerPhrase("Whenever this creature deals combat damage to a player or battle, ")); } private DoomskarWarrior(final DoomskarWarrior card) { diff --git a/Mage.Sets/src/mage/cards/d/DreadhordeButcher.java b/Mage.Sets/src/mage/cards/d/DreadhordeButcher.java index bd8699396c0..3ed5968c0c3 100644 --- a/Mage.Sets/src/mage/cards/d/DreadhordeButcher.java +++ b/Mage.Sets/src/mage/cards/d/DreadhordeButcher.java @@ -2,7 +2,7 @@ package mage.cards.d; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility; import mage.abilities.common.DiesSourceTriggeredAbility; import mage.abilities.dynamicvalue.common.SourcePermanentPowerCount; import mage.abilities.effects.common.DamageTargetEffect; @@ -34,9 +34,9 @@ public final class DreadhordeButcher extends CardImpl { this.addAbility(HasteAbility.getInstance()); // Whenever Dreadhorde Butcher deals combat damage to a player or planeswalker, put a +1/+1 counter on Dreadhorde Butcher. - this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new AddCountersSourceEffect( + this.addAbility(new DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility(new AddCountersSourceEffect( CounterType.P1P1.createInstance() - ), false).setOrPlaneswalker(true)); + ), false)); // When Dreadhorde Butcher dies, it deals damage equal to its power to any target. Ability ability = new DiesSourceTriggeredAbility(new DamageTargetEffect( diff --git a/Mage.Sets/src/mage/cards/f/FurnaceReins.java b/Mage.Sets/src/mage/cards/f/FurnaceReins.java index 72f2dbf2c7e..5f6a2087704 100644 --- a/Mage.Sets/src/mage/cards/f/FurnaceReins.java +++ b/Mage.Sets/src/mage/cards/f/FurnaceReins.java @@ -1,6 +1,6 @@ package mage.cards.f; -import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.DealsCombatDamageToAPlayerOrBattleTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.UntapTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; @@ -30,9 +30,9 @@ public final class FurnaceReins extends CardImpl { HasteAbility.getInstance(), Duration.EndOfTurn ).setText("Until end of turn, it gains haste")); this.getSpellAbility().addEffect(new GainAbilityTargetEffect( - new DealsCombatDamageToAPlayerTriggeredAbility( + new DealsCombatDamageToAPlayerOrBattleTriggeredAbility( new CreateTokenEffect(new TreasureToken()), false - ).setOrBattle(true), Duration.EndOfTurn + ), Duration.EndOfTurn ).setText("and \"Whenever this creature deals combat damage to a player or battle, create a Treasure token.\"")); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } diff --git a/Mage.Sets/src/mage/cards/g/GarruksHarbinger.java b/Mage.Sets/src/mage/cards/g/GarruksHarbinger.java index cee359f79f0..bc06c63bdaa 100644 --- a/Mage.Sets/src/mage/cards/g/GarruksHarbinger.java +++ b/Mage.Sets/src/mage/cards/g/GarruksHarbinger.java @@ -1,7 +1,7 @@ package mage.cards.g; import mage.MageInt; -import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility; import mage.abilities.dynamicvalue.common.SavedDamageValue; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.abilities.keyword.HexproofFromBlackAbility; @@ -45,9 +45,9 @@ public final class GarruksHarbinger extends CardImpl { // Whenever Garruk's Harbinger deals combat damage to a player or planeswalker, look at that many cards from the top of your library. // You may reveal a creature card or Garruk planeswalker card from among them and put it into your hand. // Put the rest on the bottom of your library in a random order. - this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility( + this.addAbility(new DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility( new LookLibraryAndPickControllerEffect(SavedDamageValue.MANY, 1, filter, PutCards.HAND, PutCards.BOTTOM_RANDOM), - false, true).setOrPlaneswalker(true)); + false)); } private GarruksHarbinger(final GarruksHarbinger card) { diff --git a/Mage.Sets/src/mage/cards/g/GitaxianMindstinger.java b/Mage.Sets/src/mage/cards/g/GitaxianMindstinger.java index 8c0af9ec334..dbd1fe8fcbb 100644 --- a/Mage.Sets/src/mage/cards/g/GitaxianMindstinger.java +++ b/Mage.Sets/src/mage/cards/g/GitaxianMindstinger.java @@ -1,7 +1,7 @@ package mage.cards.g; import mage.MageInt; -import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.DealsCombatDamageToAPlayerOrBattleTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.keyword.DeathtouchAbility; import mage.cards.CardImpl; @@ -31,7 +31,7 @@ public final class GitaxianMindstinger extends CardImpl { this.addAbility(DeathtouchAbility.getInstance()); // Whenever Gitaxian Mindstinger deals combat damage to a player or battle, draw a card. - this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DrawCardSourceControllerEffect(1),false).setOrBattle(true)); + this.addAbility(new DealsCombatDamageToAPlayerOrBattleTriggeredAbility(new DrawCardSourceControllerEffect(1),false)); } private GitaxianMindstinger(final GitaxianMindstinger card) { diff --git a/Mage.Sets/src/mage/cards/g/GratefulApparition.java b/Mage.Sets/src/mage/cards/g/GratefulApparition.java index 5e96f199cb7..21beee05540 100644 --- a/Mage.Sets/src/mage/cards/g/GratefulApparition.java +++ b/Mage.Sets/src/mage/cards/g/GratefulApparition.java @@ -1,7 +1,7 @@ package mage.cards.g; import mage.MageInt; -import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility; import mage.abilities.effects.common.counter.ProliferateEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -27,9 +27,7 @@ public final class GratefulApparition extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever Grateful Apparition deals combat damage to a player or planeswalker, proliferate. (Choose any number of permanents and/or players, then give each another counter of each kind already there.) - this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility( - new ProliferateEffect(), false - ).setOrPlaneswalker(true)); + this.addAbility(new DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility(new ProliferateEffect(), false)); } private GratefulApparition(final GratefulApparition card) { diff --git a/Mage.Sets/src/mage/cards/g/GuildpactInformant.java b/Mage.Sets/src/mage/cards/g/GuildpactInformant.java index 564d26a6375..88377a0d836 100644 --- a/Mage.Sets/src/mage/cards/g/GuildpactInformant.java +++ b/Mage.Sets/src/mage/cards/g/GuildpactInformant.java @@ -1,7 +1,7 @@ package mage.cards.g; import mage.MageInt; -import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility; import mage.abilities.effects.common.counter.ProliferateEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -29,9 +29,7 @@ public final class GuildpactInformant extends CardImpl { // Whenever Guildpact Informant deals combat damage to a player or planeswalker, // proliferate. (Choose any number of permanents and/or players, then give each another counter of each kind already there.) - this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility( - new ProliferateEffect(), false - ).setOrPlaneswalker(true)); + this.addAbility(new DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility(new ProliferateEffect(), false)); } private GuildpactInformant(final GuildpactInformant card) { diff --git a/Mage.Sets/src/mage/cards/i/IG88B.java b/Mage.Sets/src/mage/cards/i/IG88B.java index 9251d13c26a..7b0973cf134 100644 --- a/Mage.Sets/src/mage/cards/i/IG88B.java +++ b/Mage.Sets/src/mage/cards/i/IG88B.java @@ -1,4 +1,3 @@ - package mage.cards.i; import java.util.UUID; @@ -39,10 +38,10 @@ public final class IG88B extends CardImpl { // Bounty — Whenever IF-88B deals combat damage to a player, that player loses life equal to the number of bounty counters on creatures they control. this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility( - new LoseLifeTargetEffect(new CountersOnDefendingPlayerCreaturesCount(CounterType.BOUNTY)), + new LoseLifeTargetEffect(new CountersOnDefendingPlayerCreaturesCount(CounterType.BOUNTY)) + .setText("that player loses life equal to the number of bounty counters on creatures they control"), false, - "Bounty — Whenever {this} deals combat damage to a player, that player loses life equal to the number of bounty counters on creatures they control", - true) + true).withFlavorWord("Bounty") ); // Repair 3 diff --git a/Mage.Sets/src/mage/cards/n/NehebDreadhordeChampion.java b/Mage.Sets/src/mage/cards/n/NehebDreadhordeChampion.java index faab7507506..6501ba2f112 100644 --- a/Mage.Sets/src/mage/cards/n/NehebDreadhordeChampion.java +++ b/Mage.Sets/src/mage/cards/n/NehebDreadhordeChampion.java @@ -3,7 +3,7 @@ package mage.cards.n; import mage.MageInt; import mage.Mana; import mage.abilities.Ability; -import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; @@ -33,9 +33,7 @@ public final class NehebDreadhordeChampion extends CardImpl { this.addAbility(TrampleAbility.getInstance()); // Whenever Neheb, Dreadhorde Champion deals combat damage to a player or planeswalker, you may discard any number of cards. If you do, draw that many cards and add that much {R}. Until end of turn, you don't lose this mana as steps and phases end. - this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility( - new NehebDreadhordeChampionEffect(), true).setOrPlaneswalker(true) - ); + this.addAbility(new DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility(new NehebDreadhordeChampionEffect(), true)); } private NehebDreadhordeChampion(final NehebDreadhordeChampion card) { diff --git a/Mage.Sets/src/mage/cards/o/OtrimiTheEverPlayful.java b/Mage.Sets/src/mage/cards/o/OtrimiTheEverPlayful.java index 1d767ea4452..43494c4c75b 100644 --- a/Mage.Sets/src/mage/cards/o/OtrimiTheEverPlayful.java +++ b/Mage.Sets/src/mage/cards/o/OtrimiTheEverPlayful.java @@ -29,9 +29,6 @@ public final class OtrimiTheEverPlayful extends CardImpl { filter.add(new AbilityPredicate(MutateAbility.class)); } - private static final String rule = "Whenever this creature deals combat damage to a player, " + - "return target creature card with mutate from your graveyard to your hand."; - public OtrimiTheEverPlayful(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{G}{U}"); @@ -49,9 +46,8 @@ public final class OtrimiTheEverPlayful extends CardImpl { // Whenever this creature deals combat damage to a player, return target creature card with mutate from your graveyard to your hand. Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility( - new ReturnFromGraveyardToHandTargetEffect(), - false, rule, false - ); + new ReturnFromGraveyardToHandTargetEffect(), false + ).setTriggerPhrase("Whenever this creature deals combat damage to a player, "); ability.addTarget(new TargetCardInYourGraveyard(filter)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/r/RankleAndTorbran.java b/Mage.Sets/src/mage/cards/r/RankleAndTorbran.java index 0939f74d67e..7ca3c4336fa 100644 --- a/Mage.Sets/src/mage/cards/r/RankleAndTorbran.java +++ b/Mage.Sets/src/mage/cards/r/RankleAndTorbran.java @@ -3,7 +3,7 @@ package mage.cards.r; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.Mode; -import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.DealsCombatDamageToAPlayerOrBattleTriggeredAbility; import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.effects.common.CreateTokenAllEffect; import mage.abilities.effects.common.SacrificeAllEffect; @@ -48,9 +48,8 @@ public final class RankleAndTorbran extends CardImpl { // Whenever Rankle and Torbran deals combat damage to a player or battle, choose any number -- // * Each player creates a Treasure token. - Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility( - new CreateTokenAllEffect(new TreasureToken(), TargetController.EACH_PLAYER), false - ).setOrBattle(true); + Ability ability = new DealsCombatDamageToAPlayerOrBattleTriggeredAbility( + new CreateTokenAllEffect(new TreasureToken(), TargetController.EACH_PLAYER), false); ability.getModes().setMinModes(0); ability.getModes().setMaxModes(3); diff --git a/Mage.Sets/src/mage/cards/r/RooftopSaboteurs.java b/Mage.Sets/src/mage/cards/r/RooftopSaboteurs.java index 9b7a5e21f53..7d78c7b665f 100644 --- a/Mage.Sets/src/mage/cards/r/RooftopSaboteurs.java +++ b/Mage.Sets/src/mage/cards/r/RooftopSaboteurs.java @@ -1,7 +1,7 @@ package mage.cards.r; import mage.MageInt; -import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.DealsCombatDamageToAPlayerOrBattleTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -30,9 +30,8 @@ public final class RooftopSaboteurs extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever Rooftop Saboteurs deals combat damage to a player or battle, draw a card. - this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility( - new DrawCardSourceControllerEffect(1), false - ).setOrBattle(true)); + this.addAbility(new DealsCombatDamageToAPlayerOrBattleTriggeredAbility( + new DrawCardSourceControllerEffect(1), false)); } private RooftopSaboteurs(final RooftopSaboteurs card) { diff --git a/Mage.Sets/src/mage/cards/s/SilentSubmersible.java b/Mage.Sets/src/mage/cards/s/SilentSubmersible.java index 5539dff8933..d22fd7f26ca 100644 --- a/Mage.Sets/src/mage/cards/s/SilentSubmersible.java +++ b/Mage.Sets/src/mage/cards/s/SilentSubmersible.java @@ -1,7 +1,7 @@ package mage.cards.s; import mage.MageInt; -import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.keyword.CrewAbility; import mage.cards.CardImpl; @@ -23,10 +23,10 @@ public final class SilentSubmersible extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(3); - // Whenever Silent Submarine deals combat damage to a player or planeswalker, draw a card. - this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility( + // Whenever Silent Submersible deals combat damage to a player or planeswalker, draw a card. + this.addAbility(new DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility( new DrawCardSourceControllerEffect(1), false - ).setOrPlaneswalker(true)); + )); // Crew 2 this.addAbility(new CrewAbility(2)); diff --git a/Mage.Sets/src/mage/cards/s/StormTheCitadel.java b/Mage.Sets/src/mage/cards/s/StormTheCitadel.java index bc67f8c9f6d..e1140490d5a 100644 --- a/Mage.Sets/src/mage/cards/s/StormTheCitadel.java +++ b/Mage.Sets/src/mage/cards/s/StormTheCitadel.java @@ -1,7 +1,7 @@ package mage.cards.s; import mage.abilities.Ability; -import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; @@ -37,9 +37,8 @@ public final class StormTheCitadel extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{G}"); // Until end of turn, creatures you control get +2/+2 and gain "Whenever this creature deals combat damage to a creature or planeswalker, destroy target artifact or enchantment defending player controls." - Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility( - new DestroyTargetEffect(), false - ).setOrPlaneswalker(true); + Ability ability = new DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility( + new DestroyTargetEffect(), false); ability.addTarget(new TargetPermanent(filter)); this.getSpellAbility().addEffect(new BoostControlledEffect( diff --git a/Mage.Sets/src/mage/cards/s/StorrevDevkarinLich.java b/Mage.Sets/src/mage/cards/s/StorrevDevkarinLich.java index c9cd1e07134..4a9a3300c98 100644 --- a/Mage.Sets/src/mage/cards/s/StorrevDevkarinLich.java +++ b/Mage.Sets/src/mage/cards/s/StorrevDevkarinLich.java @@ -3,7 +3,7 @@ package mage.cards.s; import mage.MageInt; import mage.MageObjectReference; import mage.abilities.Ability; -import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.abilities.keyword.TrampleAbility; import mage.cards.Card; @@ -54,9 +54,8 @@ public final class StorrevDevkarinLich extends CardImpl { this.addAbility(TrampleAbility.getInstance()); // Whenever Storrev, Devkarin Lich deals combat damage to a player or planeswalker, return to your hand target creature or planeswalker card in your graveyard that wasn't put there this combat. - Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility( - new ReturnToHandTargetEffect(), false - ).setOrPlaneswalker(true); + Ability ability = new DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility( + new ReturnToHandTargetEffect(), false); ability.addTarget(new TargetCardInYourGraveyard(filter)); this.addAbility(ability, new StorrevDevkarinLichWatcher()); } diff --git a/Mage.Sets/src/mage/cards/t/TemperedSliver.java b/Mage.Sets/src/mage/cards/t/TemperedSliver.java index e7a8f3e7ea1..fb65a2f6234 100644 --- a/Mage.Sets/src/mage/cards/t/TemperedSliver.java +++ b/Mage.Sets/src/mage/cards/t/TemperedSliver.java @@ -30,8 +30,10 @@ public final class TemperedSliver extends CardImpl { // Sliver creatures you control have "Whenever this creature deals combat damage to a player, put a +1/+1 counter on it." this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( new DealsCombatDamageToAPlayerTriggeredAbility( - new AddCountersSourceEffect(CounterType.P1P1.createInstance(1)), false,"Whenever this creature deals combat damage to a player, put a +1/+1 counter on it.",false - ), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_SLIVERS + new AddCountersSourceEffect(CounterType.P1P1.createInstance(1)) + .setText("put a +1/+1 counter on it"), false + ).setTriggerPhrase("Whenever this creature deals combat damage to a player, ") + , Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_SLIVERS ))); } diff --git a/Mage.Sets/src/mage/cards/t/TheReaverCleaver.java b/Mage.Sets/src/mage/cards/t/TheReaverCleaver.java index 75ca2035ac9..ff8bc945962 100644 --- a/Mage.Sets/src/mage/cards/t/TheReaverCleaver.java +++ b/Mage.Sets/src/mage/cards/t/TheReaverCleaver.java @@ -1,7 +1,7 @@ package mage.cards.t; import mage.abilities.Ability; -import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.common.SavedDamageValue; @@ -38,9 +38,8 @@ public final class TheReaverCleaver extends CardImpl { "and has trample" )); ability.addEffect(new GainAbilityAttachedEffect( - new DealsCombatDamageToAPlayerTriggeredAbility( - new CreateTokenEffect(new TreasureToken(), SavedDamageValue.MANY), false - ).setOrPlaneswalker(true), + new DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility( + new CreateTokenEffect(new TreasureToken(), SavedDamageValue.MANY), false), AttachmentType.EQUIPMENT, Duration.WhileOnBattlefield, " and \"Whenever this creature deals combat damage to a player or planeswalker, create that many Treasure tokens.\"" diff --git a/Mage.Sets/src/mage/cards/t/TimotharBaronOfBats.java b/Mage.Sets/src/mage/cards/t/TimotharBaronOfBats.java index 2f8b9dc1275..13fe5343436 100644 --- a/Mage.Sets/src/mage/cards/t/TimotharBaronOfBats.java +++ b/Mage.Sets/src/mage/cards/t/TimotharBaronOfBats.java @@ -3,21 +3,15 @@ package mage.cards.t; import mage.MageInt; import mage.MageObjectReference; import mage.abilities.Ability; +import mage.abilities.TriggeredAbility; import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; import mage.abilities.common.DiesCreatureTriggeredAbility; -import mage.abilities.costs.Cost; -import mage.abilities.costs.CostAdjuster; -import mage.abilities.costs.Costs; -import mage.abilities.costs.CostsImpl; import mage.abilities.costs.common.DiscardCardCost; -import mage.abilities.costs.common.ExileFromGraveCost; import mage.abilities.costs.mana.ManaCost; import mage.abilities.costs.mana.ManaCosts; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.CreateTokenEffect; -import mage.abilities.effects.common.DoIfCostPaid; import mage.abilities.effects.common.SacrificeSourceEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.hint.StaticHint; @@ -26,15 +20,12 @@ import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.filter.FilterCard; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.mageobject.AnotherPredicate; -import mage.filter.predicate.mageobject.CardIdPredicate; import mage.game.Game; import mage.game.permanent.token.BatToken; import mage.players.Player; -import mage.target.common.TargetCardInYourGraveyard; import mage.target.targetpointer.FixedTargets; import java.util.UUID; @@ -79,6 +70,7 @@ public class TimotharBaronOfBats extends CardImpl { } class TimotharBaronOfBatsCreateBatEffect extends OneShotEffect { + // TODO: this could be reworked to use DoIfCostPaid rather than reimplementing that functionality TimotharBaronOfBatsCreateBatEffect() { super(Outcome.Benefit); @@ -118,13 +110,10 @@ class TimotharBaronOfBatsCreateBatEffect extends OneShotEffect { BatToken bat = new BatToken(); bat.putOntoBattlefield(1, game, source); - DealsCombatDamageToAPlayerTriggeredAbility sacAndReturnAbility = new DealsCombatDamageToAPlayerTriggeredAbility( - new SacrificeSourceEffect(), - false, - "When this creature deals combat damage to a player, " + - "sacrifice it and return the exiled card to the battlefield tapped", - false); - sacAndReturnAbility.addEffect(new TimotharBaronOfBatsReturnEffect(new MageObjectReference(vampireCard, game))); + TriggeredAbility sacAndReturnAbility = new DealsCombatDamageToAPlayerTriggeredAbility( + new SacrificeSourceEffect().setText("sacrifice it"), + false).setTriggerPhrase("When this creature deals combat damage to a player, "); + sacAndReturnAbility.addEffect(new TimotharBaronOfBatsReturnEffect(new MageObjectReference(vampireCard, game)).concatBy("and")); sacAndReturnAbility.addHint(new StaticHint("Exiled card: " + vampireCard.getName())); GainAbilityTargetEffect gainAbilityTargetEffect = new GainAbilityTargetEffect(sacAndReturnAbility, Duration.Custom); diff --git a/Mage.Sets/src/mage/cards/t/TrickstersTalisman.java b/Mage.Sets/src/mage/cards/t/TrickstersTalisman.java index 85965fd71fc..7dd562bc227 100644 --- a/Mage.Sets/src/mage/cards/t/TrickstersTalisman.java +++ b/Mage.Sets/src/mage/cards/t/TrickstersTalisman.java @@ -69,13 +69,14 @@ class TrickstersTalismanEffect extends GainAbilityWithAttachmentEffect { @Override protected Ability makeAbility(Game game, Ability source) { - if (game == null || source == null) { + if (game == null || source == null || source.getSourcePermanentIfItStillExists(game) == null) { return null; } return new DealsCombatDamageToAPlayerTriggeredAbility(new DoIfCostPaid( - new CreateTokenCopySourceEffect(), useAttachedCost.setMageObjectReference(source, game) - ), false, "Whenever this creature deals combat damage to a player, you may sacrifice " - + source.getSourcePermanentIfItStillExists(game).getName() - + ". If you do, create a token that's a copy of this creature.", false); + new CreateTokenCopySourceEffect().setText("create a token that's a copy of this creature"), + useAttachedCost.setMageObjectReference(source, game) + ).setText("you may sacrifice " + source.getSourcePermanentIfItStillExists(game).getName() + + ". If you do, create a token that's a copy of this creature" + ), false).setTriggerPhrase("Whenever this creature deals combat damage to a player, "); } } diff --git a/Mage.Sets/src/mage/cards/v/VraskaSchemingGorgon.java b/Mage.Sets/src/mage/cards/v/VraskaSchemingGorgon.java index c6b99e897fe..e5243c1f743 100644 --- a/Mage.Sets/src/mage/cards/v/VraskaSchemingGorgon.java +++ b/Mage.Sets/src/mage/cards/v/VraskaSchemingGorgon.java @@ -2,7 +2,8 @@ package mage.cards.v; import mage.abilities.LoyaltyAbility; import mage.abilities.TriggeredAbility; -import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.LoseGameTargetPlayerEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect; @@ -10,11 +11,13 @@ import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.keyword.DeathtouchAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.SubType; -import mage.constants.SuperType; +import mage.constants.*; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.events.DamagedEvent; +import mage.game.events.GameEvent; import mage.target.common.TargetCreaturePermanent; +import mage.target.targetpointer.FixedTarget; import java.util.UUID; @@ -39,10 +42,10 @@ public final class VraskaSchemingGorgon extends CardImpl { this.addAbility(loyaltyAbility); // -10: Until end of turn, creatures you control gain deathtouch and "Whenever this creature deals damage to an opponent, that player loses the game." - loyaltyAbility = new LoyaltyAbility(new GainAbilityControlledEffect(DeathtouchAbility.getInstance(), Duration.EndOfTurn) + loyaltyAbility = new LoyaltyAbility(new GainAbilityControlledEffect(DeathtouchAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURES) .setText("Until end of turn, creatures you control gain deathtouch"), -10); - TriggeredAbility triggeredAbility = new DealsCombatDamageToAPlayerTriggeredAbility(new LoseGameTargetPlayerEffect(), false, true, true); - loyaltyAbility.addEffect(new GainAbilityControlledEffect(triggeredAbility, Duration.EndOfTurn) + TriggeredAbility triggeredAbility = new VraskaSchemingGorgonTriggeredAbility(new LoseGameTargetPlayerEffect()); + loyaltyAbility.addEffect(new GainAbilityControlledEffect(triggeredAbility, Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURES) .setText("and \"Whenever this creature deals damage to an opponent, that player loses the game.\"")); this.addAbility(loyaltyAbility); } @@ -56,3 +59,40 @@ public final class VraskaSchemingGorgon extends CardImpl { return new VraskaSchemingGorgon(this); } } + +class VraskaSchemingGorgonTriggeredAbility extends TriggeredAbilityImpl { + + VraskaSchemingGorgonTriggeredAbility(Effect effect) { + super(Zone.BATTLEFIELD, effect, false); + setTriggerPhrase("Whenever this creature deals damage to an opponent, "); + } + + private VraskaSchemingGorgonTriggeredAbility(final VraskaSchemingGorgonTriggeredAbility ability) { + super(ability); + } + + @Override + public VraskaSchemingGorgonTriggeredAbility copy() { + return new VraskaSchemingGorgonTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DAMAGED_PLAYER; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (!event.getSourceId().equals(getSourceId()) + || !((DamagedEvent) event).isCombatDamage()) { + return false; + } + if (!game.getOpponents(getControllerId()).contains(event.getTargetId())) { + return false; + } + getAllEffects().setTargetPointer(new FixedTarget(event.getPlayerId())); + return true; + } + + +} diff --git a/Mage/src/main/java/mage/abilities/TriggeredAbility.java b/Mage/src/main/java/mage/abilities/TriggeredAbility.java index 4d93b42095f..972a3710e66 100644 --- a/Mage/src/main/java/mage/abilities/TriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/TriggeredAbility.java @@ -58,12 +58,5 @@ public interface TriggeredAbility extends Ability { GameEvent getTriggerEvent(); - /** - * Don't override this. Use setTriggerPhrase instead and let the base class handle it. - * @return - */ - @Deprecated - String getTriggerPhrase(); - TriggeredAbility setTriggerPhrase(String triggerPhrase); } diff --git a/Mage/src/main/java/mage/abilities/TriggeredAbilityImpl.java b/Mage/src/main/java/mage/abilities/TriggeredAbilityImpl.java index 6c3a192c9a2..50c0d4a2a0f 100644 --- a/Mage/src/main/java/mage/abilities/TriggeredAbilityImpl.java +++ b/Mage/src/main/java/mage/abilities/TriggeredAbilityImpl.java @@ -27,7 +27,7 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge private boolean triggersOnceEachTurn = false; private boolean doOnlyOnceEachTurn = false; private GameEvent triggerEvent = null; - private String triggerPhrase = null; // TODO: This should be change to final and all constructers to set a value + private String triggerPhrase = null; // TODO: This could be changed to final if all constructors set a value protected TriggeredAbilityImpl(Zone zone, Effect effect) { this(zone, effect, false); @@ -67,7 +67,7 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge } } - private final void setLastTrigger(Game game) { + private void setLastTrigger(Game game) { if (!triggersOnceEachTurn) { return; } @@ -188,7 +188,7 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge } sb.append(prefix); - sb.append(triggerPhrase == null ? getTriggerPhrase() : triggerPhrase); + sb.append(triggerPhrase == null ? "" : triggerPhrase); String superRule = super.getRule(true); if (!superRule.isEmpty()) { @@ -250,12 +250,6 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge return sb.toString(); } - @Override - @Deprecated - public String getTriggerPhrase() { - return ""; - } - @Override public boolean isInUseableZone(Game game, MageObject source, GameEvent event) { diff --git a/Mage/src/main/java/mage/abilities/common/DealsCombatDamageToAPlayerOrBattleTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/DealsCombatDamageToAPlayerOrBattleTriggeredAbility.java new file mode 100644 index 00000000000..cef57fb502e --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/DealsCombatDamageToAPlayerOrBattleTriggeredAbility.java @@ -0,0 +1,53 @@ +package mage.abilities.common; + +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.DamagedEvent; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; + +/** + * @author xenohedron + */ +public class DealsCombatDamageToAPlayerOrBattleTriggeredAbility extends TriggeredAbilityImpl { + + public DealsCombatDamageToAPlayerOrBattleTriggeredAbility(Effect effect, boolean optional) { + super(Zone.BATTLEFIELD, effect, optional); + setTriggerPhrase("Whenever {this} deals combat damage to a player or battle, "); + } + + + protected DealsCombatDamageToAPlayerOrBattleTriggeredAbility(final DealsCombatDamageToAPlayerOrBattleTriggeredAbility ability) { + super(ability); + } + + @Override + public DealsCombatDamageToAPlayerOrBattleTriggeredAbility copy() { + return new DealsCombatDamageToAPlayerOrBattleTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DAMAGED_PLAYER + || event.getType() == GameEvent.EventType.DAMAGED_PERMANENT; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (!event.getSourceId().equals(getSourceId()) + || !((DamagedEvent) event).isCombatDamage()) { + return false; + } + if (event.getType() == GameEvent.EventType.DAMAGED_PERMANENT) { + Permanent permanent = game.getPermanent(event.getTargetId()); + if (permanent == null || !permanent.isBattle(game)) { + return false; + } + } + getAllEffects().setValue("damage", event.getAmount()); + return true; + } + +} diff --git a/Mage/src/main/java/mage/abilities/common/DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility.java new file mode 100644 index 00000000000..7e8783c74e2 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility.java @@ -0,0 +1,53 @@ +package mage.abilities.common; + +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.DamagedEvent; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; + +/** + * @author xenohedron + */ +public class DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility extends TriggeredAbilityImpl { + + public DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility(Effect effect, boolean optional) { + super(Zone.BATTLEFIELD, effect, optional); + setTriggerPhrase("Whenever {this} deals combat damage to a player or planeswalker, "); + } + + + protected DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility(final DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility ability) { + super(ability); + } + + @Override + public DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility copy() { + return new DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DAMAGED_PLAYER + || event.getType() == GameEvent.EventType.DAMAGED_PERMANENT; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (!event.getSourceId().equals(getSourceId()) + || !((DamagedEvent) event).isCombatDamage()) { + return false; + } + if (event.getType() == GameEvent.EventType.DAMAGED_PERMANENT) { + Permanent permanent = game.getPermanent(event.getTargetId()); + if (permanent == null || !permanent.isPlaneswalker(game)) { + return false; + } + } + getAllEffects().setValue("damage", event.getAmount()); + return true; + } + +} diff --git a/Mage/src/main/java/mage/abilities/common/DealsCombatDamageToAPlayerTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/DealsCombatDamageToAPlayerTriggeredAbility.java index 123371768e6..f398382d214 100644 --- a/Mage/src/main/java/mage/abilities/common/DealsCombatDamageToAPlayerTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/DealsCombatDamageToAPlayerTriggeredAbility.java @@ -6,7 +6,6 @@ import mage.constants.Zone; import mage.game.Game; import mage.game.events.DamagedEvent; import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; import mage.target.targetpointer.FixedTarget; /** @@ -15,48 +14,20 @@ import mage.target.targetpointer.FixedTarget; public class DealsCombatDamageToAPlayerTriggeredAbility extends TriggeredAbilityImpl { protected final boolean setTargetPointer; - protected String text; - protected boolean onlyOpponents; - private boolean orPlaneswalker = false; - private boolean orBattle = false; public DealsCombatDamageToAPlayerTriggeredAbility(Effect effect, boolean optional) { this(effect, optional, false); } public DealsCombatDamageToAPlayerTriggeredAbility(Effect effect, boolean optional, boolean setTargetPointer) { - this(effect, optional, setTargetPointer, false); - } - - public DealsCombatDamageToAPlayerTriggeredAbility(Effect effect, boolean optional, boolean setTargetPointer, boolean onlyOpponents) { super(Zone.BATTLEFIELD, effect, optional); this.setTargetPointer = setTargetPointer; - this.onlyOpponents = onlyOpponents; + setTriggerPhrase("Whenever {this} deals combat damage to a player, "); } - public DealsCombatDamageToAPlayerTriggeredAbility(Effect effect, boolean optional, String text, boolean setTargetPointer) { - super(Zone.BATTLEFIELD, effect, optional); - this.text = text; - this.setTargetPointer = setTargetPointer; - } - - public DealsCombatDamageToAPlayerTriggeredAbility(final DealsCombatDamageToAPlayerTriggeredAbility ability) { + protected DealsCombatDamageToAPlayerTriggeredAbility(final DealsCombatDamageToAPlayerTriggeredAbility ability) { super(ability); - this.text = ability.text; this.setTargetPointer = ability.setTargetPointer; - this.onlyOpponents = ability.onlyOpponents; - this.orPlaneswalker = ability.orPlaneswalker; - this.orBattle = ability.orBattle; - } - - public DealsCombatDamageToAPlayerTriggeredAbility setOrPlaneswalker(boolean orPlaneswalker) { - this.orPlaneswalker = orPlaneswalker; - return this; - } - - public DealsCombatDamageToAPlayerTriggeredAbility setOrBattle(boolean orBattle) { - this.orBattle = orBattle; - return this; } @Override @@ -66,8 +37,7 @@ public class DealsCombatDamageToAPlayerTriggeredAbility extends TriggeredAbility @Override public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.DAMAGED_PLAYER - || event.getType() == GameEvent.EventType.DAMAGED_PERMANENT; + return event.getType() == GameEvent.EventType.DAMAGED_PLAYER; } @Override @@ -76,20 +46,6 @@ public class DealsCombatDamageToAPlayerTriggeredAbility extends TriggeredAbility || !((DamagedEvent) event).isCombatDamage()) { return false; } - switch (event.getType()) { - case DAMAGED_PLAYER: - if (onlyOpponents && !game.getOpponents(getControllerId()).contains(event.getTargetId())) { - return false; - } - break; - case DAMAGED_PERMANENT: - Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent == null - || (!orPlaneswalker || !permanent.isPlaneswalker(game)) - && (!orBattle || !permanent.isBattle(game))) { - return false; - } - } getAllEffects().setValue("damage", event.getAmount()); if (setTargetPointer) { getAllEffects().setTargetPointer(new FixedTarget(event.getPlayerId())); @@ -97,21 +53,4 @@ public class DealsCombatDamageToAPlayerTriggeredAbility extends TriggeredAbility return true; } - @Override - public String getRule() { - if (text == null || text.isEmpty()) { - return super.getRule(); - } - return text; - } - - // TODO: This class needs refactoring to specify onlyOppontns and OrPLaneswalkers in constructor - @Override - public String getTriggerPhrase() { - return "Whenever {this} deals combat damage to " - + (onlyOpponents ? "an opponent" : "a player") - + (orPlaneswalker ? " or planeswalker" : "") - + (orBattle ? " or battle" : "") - + ", "; - } }