diff --git a/Mage.Sets/src/mage/cards/g/GrazilaxxIllithidScholar.java b/Mage.Sets/src/mage/cards/g/GrazilaxxIllithidScholar.java index 551c0ee72a..22461db6b5 100644 --- a/Mage.Sets/src/mage/cards/g/GrazilaxxIllithidScholar.java +++ b/Mage.Sets/src/mage/cards/g/GrazilaxxIllithidScholar.java @@ -3,7 +3,7 @@ package mage.cards.g; import java.util.UUID; import mage.MageInt; import mage.abilities.common.BecomesBlockedAllTriggeredAbility; -import mage.abilities.common.ControlledCreaturesDealCombatDamagePlayerTriggeredAbility; +import mage.abilities.common.DealCombatDamageControlledTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.constants.SubType; @@ -40,7 +40,7 @@ public final class GrazilaxxIllithidScholar extends CardImpl { )); // Whenever one or more creatures you control deal combat damage to a player, draw a card. - this.addAbility(new ControlledCreaturesDealCombatDamagePlayerTriggeredAbility(new DrawCardSourceControllerEffect(1))); + this.addAbility(new DealCombatDamageControlledTriggeredAbility(new DrawCardSourceControllerEffect(1))); } private GrazilaxxIllithidScholar(final GrazilaxxIllithidScholar card) { diff --git a/Mage.Sets/src/mage/cards/g/GrimHireling.java b/Mage.Sets/src/mage/cards/g/GrimHireling.java index 0df709311e..e50f4ea0fe 100644 --- a/Mage.Sets/src/mage/cards/g/GrimHireling.java +++ b/Mage.Sets/src/mage/cards/g/GrimHireling.java @@ -3,7 +3,7 @@ package mage.cards.g; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.ActivateAsSorceryActivatedAbility; -import mage.abilities.common.ControlledCreaturesDealCombatDamagePlayerTriggeredAbility; +import mage.abilities.common.DealCombatDamageControlledTriggeredAbility; import mage.abilities.costs.common.SacrificeXTargetCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.common.GetXValue; @@ -39,7 +39,7 @@ public final class GrimHireling extends CardImpl { this.toughness = new MageInt(2); // Whenever one or more creatures you control deal combat damage to a player, create two Treasure tokens. - this.addAbility(new ControlledCreaturesDealCombatDamagePlayerTriggeredAbility( + this.addAbility(new DealCombatDamageControlledTriggeredAbility( new CreateTokenEffect(new TreasureToken(), 2) )); diff --git a/Mage.Sets/src/mage/cards/m/MidnightPathlighter.java b/Mage.Sets/src/mage/cards/m/MidnightPathlighter.java index a4d2c8773a..8699dbf7eb 100644 --- a/Mage.Sets/src/mage/cards/m/MidnightPathlighter.java +++ b/Mage.Sets/src/mage/cards/m/MidnightPathlighter.java @@ -1,7 +1,7 @@ package mage.cards.m; import mage.MageInt; -import mage.abilities.common.ControlledCreaturesDealCombatDamagePlayerTriggeredAbility; +import mage.abilities.common.DealCombatDamageControlledTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesAllEffect; import mage.abilities.effects.keyword.VentureIntoTheDungeonEffect; @@ -44,7 +44,7 @@ public final class MidnightPathlighter extends CardImpl { ))); // Whenever one or more creatures you control deal combat damage to a player, venture into the dungeon. - this.addAbility(new ControlledCreaturesDealCombatDamagePlayerTriggeredAbility(new VentureIntoTheDungeonEffect())); + this.addAbility(new DealCombatDamageControlledTriggeredAbility(new VentureIntoTheDungeonEffect())); } private MidnightPathlighter(final MidnightPathlighter card) { diff --git a/Mage.Sets/src/mage/cards/n/NaturesWill.java b/Mage.Sets/src/mage/cards/n/NaturesWill.java index c3adad1755..5014d39fc5 100644 --- a/Mage.Sets/src/mage/cards/n/NaturesWill.java +++ b/Mage.Sets/src/mage/cards/n/NaturesWill.java @@ -3,7 +3,7 @@ package mage.cards.n; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.common.ControlledCreaturesDealCombatDamagePlayerTriggeredAbility; +import mage.abilities.common.DealCombatDamageControlledTriggeredAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.TapAllTargetPlayerControlsEffect; import mage.abilities.effects.common.UntapAllEffect; @@ -26,7 +26,7 @@ public final class NaturesWill extends CardImpl { // Whenever one or more creatures you control deal combat damage to a player, tap all lands that player controls and untap all lands you control. Effect tapAllEffect = new TapAllTargetPlayerControlsEffect(new FilterLandPermanent()); tapAllEffect.setText("tap all lands that player controls"); - Ability ability = new ControlledCreaturesDealCombatDamagePlayerTriggeredAbility(Zone.BATTLEFIELD, tapAllEffect, true); + Ability ability = new DealCombatDamageControlledTriggeredAbility(Zone.BATTLEFIELD, tapAllEffect, true); ability.addEffect(new UntapAllEffect(new FilterControlledLandPermanent())); addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/o/OngoingInvestigation.java b/Mage.Sets/src/mage/cards/o/OngoingInvestigation.java index 3b9c121498..d11567603b 100644 --- a/Mage.Sets/src/mage/cards/o/OngoingInvestigation.java +++ b/Mage.Sets/src/mage/cards/o/OngoingInvestigation.java @@ -3,7 +3,7 @@ package mage.cards.o; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.common.ControlledCreaturesDealCombatDamagePlayerTriggeredAbility; +import mage.abilities.common.DealCombatDamageControlledTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.ExileFromGraveCost; import mage.abilities.costs.mana.ManaCostsImpl; @@ -26,7 +26,7 @@ public final class OngoingInvestigation extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); // Whenever one or more creatures you control deal combat damage to a player, investigate. - this.addAbility(new ControlledCreaturesDealCombatDamagePlayerTriggeredAbility(new InvestigateEffect())); + this.addAbility(new DealCombatDamageControlledTriggeredAbility(new InvestigateEffect())); // {1}{G}, Exile a creature card from your graveyard: Investigate. You gain 2 life. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new InvestigateEffect(), new ManaCostsImpl("{1}{G}")); diff --git a/Mage.Sets/src/mage/cards/p/ProfessionalFaceBreaker.java b/Mage.Sets/src/mage/cards/p/ProfessionalFaceBreaker.java new file mode 100644 index 0000000000..4816481f07 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/ProfessionalFaceBreaker.java @@ -0,0 +1,55 @@ +package mage.cards.p; + +import mage.MageInt; +import mage.abilities.common.DealCombatDamageControlledTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.ExileTopXMayPlayUntilEndOfTurnEffect; +import mage.abilities.keyword.MenaceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.common.FilterControlledPermanent; +import mage.game.permanent.token.TreasureToken; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ProfessionalFaceBreaker extends CardImpl { + + private static final FilterControlledPermanent filter + = new FilterControlledPermanent(SubType.TREASURE, "a Treasure"); + + public ProfessionalFaceBreaker(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Menace + this.addAbility(new MenaceAbility()); + + // Whenever one or more creatures you control deal combat damage to a player, create a Treasure token. + this.addAbility(new DealCombatDamageControlledTriggeredAbility(new CreateTokenEffect(new TreasureToken()))); + + // Sacrifice a Treasure: Exile the top card of your library. You may play that card this turn. + this.addAbility(new SimpleActivatedAbility( + new ExileTopXMayPlayUntilEndOfTurnEffect(1, false), new SacrificeTargetCost(filter) + )); + } + + private ProfessionalFaceBreaker(final ProfessionalFaceBreaker card) { + super(card); + } + + @Override + public ProfessionalFaceBreaker copy() { + return new ProfessionalFaceBreaker(this); + } +} diff --git a/Mage.Sets/src/mage/cards/p/PyrewildShaman.java b/Mage.Sets/src/mage/cards/p/PyrewildShaman.java index 2cca7bf0ae..f6b9d15b27 100644 --- a/Mage.Sets/src/mage/cards/p/PyrewildShaman.java +++ b/Mage.Sets/src/mage/cards/p/PyrewildShaman.java @@ -3,7 +3,7 @@ package mage.cards.p; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.ControlledCreaturesDealCombatDamagePlayerTriggeredAbility; +import mage.abilities.common.DealCombatDamageControlledTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.DoIfCostPaid; import mage.abilities.effects.common.ReturnToHandSourceEffect; @@ -30,7 +30,7 @@ public final class PyrewildShaman extends CardImpl { this.addAbility(new BloodrushAbility("{1}{R}", new BoostTargetEffect(3, 1, Duration.EndOfTurn))); // Whenever one or more creatures you control deal combat damage to a player, if Pyrewild Shaman is in your graveyard, you may pay {3}. If you do, return Pyrewild Shaman to your hand. - this.addAbility(new ControlledCreaturesDealCombatDamagePlayerTriggeredAbility(Zone.GRAVEYARD, + this.addAbility(new DealCombatDamageControlledTriggeredAbility(Zone.GRAVEYARD, new DoIfCostPaid(new ReturnToHandSourceEffect(), new ManaCostsImpl("{3}")) .setText("if {this} is in your graveyard, you may pay {3}. If you do, return {this} to your hand"))); diff --git a/Mage.Sets/src/mage/cards/s/StormTheVault.java b/Mage.Sets/src/mage/cards/s/StormTheVault.java index 7e40fbc049..00bf218daa 100644 --- a/Mage.Sets/src/mage/cards/s/StormTheVault.java +++ b/Mage.Sets/src/mage/cards/s/StormTheVault.java @@ -4,7 +4,7 @@ package mage.cards.s; import java.util.UUID; import mage.abilities.common.BeginningOfEndStepTriggeredAbility; -import mage.abilities.common.ControlledCreaturesDealCombatDamagePlayerTriggeredAbility; +import mage.abilities.common.DealCombatDamageControlledTriggeredAbility; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; @@ -32,7 +32,7 @@ public final class StormTheVault extends CardImpl { this.secondSideCardClazz = mage.cards.v.VaultOfCatlacan.class; // Whenever one or more creatures you control deal combat damage to a player, create a colorless Treasure artifact token with "{T}, Sacrifice this artifact: Add one mana of any color." - this.addAbility(new ControlledCreaturesDealCombatDamagePlayerTriggeredAbility(new CreateTokenEffect(new TreasureToken()))); + this.addAbility(new DealCombatDamageControlledTriggeredAbility(new CreateTokenEffect(new TreasureToken()))); // At the beginning of your end step, if you control five or more artifacts, transform Storm the Vault. this.addAbility(new TransformAbility()); diff --git a/Mage.Sets/src/mage/cards/t/ThunderbladeCharge.java b/Mage.Sets/src/mage/cards/t/ThunderbladeCharge.java index 8c29f015be..46efa1a3ef 100644 --- a/Mage.Sets/src/mage/cards/t/ThunderbladeCharge.java +++ b/Mage.Sets/src/mage/cards/t/ThunderbladeCharge.java @@ -3,7 +3,7 @@ package mage.cards.t; import java.util.UUID; import mage.ApprovingObject; import mage.abilities.Ability; -import mage.abilities.common.ControlledCreaturesDealCombatDamagePlayerTriggeredAbility; +import mage.abilities.common.DealCombatDamageControlledTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageTargetEffect; @@ -34,7 +34,7 @@ public final class ThunderbladeCharge extends CardImpl { // Whenever one or more creatures you control deal combat damage to a player, // if Thunderblade Charge is in your graveyard, you may pay {2}{R}{R}{R}. // If you do, you may cast it without paying its mana cost. - this.addAbility(new ControlledCreaturesDealCombatDamagePlayerTriggeredAbility(Zone.GRAVEYARD, + this.addAbility(new DealCombatDamageControlledTriggeredAbility(Zone.GRAVEYARD, new DoIfCostPaid(new ThunderbladeChargeCastEffect(), new ManaCostsImpl("{2}{R}{R}{R}")) .setText("if {this} is in your graveyard, you may pay {2}{R}{R}{R}. " + "If you do, you may cast it without paying its mana cost"))); diff --git a/Mage.Sets/src/mage/sets/StreetsOfNewCapenna.java b/Mage.Sets/src/mage/sets/StreetsOfNewCapenna.java index a115075ee6..85b1b1c1b7 100644 --- a/Mage.Sets/src/mage/sets/StreetsOfNewCapenna.java +++ b/Mage.Sets/src/mage/sets/StreetsOfNewCapenna.java @@ -65,6 +65,7 @@ public final class StreetsOfNewCapenna extends ExpansionSet { cards.add(new SetCardInfo("Nimble Larcenist", 321, Rarity.UNCOMMON, mage.cards.n.NimbleLarcenist.class)); cards.add(new SetCardInfo("Obscura Charm", 208, Rarity.UNCOMMON, mage.cards.o.ObscuraCharm.class)); cards.add(new SetCardInfo("Plains", 262, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Professional Face-Breaker", 116, Rarity.RARE, mage.cards.p.ProfessionalFaceBreaker.class)); cards.add(new SetCardInfo("Racers' Ring", 253, Rarity.COMMON, mage.cards.r.RacersRing.class)); cards.add(new SetCardInfo("Raffine's Tower", 254, Rarity.RARE, mage.cards.r.RaffinesTower.class)); cards.add(new SetCardInfo("Raffine, Scheming Seer", 213, Rarity.MYTHIC, mage.cards.r.RaffineSchemingSeer.class)); diff --git a/Mage/src/main/java/mage/abilities/common/ControlledCreaturesDealCombatDamagePlayerTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/DealCombatDamageControlledTriggeredAbility.java similarity index 76% rename from Mage/src/main/java/mage/abilities/common/ControlledCreaturesDealCombatDamagePlayerTriggeredAbility.java rename to Mage/src/main/java/mage/abilities/common/DealCombatDamageControlledTriggeredAbility.java index 412a580bd1..bbe23c9e11 100644 --- a/Mage/src/main/java/mage/abilities/common/ControlledCreaturesDealCombatDamagePlayerTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/DealCombatDamageControlledTriggeredAbility.java @@ -17,39 +17,39 @@ import java.util.UUID; /** * @author LevelX2 */ -public class ControlledCreaturesDealCombatDamagePlayerTriggeredAbility extends TriggeredAbilityImpl { +public class DealCombatDamageControlledTriggeredAbility extends TriggeredAbilityImpl { private final Set<UUID> damagedPlayerIds = new HashSet<>(); private final boolean setTargetPointer; private final boolean onlyOpponents; - public ControlledCreaturesDealCombatDamagePlayerTriggeredAbility(Effect effect) { + public DealCombatDamageControlledTriggeredAbility(Effect effect) { this(Zone.BATTLEFIELD, effect); } - public ControlledCreaturesDealCombatDamagePlayerTriggeredAbility(Zone zone, Effect effect) { + public DealCombatDamageControlledTriggeredAbility(Zone zone, Effect effect) { this(zone, effect, false); } - public ControlledCreaturesDealCombatDamagePlayerTriggeredAbility(Zone zone, Effect effect, boolean setTargetPointer) { + public DealCombatDamageControlledTriggeredAbility(Zone zone, Effect effect, boolean setTargetPointer) { this(zone, effect, setTargetPointer, false); } - public ControlledCreaturesDealCombatDamagePlayerTriggeredAbility(Zone zone, Effect effect, boolean setTargetPointer, boolean onlyOpponents) { + public DealCombatDamageControlledTriggeredAbility(Zone zone, Effect effect, boolean setTargetPointer, boolean onlyOpponents) { super(zone, effect, false); this.setTargetPointer = setTargetPointer; this.onlyOpponents = onlyOpponents; } - public ControlledCreaturesDealCombatDamagePlayerTriggeredAbility(final ControlledCreaturesDealCombatDamagePlayerTriggeredAbility ability) { + public DealCombatDamageControlledTriggeredAbility(final DealCombatDamageControlledTriggeredAbility ability) { super(ability); this.setTargetPointer = ability.setTargetPointer; this.onlyOpponents = ability.onlyOpponents; } @Override - public ControlledCreaturesDealCombatDamagePlayerTriggeredAbility copy() { - return new ControlledCreaturesDealCombatDamagePlayerTriggeredAbility(this); + public DealCombatDamageControlledTriggeredAbility copy() { + return new DealCombatDamageControlledTriggeredAbility(this); } @Override diff --git a/Mage/src/main/java/mage/game/command/emblems/LolthSpiderQueenEmblem.java b/Mage/src/main/java/mage/game/command/emblems/LolthSpiderQueenEmblem.java index 9293b282ef..a756c17956 100644 --- a/Mage/src/main/java/mage/game/command/emblems/LolthSpiderQueenEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/LolthSpiderQueenEmblem.java @@ -1,7 +1,7 @@ package mage.game.command.emblems; import mage.abilities.Ability; -import mage.abilities.common.ControlledCreaturesDealCombatDamagePlayerTriggeredAbility; +import mage.abilities.common.DealCombatDamageControlledTriggeredAbility; import mage.abilities.condition.Condition; import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.Effect; @@ -25,7 +25,7 @@ public final class LolthSpiderQueenEmblem extends Emblem { this.setName("Emblem Lolth"); this.setExpansionSetCodeForImage("AFR"); this.getAbilities().add(new ConditionalInterveningIfTriggeredAbility( - new ControlledCreaturesDealCombatDamagePlayerTriggeredAbility( + new DealCombatDamageControlledTriggeredAbility( Zone.COMMAND, new LolthSpiderQueenEmblemEffect(), true, true ), LolthSpiderQueenEmblemCondition.instance, "Whenever an opponent " + "is dealt combat damage by one or more creatures you control, " +