From 62fa79cfd850010a4fe7c54a36ad76e4e8d66609 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Sat, 29 Jan 2022 17:13:15 -0500 Subject: [PATCH] added AttacksAloneControlledTriggeredAbility --- .../src/mage/cards/a/AltarOfTheGoyf.java | 53 ++----------- .../src/mage/cards/a/AngelicBenediction.java | 60 +++------------ .../src/mage/cards/a/AngelicExaltation.java | 55 ++------------ .../src/mage/cards/b/BattlegraceAngel.java | 56 ++------------ .../src/mage/cards/g/GrunnTheLonelyKing.java | 4 +- Mage.Sets/src/mage/cards/l/LunkErrant.java | 4 +- .../mage/cards/m/MaChaoWesternWarrior.java | 4 +- .../mage/cards/n/NefaroxOverlordOfGrixis.java | 4 +- Mage.Sets/src/mage/cards/q/QuiGonJinn.java | 4 +- .../src/mage/cards/r/RafiqOfTheMany.java | 57 ++------------ Mage.Sets/src/mage/cards/r/RecklessOgre.java | 4 +- Mage.Sets/src/mage/cards/r/RogueKavu.java | 4 +- .../mage/cards/s/SovereignsOfLostAlara.java | 50 ++----------- .../src/mage/cards/y/YuanShaosInfantry.java | 4 +- ...ttacksAloneControlledTriggeredAbility.java | 74 +++++++++++++++++++ ...> AttacksAloneSourceTriggeredAbility.java} | 11 ++- 16 files changed, 138 insertions(+), 310 deletions(-) create mode 100644 Mage/src/main/java/mage/abilities/common/AttacksAloneControlledTriggeredAbility.java rename Mage/src/main/java/mage/abilities/common/{AttacksAloneTriggeredAbility.java => AttacksAloneSourceTriggeredAbility.java} (79%) diff --git a/Mage.Sets/src/mage/cards/a/AltarOfTheGoyf.java b/Mage.Sets/src/mage/cards/a/AltarOfTheGoyf.java index 6e44a81f7ac..a590ba3de37 100644 --- a/Mage.Sets/src/mage/cards/a/AltarOfTheGoyf.java +++ b/Mage.Sets/src/mage/cards/a/AltarOfTheGoyf.java @@ -1,6 +1,6 @@ package mage.cards.a; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.AttacksAloneControlledTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.dynamicvalue.common.CardTypesInGraveyardCount; import mage.abilities.effects.common.continuous.BoostTargetEffect; @@ -12,12 +12,8 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; -import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.common.FilterCreaturePermanent; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.target.targetpointer.FixedTarget; import java.util.UUID; @@ -35,7 +31,12 @@ public final class AltarOfTheGoyf extends CardImpl { this.subtype.add(SubType.LHURGOYF); // Whenever a creature you control attacks alone, it gets +X/+X until end of turn, where X is the number of card types among cards in all graveyard. - this.addAbility(new AltarOfTheGoyfAbility()); + this.addAbility(new AttacksAloneControlledTriggeredAbility(new BoostTargetEffect( + CardTypesInGraveyardCount.ALL, + CardTypesInGraveyardCount.ALL, + Duration.EndOfTurn, true + ).setText("it gets +X/+X until end of turn, where X is " + + "the number of card types among cards in all graveyards.")).addHint(CardTypesInGraveyardHint.ALL)); // Lhurgoyf creatures you control have trample. this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( @@ -52,43 +53,3 @@ public final class AltarOfTheGoyf extends CardImpl { return new AltarOfTheGoyf(this); } } - -class AltarOfTheGoyfAbility extends TriggeredAbilityImpl { - - public AltarOfTheGoyfAbility() { - super(Zone.BATTLEFIELD, new BoostTargetEffect( - CardTypesInGraveyardCount.ALL, CardTypesInGraveyardCount.ALL, Duration.EndOfTurn, true - ), false); - this.addHint(CardTypesInGraveyardHint.ALL); - } - - public AltarOfTheGoyfAbility(final AltarOfTheGoyfAbility ability) { - super(ability); - } - - @Override - public AltarOfTheGoyfAbility copy() { - return new AltarOfTheGoyfAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.DECLARED_ATTACKERS; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (game.isActivePlayer(this.controllerId) && game.getCombat().attacksAlone()) { - this.getEffects().setTargetPointer(new FixedTarget(game.getCombat().getAttackers().get(0), game)); - return true; - } - return false; - } - - @Override - public String getRule() { - return "Whenever a creature you control attacks alone, " + - "it gets +X/+X until end of turn, " + - "where X is the number of card types among cards in all graveyards."; - } -} diff --git a/Mage.Sets/src/mage/cards/a/AngelicBenediction.java b/Mage.Sets/src/mage/cards/a/AngelicBenediction.java index bc5ebe12f62..3d395c758fc 100644 --- a/Mage.Sets/src/mage/cards/a/AngelicBenediction.java +++ b/Mage.Sets/src/mage/cards/a/AngelicBenediction.java @@ -1,32 +1,33 @@ - package mage.cards.a; -import java.util.UUID; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.Ability; +import mage.abilities.common.AttacksAloneControlledTriggeredAbility; import mage.abilities.effects.common.TapTargetEffect; import mage.abilities.keyword.ExaltedAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author North */ public final class AngelicBenediction extends CardImpl { public AngelicBenediction(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{W}"); - + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}"); + // Exalted this.addAbility(new ExaltedAbility()); + // Whenever a creature you control attacks alone, you may tap target creature. - this.addAbility(new AngelicBenedictionTriggeredAbility()); + Ability ability = new AttacksAloneControlledTriggeredAbility( + new TapTargetEffect(), false, true + ); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); } private AngelicBenediction(final AngelicBenediction card) { @@ -38,40 +39,3 @@ public final class AngelicBenediction extends CardImpl { return new AngelicBenediction(this); } } - -class AngelicBenedictionTriggeredAbility extends TriggeredAbilityImpl { - - public AngelicBenedictionTriggeredAbility() { - super(Zone.BATTLEFIELD, new TapTargetEffect(), true); - this.addTarget(new TargetCreaturePermanent()); - } - - public AngelicBenedictionTriggeredAbility(final AngelicBenedictionTriggeredAbility ability) { - super(ability); - } - - @Override - public AngelicBenedictionTriggeredAbility copy() { - return new AngelicBenedictionTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.DECLARED_ATTACKERS; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (game.isActivePlayer(this.controllerId)) { - if (game.getCombat().attacksAlone()) { - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever a creature you control attacks alone, you may tap target creature"; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/a/AngelicExaltation.java b/Mage.Sets/src/mage/cards/a/AngelicExaltation.java index 7a157a2ffa2..ef1494214ff 100644 --- a/Mage.Sets/src/mage/cards/a/AngelicExaltation.java +++ b/Mage.Sets/src/mage/cards/a/AngelicExaltation.java @@ -1,18 +1,13 @@ package mage.cards.a; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.AttacksAloneControlledTriggeredAbility; import mage.abilities.dynamicvalue.common.CreaturesYouControlCount; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.hint.common.CreaturesYouControlHint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.target.targetpointer.FixedTarget; import java.util.UUID; @@ -25,7 +20,11 @@ public final class AngelicExaltation extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}"); // Whenever a creature you control attacks alone, it gets +X/+X until end of turn, where X is the number of creatures you control. - this.addAbility(new AngelicExaltationAbility().addHint(CreaturesYouControlHint.instance)); + this.addAbility(new AttacksAloneControlledTriggeredAbility(new BoostTargetEffect( + CreaturesYouControlCount.instance, + CreaturesYouControlCount.instance, + Duration.EndOfTurn, true + ).setText("it gets +X/+X until end of turn, where X is the number of creatures you control")).addHint(CreaturesYouControlHint.instance)); } private AngelicExaltation(final AngelicExaltation card) { @@ -37,45 +36,3 @@ public final class AngelicExaltation extends CardImpl { return new AngelicExaltation(this); } } - -class AngelicExaltationAbility extends TriggeredAbilityImpl { - - public AngelicExaltationAbility() { - super(Zone.BATTLEFIELD, new BoostTargetEffect(CreaturesYouControlCount.instance, CreaturesYouControlCount.instance, Duration.EndOfTurn, true), false); - } - - public AngelicExaltationAbility(final AngelicExaltationAbility ability) { - super(ability); - } - - @Override - public AngelicExaltationAbility copy() { - return new AngelicExaltationAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.DECLARED_ATTACKERS; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (game.isActivePlayer(this.controllerId)) { - if (game.getCombat().attacksAlone()) { - for (Effect effect : this.getEffects()) { - effect.setTargetPointer(new FixedTarget(game.getCombat().getAttackers().get(0), game)); - } - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever a creature you control attacks alone, " + - "it gets +X/+X until end of turn, " + - "where X is the number of creatures you control."; - } - -} diff --git a/Mage.Sets/src/mage/cards/b/BattlegraceAngel.java b/Mage.Sets/src/mage/cards/b/BattlegraceAngel.java index ea4ce5eb015..7d7c48646ee 100644 --- a/Mage.Sets/src/mage/cards/b/BattlegraceAngel.java +++ b/Mage.Sets/src/mage/cards/b/BattlegraceAngel.java @@ -1,9 +1,7 @@ package mage.cards.b; -import java.util.UUID; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.Effect; +import mage.abilities.common.AttacksAloneControlledTriggeredAbility; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.ExaltedAbility; import mage.abilities.keyword.FlyingAbility; @@ -13,14 +11,10 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.target.targetpointer.FixedTarget; + +import java.util.UUID; /** - * * @author Loki */ public final class BattlegraceAngel extends CardImpl { @@ -39,7 +33,9 @@ public final class BattlegraceAngel extends CardImpl { this.addAbility(new ExaltedAbility()); // Whenever a creature you control attacks alone, it gains lifelink until end of turn. - this.addAbility(new BattlegraceAngelAbility()); + this.addAbility(new AttacksAloneControlledTriggeredAbility(new GainAbilityTargetEffect( + LifelinkAbility.getInstance(), Duration.EndOfTurn + ).setText("it gains lifelink until end of turn"))); } public BattlegraceAngel(final BattlegraceAngel card) { @@ -52,43 +48,3 @@ public final class BattlegraceAngel extends CardImpl { } } - -class BattlegraceAngelAbility extends TriggeredAbilityImpl { - - public BattlegraceAngelAbility() { - super(Zone.BATTLEFIELD, new GainAbilityTargetEffect(LifelinkAbility.getInstance(), Duration.EndOfTurn), false); - } - - public BattlegraceAngelAbility(final BattlegraceAngelAbility ability) { - super(ability); - } - - @Override - public BattlegraceAngelAbility copy() { - return new BattlegraceAngelAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.DECLARED_ATTACKERS; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (game.isActivePlayer(this.controllerId)) { - if (game.getCombat().attacksAlone()) { - for (Effect effect : this.getEffects()) { - effect.setTargetPointer(new FixedTarget(game.getCombat().getAttackers().get(0), game)); - } - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever a creature you control attacks alone, it gains lifelink until end of turn."; - } - -} diff --git a/Mage.Sets/src/mage/cards/g/GrunnTheLonelyKing.java b/Mage.Sets/src/mage/cards/g/GrunnTheLonelyKing.java index 60ccea44218..30662c6809f 100644 --- a/Mage.Sets/src/mage/cards/g/GrunnTheLonelyKing.java +++ b/Mage.Sets/src/mage/cards/g/GrunnTheLonelyKing.java @@ -3,7 +3,7 @@ package mage.cards.g; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.AttacksAloneTriggeredAbility; +import mage.abilities.common.AttacksAloneSourceTriggeredAbility; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.condition.common.KickedCondition; import mage.abilities.dynamicvalue.common.SourcePermanentPowerCount; @@ -42,7 +42,7 @@ public final class GrunnTheLonelyKing extends CardImpl { SourcePermanentPowerCount power = new SourcePermanentPowerCount(); Effect effect = new BoostSourceEffect(power, SourcePermanentToughnessValue.getInstance(), Duration.EndOfTurn, true); effect.setText("double its power and toughness until end of turn"); - this.addAbility(new AttacksAloneTriggeredAbility(effect)); + this.addAbility(new AttacksAloneSourceTriggeredAbility(effect)); } private GrunnTheLonelyKing(final GrunnTheLonelyKing card) { diff --git a/Mage.Sets/src/mage/cards/l/LunkErrant.java b/Mage.Sets/src/mage/cards/l/LunkErrant.java index 6083a138ef3..5f4a9a47cda 100644 --- a/Mage.Sets/src/mage/cards/l/LunkErrant.java +++ b/Mage.Sets/src/mage/cards/l/LunkErrant.java @@ -4,7 +4,7 @@ package mage.cards.l; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.AttacksAloneTriggeredAbility; +import mage.abilities.common.AttacksAloneSourceTriggeredAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; @@ -31,7 +31,7 @@ public final class LunkErrant extends CardImpl { // Whenever Lunk Errant attacks alone, it gets +1/+1 and gains trample until end of turn. Effect effect = new BoostSourceEffect(1, 1, Duration.EndOfTurn); effect.setText("it gets +1/+1"); - Ability ability = new AttacksAloneTriggeredAbility(effect); + Ability ability = new AttacksAloneSourceTriggeredAbility(effect); effect = new GainAbilitySourceEffect(TrampleAbility.getInstance(), Duration.EndOfTurn); effect.setText("and gains trample until end of turn"); ability.addEffect(effect); diff --git a/Mage.Sets/src/mage/cards/m/MaChaoWesternWarrior.java b/Mage.Sets/src/mage/cards/m/MaChaoWesternWarrior.java index 034e9352eac..5dbbaf74463 100644 --- a/Mage.Sets/src/mage/cards/m/MaChaoWesternWarrior.java +++ b/Mage.Sets/src/mage/cards/m/MaChaoWesternWarrior.java @@ -3,7 +3,7 @@ package mage.cards.m; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.AttacksAloneTriggeredAbility; +import mage.abilities.common.AttacksAloneSourceTriggeredAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.combat.CantBeBlockedSourceEffect; import mage.abilities.keyword.HorsemanshipAbility; @@ -34,7 +34,7 @@ public final class MaChaoWesternWarrior extends CardImpl { // Whenever Ma Chao, Western Warrior attacks alone, it can't be blocked this combat. Effect effect = new CantBeBlockedSourceEffect(Duration.EndOfCombat); effect.setText("it can't be blocked this combat"); - this.addAbility(new AttacksAloneTriggeredAbility(effect)); + this.addAbility(new AttacksAloneSourceTriggeredAbility(effect)); } private MaChaoWesternWarrior(final MaChaoWesternWarrior card) { diff --git a/Mage.Sets/src/mage/cards/n/NefaroxOverlordOfGrixis.java b/Mage.Sets/src/mage/cards/n/NefaroxOverlordOfGrixis.java index e287152a99f..16c8f779575 100644 --- a/Mage.Sets/src/mage/cards/n/NefaroxOverlordOfGrixis.java +++ b/Mage.Sets/src/mage/cards/n/NefaroxOverlordOfGrixis.java @@ -3,7 +3,7 @@ package mage.cards.n; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.AttacksAloneTriggeredAbility; +import mage.abilities.common.AttacksAloneSourceTriggeredAbility; import mage.abilities.effects.common.SacrificeEffect; import mage.abilities.keyword.ExaltedAbility; import mage.abilities.keyword.FlyingAbility; @@ -33,7 +33,7 @@ public final class NefaroxOverlordOfGrixis extends CardImpl { // Exalted this.addAbility(new ExaltedAbility()); // Whenever Nefarox, Overlord of Grixis attacks alone, defending player sacrifices a creature. - this.addAbility(new AttacksAloneTriggeredAbility(new SacrificeEffect( + this.addAbility(new AttacksAloneSourceTriggeredAbility(new SacrificeEffect( StaticFilters.FILTER_CONTROLLED_CREATURE_SHORT_TEXT, 1, "defending player"))); } diff --git a/Mage.Sets/src/mage/cards/q/QuiGonJinn.java b/Mage.Sets/src/mage/cards/q/QuiGonJinn.java index 4c8ac240c50..2350caadfc6 100644 --- a/Mage.Sets/src/mage/cards/q/QuiGonJinn.java +++ b/Mage.Sets/src/mage/cards/q/QuiGonJinn.java @@ -4,7 +4,7 @@ package mage.cards.q; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.AttacksAloneTriggeredAbility; +import mage.abilities.common.AttacksAloneSourceTriggeredAbility; import mage.abilities.common.LeavesBattlefieldTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.Effect; @@ -42,7 +42,7 @@ public final class QuiGonJinn extends CardImpl { // When Qui-Gon Jinn attacks alone, it gets +2/+2 and lifelink until end of turn. Effect effect = new BoostSourceEffect(2, 2, Duration.EndOfTurn); effect.setText("it gets +2/+2"); - Ability abitity = new AttacksAloneTriggeredAbility(effect); + Ability abitity = new AttacksAloneSourceTriggeredAbility(effect); effect = new GainAbilitySourceEffect(LifelinkAbility.getInstance()); effect.setText("and lifelink until end of turn"); abitity.addEffect(effect); diff --git a/Mage.Sets/src/mage/cards/r/RafiqOfTheMany.java b/Mage.Sets/src/mage/cards/r/RafiqOfTheMany.java index 9a67669ecae..3a123322796 100644 --- a/Mage.Sets/src/mage/cards/r/RafiqOfTheMany.java +++ b/Mage.Sets/src/mage/cards/r/RafiqOfTheMany.java @@ -1,25 +1,20 @@ package mage.cards.r; -import java.util.UUID; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.Effect; +import mage.abilities.common.AttacksAloneControlledTriggeredAbility; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.DoubleStrikeAbility; import mage.abilities.keyword.ExaltedAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.SuperType; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.target.targetpointer.FixedTarget; + +import java.util.UUID; /** - * * @author BetaSteward_at_googlemail.com */ public final class RafiqOfTheMany extends CardImpl { @@ -37,7 +32,9 @@ public final class RafiqOfTheMany extends CardImpl { this.addAbility(new ExaltedAbility()); // Whenever a creature you control attacks alone, it gains double strike until end of turn. - this.addAbility(new RafiqOfTheManyAbility()); + this.addAbility(new AttacksAloneControlledTriggeredAbility(new GainAbilityTargetEffect( + DoubleStrikeAbility.getInstance(), Duration.EndOfTurn + ).setText("it gains double strike until end of turn"))); } private RafiqOfTheMany(final RafiqOfTheMany card) { @@ -50,43 +47,3 @@ public final class RafiqOfTheMany extends CardImpl { } } - -class RafiqOfTheManyAbility extends TriggeredAbilityImpl { - - public RafiqOfTheManyAbility() { - super(Zone.BATTLEFIELD, new GainAbilityTargetEffect(DoubleStrikeAbility.getInstance(), Duration.EndOfTurn)); - } - - public RafiqOfTheManyAbility(final RafiqOfTheManyAbility ability) { - super(ability); - } - - @Override - public RafiqOfTheManyAbility copy() { - return new RafiqOfTheManyAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.DECLARED_ATTACKERS; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (game.isActivePlayer(this.controllerId)) { - if (game.getCombat().attacksAlone()) { - for (Effect effect : this.getEffects()) { - effect.setTargetPointer(new FixedTarget(game.getCombat().getAttackers().get(0), game)); - } - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever a creature you control attacks alone, it gains double strike until end of turn."; - } - -} diff --git a/Mage.Sets/src/mage/cards/r/RecklessOgre.java b/Mage.Sets/src/mage/cards/r/RecklessOgre.java index def2b8f40b9..f351fd85129 100644 --- a/Mage.Sets/src/mage/cards/r/RecklessOgre.java +++ b/Mage.Sets/src/mage/cards/r/RecklessOgre.java @@ -3,7 +3,7 @@ package mage.cards.r; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.AttacksAloneTriggeredAbility; +import mage.abilities.common.AttacksAloneSourceTriggeredAbility; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -24,7 +24,7 @@ public final class RecklessOgre extends CardImpl { this.toughness = new MageInt(2); // Whenever Reckless Ogre attacks alone, it gets +3/+0 until end of turn. - this.addAbility(new AttacksAloneTriggeredAbility(new BoostSourceEffect(3, 0, Duration.EndOfTurn).setText("it gets +3/+0 until end of turn"))); + this.addAbility(new AttacksAloneSourceTriggeredAbility(new BoostSourceEffect(3, 0, Duration.EndOfTurn).setText("it gets +3/+0 until end of turn"))); } private RecklessOgre(final RecklessOgre card) { diff --git a/Mage.Sets/src/mage/cards/r/RogueKavu.java b/Mage.Sets/src/mage/cards/r/RogueKavu.java index 661ebf8f90f..d1106f31bf8 100644 --- a/Mage.Sets/src/mage/cards/r/RogueKavu.java +++ b/Mage.Sets/src/mage/cards/r/RogueKavu.java @@ -3,7 +3,7 @@ package mage.cards.r; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.AttacksAloneTriggeredAbility; +import mage.abilities.common.AttacksAloneSourceTriggeredAbility; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -24,7 +24,7 @@ public final class RogueKavu extends CardImpl { this.toughness = new MageInt(1); // Whenever Rogue Kavu attacks alone, it gets +2/+0 until end of turn. - this.addAbility(new AttacksAloneTriggeredAbility(new BoostSourceEffect(2, 0, Duration.EndOfTurn))); + this.addAbility(new AttacksAloneSourceTriggeredAbility(new BoostSourceEffect(2, 0, Duration.EndOfTurn))); } private RogueKavu(final RogueKavu card) { diff --git a/Mage.Sets/src/mage/cards/s/SovereignsOfLostAlara.java b/Mage.Sets/src/mage/cards/s/SovereignsOfLostAlara.java index 32c7082410c..b6f8cfb5367 100644 --- a/Mage.Sets/src/mage/cards/s/SovereignsOfLostAlara.java +++ b/Mage.Sets/src/mage/cards/s/SovereignsOfLostAlara.java @@ -1,10 +1,8 @@ - package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.AttacksAloneControlledTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.ExaltedAbility; import mage.cards.Card; @@ -17,14 +15,13 @@ import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.predicate.card.AuraCardCanAttachToPermanentId; import mage.game.Game; -import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCardInLibrary; -import mage.target.targetpointer.FixedTarget; + +import java.util.UUID; /** - * * @author jeffwadsworth */ public final class SovereignsOfLostAlara extends CardImpl { @@ -40,7 +37,7 @@ public final class SovereignsOfLostAlara extends CardImpl { this.addAbility(new ExaltedAbility()); // Whenever a creature you control attacks alone, you may search your library for an Aura card that could enchant that creature, put it onto the battlefield attached to that creature, then shuffle your library. - this.addAbility(new CreatureControlledAttacksAloneTriggeredAbility()); + this.addAbility(new AttacksAloneControlledTriggeredAbility(new SovereignsOfLostAlaraEffect())); } private SovereignsOfLostAlara(final SovereignsOfLostAlara card) { @@ -53,43 +50,6 @@ public final class SovereignsOfLostAlara extends CardImpl { } } -class CreatureControlledAttacksAloneTriggeredAbility extends TriggeredAbilityImpl { - - public CreatureControlledAttacksAloneTriggeredAbility() { - super(Zone.BATTLEFIELD, new SovereignsOfLostAlaraEffect(), true); - } - - public CreatureControlledAttacksAloneTriggeredAbility(final CreatureControlledAttacksAloneTriggeredAbility ability) { - super(ability); - } - - @Override - public CreatureControlledAttacksAloneTriggeredAbility copy() { - return new CreatureControlledAttacksAloneTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.DECLARED_ATTACKERS; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (game.isActivePlayer(this.controllerId)) { - if (game.getCombat().attacksAlone()) { - this.getEffects().get(0).setTargetPointer(new FixedTarget(game.getCombat().getAttackers().get(0), game)); - return true; - } - } - return false; - } - - @Override - public String getTriggerPhrase() { - return "Whenever a creature you control attacks alone, " ; - } -} - class SovereignsOfLostAlaraEffect extends OneShotEffect { public SovereignsOfLostAlaraEffect() { @@ -109,7 +69,7 @@ class SovereignsOfLostAlaraEffect extends OneShotEffect { FilterCard filter = new FilterCard("aura that could enchant the lone attacking creature"); filter.add(SubType.AURA.getPredicate()); filter.add(new AuraCardCanAttachToPermanentId(attackingCreature.getId())); - if (controller.chooseUse(Outcome.Benefit, "Do you want to search your library?", source, game)) { + if (controller.chooseUse(Outcome.Benefit, "Search your library?", source, game)) { TargetCardInLibrary target = new TargetCardInLibrary(filter); target.setNotTarget(true); if (controller.searchLibrary(target, source, game)) { diff --git a/Mage.Sets/src/mage/cards/y/YuanShaosInfantry.java b/Mage.Sets/src/mage/cards/y/YuanShaosInfantry.java index c4499ecf532..5dd56dccef1 100644 --- a/Mage.Sets/src/mage/cards/y/YuanShaosInfantry.java +++ b/Mage.Sets/src/mage/cards/y/YuanShaosInfantry.java @@ -3,7 +3,7 @@ package mage.cards.y; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.AttacksAloneTriggeredAbility; +import mage.abilities.common.AttacksAloneSourceTriggeredAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.combat.CantBeBlockedSourceEffect; import mage.cards.CardImpl; @@ -28,7 +28,7 @@ public final class YuanShaosInfantry extends CardImpl { // Whenever Yuan Shao's Infantry attacks alone, Yuan Shao's Infantry can't be blocked this combat. Effect effect = new CantBeBlockedSourceEffect(Duration.EndOfCombat); effect.setText("{this} can't be blocked this combat"); - this.addAbility(new AttacksAloneTriggeredAbility(effect)); + this.addAbility(new AttacksAloneSourceTriggeredAbility(effect)); } private YuanShaosInfantry(final YuanShaosInfantry card) { diff --git a/Mage/src/main/java/mage/abilities/common/AttacksAloneControlledTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/AttacksAloneControlledTriggeredAbility.java new file mode 100644 index 00000000000..93b64fbc433 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/AttacksAloneControlledTriggeredAbility.java @@ -0,0 +1,74 @@ +package mage.abilities.common; + +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.target.targetpointer.FixedTarget; + +/** + * @author TheElk801 + */ +public class AttacksAloneControlledTriggeredAbility extends TriggeredAbilityImpl { + + private final FilterPermanent filter; + private final boolean setTargetPointer; + + public AttacksAloneControlledTriggeredAbility(Effect effect) { + this(effect, false); + } + + public AttacksAloneControlledTriggeredAbility(Effect effect, boolean optional) { + this(effect, false, optional); + } + + public AttacksAloneControlledTriggeredAbility(Effect effect, boolean setTargetPointer, boolean optional) { + this(effect, StaticFilters.FILTER_CONTROLLED_A_CREATURE, setTargetPointer, optional); + } + + public AttacksAloneControlledTriggeredAbility(Effect effect, FilterPermanent filter, boolean setTargetPointer, boolean optional) { + super(Zone.BATTLEFIELD, effect, optional); + this.filter = filter; + this.setTargetPointer = setTargetPointer; + } + + private AttacksAloneControlledTriggeredAbility(final AttacksAloneControlledTriggeredAbility ability) { + super(ability); + this.filter = ability.filter; + this.setTargetPointer = ability.setTargetPointer; + } + + @Override + public AttacksAloneControlledTriggeredAbility copy() { + return new AttacksAloneControlledTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DECLARED_ATTACKERS; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (!game.getCombat().attacksAlone()) { + return false; + } + Permanent permanent = game.getPermanent(game.getCombat().getAttackers().get(0)); + if (permanent == null || !filter.match(permanent, getSourceId(), getControllerId(), game)) { + return false; + } + if (setTargetPointer) { + this.getEffects().setTargetPointer(new FixedTarget(permanent, game)); + } + return true; + } + + @Override + public String getTriggerPhrase() { + return "Whenever " + filter.getMessage() + " attacks alone, "; + } +} diff --git a/Mage/src/main/java/mage/abilities/common/AttacksAloneTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/AttacksAloneSourceTriggeredAbility.java similarity index 79% rename from Mage/src/main/java/mage/abilities/common/AttacksAloneTriggeredAbility.java rename to Mage/src/main/java/mage/abilities/common/AttacksAloneSourceTriggeredAbility.java index b9bb15536ec..293eeac4367 100644 --- a/Mage/src/main/java/mage/abilities/common/AttacksAloneTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/AttacksAloneSourceTriggeredAbility.java @@ -7,7 +7,6 @@ import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; import mage.constants.Zone; import mage.game.Game; -import mage.game.events.GameEvent.EventType; import mage.game.events.GameEvent; import mage.target.targetpointer.FixedTarget; @@ -15,19 +14,19 @@ import mage.target.targetpointer.FixedTarget; * * @author LoneFox */ -public class AttacksAloneTriggeredAbility extends TriggeredAbilityImpl { +public class AttacksAloneSourceTriggeredAbility extends TriggeredAbilityImpl { - public AttacksAloneTriggeredAbility(Effect effect) { + public AttacksAloneSourceTriggeredAbility(Effect effect) { super(Zone.BATTLEFIELD, effect); } - public AttacksAloneTriggeredAbility(final AttacksAloneTriggeredAbility ability) { + public AttacksAloneSourceTriggeredAbility(final AttacksAloneSourceTriggeredAbility ability) { super(ability); } @Override - public AttacksAloneTriggeredAbility copy() { - return new AttacksAloneTriggeredAbility(this); + public AttacksAloneSourceTriggeredAbility copy() { + return new AttacksAloneSourceTriggeredAbility(this); } @Override