diff --git a/Mage.Sets/src/mage/cards/a/AetherMembrane.java b/Mage.Sets/src/mage/cards/a/AetherMembrane.java index ed335085ff1..0e856ced535 100644 --- a/Mage.Sets/src/mage/cards/a/AetherMembrane.java +++ b/Mage.Sets/src/mage/cards/a/AetherMembrane.java @@ -3,9 +3,8 @@ package mage.cards.a; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.BlocksSourceTriggeredAbility; +import mage.abilities.common.BlocksCreatureTriggeredAbility; import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.abilities.keyword.DefenderAbility; @@ -34,9 +33,11 @@ public final class AetherMembrane extends CardImpl { this.addAbility(ReachAbility.getInstance()); // Whenever Aether Membrane blocks a creature, return that creature to its owner's hand at end of combat. - Effect effect = new ReturnToHandTargetEffect(); - effect.setText("return that creature to its owner's hand at end of combat"); - this.addAbility(new BlocksSourceTriggeredAbility(new CreateDelayedTriggeredAbilityEffect(new AtTheEndOfCombatDelayedTriggeredAbility(effect)), false, true)); + this.addAbility(new BlocksCreatureTriggeredAbility( + new CreateDelayedTriggeredAbilityEffect( + new AtTheEndOfCombatDelayedTriggeredAbility(new ReturnToHandTargetEffect()) + ).setText("return that creature to its owner's hand at end of combat") + )); } private AetherMembrane(final AetherMembrane card) { diff --git a/Mage.Sets/src/mage/cards/a/Aetherplasm.java b/Mage.Sets/src/mage/cards/a/Aetherplasm.java index 4b935217590..3e9f4592edd 100644 --- a/Mage.Sets/src/mage/cards/a/Aetherplasm.java +++ b/Mage.Sets/src/mage/cards/a/Aetherplasm.java @@ -3,7 +3,7 @@ package mage.cards.a; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.BlocksSourceTriggeredAbility; +import mage.abilities.common.BlocksCreatureTriggeredAbility; import mage.abilities.costs.common.ReturnToHandFromBattlefieldSourceCost; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DoIfCostPaid; @@ -34,8 +34,11 @@ public final class Aetherplasm extends CardImpl { this.power = new MageInt(1); this.toughness = new MageInt(1); - // Whenever Aetherplasm blocks a creature, you may return Aetherplasm to its owner's hand. If you do, you may put a creature card from your hand onto the battlefield blocking that creature. - this.addAbility(new BlocksSourceTriggeredAbility(new DoIfCostPaid(new AetherplasmEffect(), new ReturnToHandFromBattlefieldSourceCost()), false, true)); + // Whenever Aetherplasm blocks a creature, you may return Aetherplasm to its owner's hand. + // If you do, you may put a creature card from your hand onto the battlefield blocking that creature. + this.addAbility(new BlocksCreatureTriggeredAbility(new DoIfCostPaid( + new AetherplasmEffect(), new ReturnToHandFromBattlefieldSourceCost() + ))); } private Aetherplasm(final Aetherplasm card) { diff --git a/Mage.Sets/src/mage/cards/a/AgelessSentinels.java b/Mage.Sets/src/mage/cards/a/AgelessSentinels.java index 45cc00c9634..07e0d68aac2 100644 --- a/Mage.Sets/src/mage/cards/a/AgelessSentinels.java +++ b/Mage.Sets/src/mage/cards/a/AgelessSentinels.java @@ -35,9 +35,9 @@ public final class AgelessSentinels extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // When Ageless Sentinels blocks, it becomes a Bird Giant, and it loses defender. - Ability ability = new BlocksSourceTriggeredAbility(new AgelessSentinelsEffect(), false, false, true); + Ability ability = new BlocksSourceTriggeredAbility(new AgelessSentinelsEffect()).setTriggerPhrase("When {this} blocks, "); Effect effect = new LoseAbilitySourceEffect(DefenderAbility.getInstance(), Duration.WhileOnBattlefield); - effect.setText(", and it loses defender"); + effect.setText(", and it loses defender. (It's no longer a Wall. This effect lasts indefinitely.)"); ability.addEffect(effect); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/a/AlabornZealot.java b/Mage.Sets/src/mage/cards/a/AlabornZealot.java index ee4c93ca251..9c84b4a111f 100644 --- a/Mage.Sets/src/mage/cards/a/AlabornZealot.java +++ b/Mage.Sets/src/mage/cards/a/AlabornZealot.java @@ -1,16 +1,15 @@ - package mage.cards.a; import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.common.BlocksSourceTriggeredAbility; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.BlocksCreatureTriggeredAbility; import mage.abilities.effects.common.DestroySourceEffect; import mage.abilities.effects.common.DestroyTargetEffect; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; /** * @@ -27,8 +26,11 @@ public final class AlabornZealot extends CardImpl { this.toughness = new MageInt(1); // When Alaborn Zealot blocks a creature, destroy that creature and Alaborn Zealot. - Ability ability = new BlocksSourceTriggeredAbility(new DestroyTargetEffect().setText("destroy that creature"), false, true, true); + TriggeredAbility ability = new BlocksCreatureTriggeredAbility( + new DestroyTargetEffect().setText("destroy that creature") + ); ability.addEffect(new DestroySourceEffect().setText("and {this}")); + ability.setTriggerPhrase("When {this} blocks a creature, "); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/b/BrimazKingOfOreskos.java b/Mage.Sets/src/mage/cards/b/BrimazKingOfOreskos.java index 0217207233c..e0521d4bcc5 100644 --- a/Mage.Sets/src/mage/cards/b/BrimazKingOfOreskos.java +++ b/Mage.Sets/src/mage/cards/b/BrimazKingOfOreskos.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; -import mage.abilities.common.BlocksSourceTriggeredAbility; +import mage.abilities.common.BlocksCreatureTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.keyword.VigilanceAbility; @@ -43,7 +43,7 @@ public final class BrimazKingOfOreskos extends CardImpl { this.addAbility(new AttacksTriggeredAbility(new CreateTokenEffect(new CatSoldierCreatureToken(), 1, false, true), false)); // Whenever Brimaz blocks a creature, create a 1/1 white Cat Soldier creature token with vigilance blocking that creature. - this.addAbility(new BlocksSourceTriggeredAbility(new BrimazKingOfOreskosEffect(), false, true)); + this.addAbility(new BlocksCreatureTriggeredAbility(new BrimazKingOfOreskosEffect())); } private BrimazKingOfOreskos(final BrimazKingOfOreskos card) { diff --git a/Mage.Sets/src/mage/cards/c/CinderWall.java b/Mage.Sets/src/mage/cards/c/CinderWall.java index ad72fee897c..28291f49188 100644 --- a/Mage.Sets/src/mage/cards/c/CinderWall.java +++ b/Mage.Sets/src/mage/cards/c/CinderWall.java @@ -1,4 +1,3 @@ - package mage.cards.c; import java.util.UUID; @@ -29,10 +28,13 @@ public final class CinderWall extends CardImpl { // Defender this.addAbility(DefenderAbility.getInstance()); // When Cinder Wall blocks, destroy it at end of combat. - this.addAbility(new BlocksSourceTriggeredAbility( - new CreateDelayedTriggeredAbilityEffect(new AtTheEndOfCombatDelayedTriggeredAbility(new DestroySourceEffect())), - false, false, true - )); + this.addAbility( + new BlocksSourceTriggeredAbility( + new CreateDelayedTriggeredAbilityEffect( + new AtTheEndOfCombatDelayedTriggeredAbility(new DestroySourceEffect()) + ).setText("destroy it at end of combat") + ).setTriggerPhrase("When {this} blocks, ") + ); } private CinderWall(final CinderWall card) { diff --git a/Mage.Sets/src/mage/cards/c/ClericOfChillDepths.java b/Mage.Sets/src/mage/cards/c/ClericOfChillDepths.java index 8e02967bcf0..f74a5a12d9a 100644 --- a/Mage.Sets/src/mage/cards/c/ClericOfChillDepths.java +++ b/Mage.Sets/src/mage/cards/c/ClericOfChillDepths.java @@ -1,7 +1,7 @@ package mage.cards.c; import mage.MageInt; -import mage.abilities.common.BlocksSourceTriggeredAbility; +import mage.abilities.common.BlocksCreatureTriggeredAbility; import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -24,8 +24,8 @@ public final class ClericOfChillDepths extends CardImpl { this.toughness = new MageInt(3); // Whenever Cleric of Chill Depths blocks a creature, that creature doesn't untap during its controller's next untap step. - this.addAbility(new BlocksSourceTriggeredAbility( - new DontUntapInControllersNextUntapStepTargetEffect("that creature"), false, true + this.addAbility(new BlocksCreatureTriggeredAbility( + new DontUntapInControllersNextUntapStepTargetEffect("that creature") )); } diff --git a/Mage.Sets/src/mage/cards/e/ElderLandWurm.java b/Mage.Sets/src/mage/cards/e/ElderLandWurm.java index fc39235c346..d4e549fab31 100644 --- a/Mage.Sets/src/mage/cards/e/ElderLandWurm.java +++ b/Mage.Sets/src/mage/cards/e/ElderLandWurm.java @@ -34,7 +34,11 @@ public final class ElderLandWurm extends CardImpl { this.addAbility(TrampleAbility.getInstance()); // When Elder Land Wurm blocks, it loses defender. - this.addAbility(new BlocksSourceTriggeredAbility(new LoseAbilitySourceEffect(DefenderAbility.getInstance(), Duration.Custom), false, false, true)); + this.addAbility( + new BlocksSourceTriggeredAbility( + new LoseAbilitySourceEffect(DefenderAbility.getInstance(), Duration.Custom).setText("it loses defender") + ).setTriggerPhrase("When {this} blocks, ") + ); } private ElderLandWurm(final ElderLandWurm card) { diff --git a/Mage.Sets/src/mage/cards/e/EliteJavelineer.java b/Mage.Sets/src/mage/cards/e/EliteJavelineer.java index d8ebbfa8d09..ed5b99220de 100644 --- a/Mage.Sets/src/mage/cards/e/EliteJavelineer.java +++ b/Mage.Sets/src/mage/cards/e/EliteJavelineer.java @@ -1,4 +1,3 @@ - package mage.cards.e; import java.util.UUID; @@ -10,8 +9,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.filter.common.FilterAttackingCreature; -import mage.target.common.TargetCreaturePermanent; +import mage.target.common.TargetAttackingCreature; /** * @@ -28,8 +26,8 @@ public final class EliteJavelineer extends CardImpl { this.toughness = new MageInt(2); // Whenever Elite Javelineer blocks, it deals 1 damage to target attacking creature. - Ability ability = new BlocksSourceTriggeredAbility(new DamageTargetEffect(1, "it"), false); - ability.addTarget(new TargetCreaturePermanent(new FilterAttackingCreature())); + Ability ability = new BlocksSourceTriggeredAbility(new DamageTargetEffect(1, "it")); + ability.addTarget(new TargetAttackingCreature()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/f/FolkOfAnHavva.java b/Mage.Sets/src/mage/cards/f/FolkOfAnHavva.java index 168ff674b0e..4df3fca5db2 100644 --- a/Mage.Sets/src/mage/cards/f/FolkOfAnHavva.java +++ b/Mage.Sets/src/mage/cards/f/FolkOfAnHavva.java @@ -1,4 +1,3 @@ - package mage.cards.f; import java.util.UUID; @@ -24,7 +23,7 @@ public final class FolkOfAnHavva extends CardImpl { this.toughness = new MageInt(1); // Whenever Folk of An-Havva blocks, it gets +2/+0 until end of turn. - this.addAbility(new BlocksSourceTriggeredAbility(new BoostSourceEffect(2, 0, Duration.EndOfTurn), false)); + this.addAbility(new BlocksSourceTriggeredAbility(new BoostSourceEffect(2, 0, Duration.EndOfTurn, "it"))); } private FolkOfAnHavva(final FolkOfAnHavva card) { diff --git a/Mage.Sets/src/mage/cards/f/FortressCyclops.java b/Mage.Sets/src/mage/cards/f/FortressCyclops.java index cfbdab2a7ec..6001d92887b 100644 --- a/Mage.Sets/src/mage/cards/f/FortressCyclops.java +++ b/Mage.Sets/src/mage/cards/f/FortressCyclops.java @@ -27,9 +27,9 @@ public final class FortressCyclops extends CardImpl { this.toughness = new MageInt(3); // Whenever Fortress Cyclops attacks, it gets +3/+0 until end of turn. - this.addAbility(new AttacksTriggeredAbility(new BoostSourceEffect(3,0, Duration.EndOfTurn), false)); + this.addAbility(new AttacksTriggeredAbility(new BoostSourceEffect(3, 0, Duration.EndOfTurn, "it"))); // Whenever Fortress Cyclops blocks, it gets +0/+3 until end of turn. - this.addAbility(new BlocksSourceTriggeredAbility(new BoostSourceEffect(0,3, Duration.EndOfTurn), false)); + this.addAbility(new BlocksSourceTriggeredAbility(new BoostSourceEffect(0, 3, Duration.EndOfTurn, "it"))); } private FortressCyclops(final FortressCyclops card) { diff --git a/Mage.Sets/src/mage/cards/g/GiantBadger.java b/Mage.Sets/src/mage/cards/g/GiantBadger.java index c1a0186cc5c..89c98c57789 100644 --- a/Mage.Sets/src/mage/cards/g/GiantBadger.java +++ b/Mage.Sets/src/mage/cards/g/GiantBadger.java @@ -1,4 +1,3 @@ - package mage.cards.g; import java.util.UUID; @@ -25,7 +24,7 @@ public final class GiantBadger extends CardImpl { this.toughness = new MageInt(2); // Whenever Giant Badger blocks, it gets +2/+2 until end of turn. - this.addAbility(new BlocksSourceTriggeredAbility(new BoostSourceEffect(2, 2, Duration.EndOfTurn), false)); + this.addAbility(new BlocksSourceTriggeredAbility(new BoostSourceEffect(2, 2, Duration.EndOfTurn, "it"))); } private GiantBadger(final GiantBadger card) { diff --git a/Mage.Sets/src/mage/cards/g/GoblinSnowman.java b/Mage.Sets/src/mage/cards/g/GoblinSnowman.java index b45bfb7c08a..3b21db0dfce 100644 --- a/Mage.Sets/src/mage/cards/g/GoblinSnowman.java +++ b/Mage.Sets/src/mage/cards/g/GoblinSnowman.java @@ -40,7 +40,7 @@ public final class GoblinSnowman extends CardImpl { //Whenever Goblin Snowman blocks, prevent all combat damage that would be dealt to and dealt by it this turn. Ability ability = new BlocksSourceTriggeredAbility(new PreventCombatDamageBySourceEffect(Duration.EndOfTurn) - .setText("prevent all combat damage that would be dealt to"), false); + .setText("prevent all combat damage that would be dealt to")); ability.addEffect(new PreventCombatDamageToSourceEffect(Duration.EndOfTurn) .setText("and dealt by it this turn")); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/g/GuardianOfTheGateless.java b/Mage.Sets/src/mage/cards/g/GuardianOfTheGateless.java index 6499ae14de6..16dea26e991 100644 --- a/Mage.Sets/src/mage/cards/g/GuardianOfTheGateless.java +++ b/Mage.Sets/src/mage/cards/g/GuardianOfTheGateless.java @@ -1,10 +1,11 @@ - package mage.cards.g; import java.util.UUID; import mage.MageInt; import mage.abilities.common.BlocksSourceTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.common.combat.CanBlockAdditionalCreatureEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.keyword.FlyingAbility; @@ -13,7 +14,8 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Duration; -import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.BlockingOrBlockedBySourcePredicate; /** * @@ -21,6 +23,15 @@ import mage.constants.Zone; */ public final class GuardianOfTheGateless extends CardImpl { + private static final FilterCreaturePermanent filter + = new FilterCreaturePermanent("creature it's blocking"); + + static { + filter.add(BlockingOrBlockedBySourcePredicate.BLOCKED_BY); + } + + private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(filter); + public GuardianOfTheGateless(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{W}"); this.subtype.add(SubType.ANGEL); @@ -32,10 +43,11 @@ public final class GuardianOfTheGateless extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Guardian of the Gateless can block any number of creatures. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CanBlockAdditionalCreatureEffect(0))); + this.addAbility(new SimpleStaticAbility(new CanBlockAdditionalCreatureEffect(0))); // Whenever Guardian of the Gateless blocks, it gets +1/+1 until end of turn for each creature it's blocking. - this.addAbility(new BlocksSourceTriggeredAbility(new BoostSourceEffect(1,1, Duration.EndOfTurn),false)); + this.addAbility(new BlocksSourceTriggeredAbility( + new BoostSourceEffect(xValue, xValue, Duration.EndOfTurn, true, "it"))); } private GuardianOfTheGateless(final GuardianOfTheGateless card) { diff --git a/Mage.Sets/src/mage/cards/h/HordeAmbusher.java b/Mage.Sets/src/mage/cards/h/HordeAmbusher.java index cdaf7fb0df6..ca49ae33106 100644 --- a/Mage.Sets/src/mage/cards/h/HordeAmbusher.java +++ b/Mage.Sets/src/mage/cards/h/HordeAmbusher.java @@ -1,4 +1,3 @@ - package mage.cards.h; import java.util.UUID; @@ -8,7 +7,6 @@ import mage.abilities.Ability; import mage.abilities.common.BlocksSourceTriggeredAbility; import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility; import mage.abilities.costs.common.RevealTargetFromHandCost; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageControllerEffect; import mage.abilities.effects.common.combat.CantBlockTargetEffect; import mage.abilities.keyword.MorphAbility; @@ -42,15 +40,13 @@ public final class HordeAmbusher extends CardImpl { this.toughness = new MageInt(2); // Whenever Horde Ambusher blocks, it deals 1 damage to you. - this.addAbility(new BlocksSourceTriggeredAbility(new DamageControllerEffect(1, "it"), false)); - + this.addAbility(new BlocksSourceTriggeredAbility(new DamageControllerEffect(1, "it"))); + // Morph - Reveal a red card in your hand. this.addAbility(new MorphAbility(new RevealTargetFromHandCost(new TargetCardInHand(filter)))); - + // When Horde Ambusher is turned face up, target creature can't block this turn. - Effect effect = new CantBlockTargetEffect(Duration.EndOfTurn); - effect.setText("target creature can't block this turn"); - Ability ability = new TurnedFaceUpSourceTriggeredAbility(effect); + Ability ability = new TurnedFaceUpSourceTriggeredAbility(new CantBlockTargetEffect(Duration.EndOfTurn)); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/i/InfernalMedusa.java b/Mage.Sets/src/mage/cards/i/InfernalMedusa.java index da01ada6b0a..d3f730dfa94 100644 --- a/Mage.Sets/src/mage/cards/i/InfernalMedusa.java +++ b/Mage.Sets/src/mage/cards/i/InfernalMedusa.java @@ -4,7 +4,7 @@ package mage.cards.i; import java.util.UUID; import mage.MageInt; import mage.abilities.common.BecomesBlockedByCreatureTriggeredAbility; -import mage.abilities.common.BlocksSourceTriggeredAbility; +import mage.abilities.common.BlocksCreatureTriggeredAbility; import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; @@ -37,7 +37,7 @@ public final class InfernalMedusa extends CardImpl { // Whenever Infernal Medusa blocks a creature, destroy that creature at end of combat. Effect effect = new CreateDelayedTriggeredAbilityEffect(new AtTheEndOfCombatDelayedTriggeredAbility(new DestroyTargetEffect()), true); effect.setText("destroy that creature at end of combat"); - this.addAbility(new BlocksSourceTriggeredAbility(effect, false, true)); + this.addAbility(new BlocksCreatureTriggeredAbility(effect)); // Whenever Infernal Medusa becomes blocked by a non-Wall creature, destroy that creature at end of combat. this.addAbility(new BecomesBlockedByCreatureTriggeredAbility(effect, filter, false)); } diff --git a/Mage.Sets/src/mage/cards/j/JarethLeonineTitan.java b/Mage.Sets/src/mage/cards/j/JarethLeonineTitan.java index 37a1af48dab..2e48e362b41 100644 --- a/Mage.Sets/src/mage/cards/j/JarethLeonineTitan.java +++ b/Mage.Sets/src/mage/cards/j/JarethLeonineTitan.java @@ -3,19 +3,14 @@ package mage.cards.j; import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.BlocksSourceTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.costs.mana.ColoredManaCost; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.effects.common.continuous.GainProtectionFromColorSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.Duration; -import mage.constants.SuperType; -import mage.constants.Zone; +import mage.constants.*; /** * @@ -33,11 +28,14 @@ public final class JarethLeonineTitan extends CardImpl { this.toughness = new MageInt(7); // Whenever Jareth, Leonine Titan blocks, it gets +7/+7 until end of turn. - this.addAbility(new BlocksSourceTriggeredAbility(new BoostSourceEffect(7,7,Duration.EndOfTurn), false)); + this.addAbility(new BlocksSourceTriggeredAbility( + new BoostSourceEffect(7, 7, Duration.EndOfTurn, "it") + )); // {W}: Jareth gains protection from the color of your choice until end of turn. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainProtectionFromColorSourceEffect(Duration.EndOfTurn), new ManaCostsImpl("{W}")); - this.addAbility(ability); - + this.addAbility(new SimpleActivatedAbility( + new GainProtectionFromColorSourceEffect(Duration.EndOfTurn), + new ColoredManaCost(ColoredManaSymbol.W) + )); } private JarethLeonineTitan(final JarethLeonineTitan card) { diff --git a/Mage.Sets/src/mage/cards/k/KaijinOfTheVanishingTouch.java b/Mage.Sets/src/mage/cards/k/KaijinOfTheVanishingTouch.java index 88b1f5ac6d4..ed7abd4aaa3 100644 --- a/Mage.Sets/src/mage/cards/k/KaijinOfTheVanishingTouch.java +++ b/Mage.Sets/src/mage/cards/k/KaijinOfTheVanishingTouch.java @@ -1,11 +1,9 @@ - package mage.cards.k; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.BlocksSourceTriggeredAbility; +import mage.abilities.common.BlocksCreatureTriggeredAbility; import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.abilities.keyword.DefenderAbility; @@ -31,9 +29,11 @@ public final class KaijinOfTheVanishingTouch extends CardImpl { this.addAbility(DefenderAbility.getInstance()); // Whenever Kaijin of the Vanishing Touch blocks a creature, return that creature to its owner's hand at end of combat. - Effect effect = new ReturnToHandTargetEffect(); - effect.setText("return that creature to its owner's hand at end of combat"); - this.addAbility(new BlocksSourceTriggeredAbility(new CreateDelayedTriggeredAbilityEffect(new AtTheEndOfCombatDelayedTriggeredAbility(effect)), false, true)); + this.addAbility(new BlocksCreatureTriggeredAbility( + new CreateDelayedTriggeredAbilityEffect( + new AtTheEndOfCombatDelayedTriggeredAbility(new ReturnToHandTargetEffect()) + ).setText("return that creature to its owner's hand at end of combat") + )); } private KaijinOfTheVanishingTouch(final KaijinOfTheVanishingTouch card) { diff --git a/Mage.Sets/src/mage/cards/l/LabyrinthMinotaur.java b/Mage.Sets/src/mage/cards/l/LabyrinthMinotaur.java index d05bfc44de7..1f042dae7a0 100644 --- a/Mage.Sets/src/mage/cards/l/LabyrinthMinotaur.java +++ b/Mage.Sets/src/mage/cards/l/LabyrinthMinotaur.java @@ -1,9 +1,8 @@ - package mage.cards.l; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.BlocksSourceTriggeredAbility; +import mage.abilities.common.BlocksCreatureTriggeredAbility; import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect; import mage.constants.SubType; import mage.cards.CardImpl; @@ -24,7 +23,9 @@ public final class LabyrinthMinotaur extends CardImpl { this.toughness = new MageInt(4); // Whenever Labyrinth Minotaur blocks a creature, that creature doesn't untap during its controller's next untap step. - this.addAbility(new BlocksSourceTriggeredAbility(new DontUntapInControllersNextUntapStepTargetEffect("that creature"), false, true)); + this.addAbility(new BlocksCreatureTriggeredAbility( + new DontUntapInControllersNextUntapStepTargetEffect("that creature") + )); } private LabyrinthMinotaur(final LabyrinthMinotaur card) { diff --git a/Mage.Sets/src/mage/cards/l/LoyalSentry.java b/Mage.Sets/src/mage/cards/l/LoyalSentry.java index e5d2e0a825a..dc6fb19ff2e 100644 --- a/Mage.Sets/src/mage/cards/l/LoyalSentry.java +++ b/Mage.Sets/src/mage/cards/l/LoyalSentry.java @@ -1,10 +1,9 @@ - package mage.cards.l; import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.common.BlocksSourceTriggeredAbility; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.BlocksCreatureTriggeredAbility; import mage.abilities.effects.common.DestroySourceEffect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; @@ -27,8 +26,9 @@ public final class LoyalSentry extends CardImpl { this.toughness = new MageInt(1); // When Loyal Sentry blocks a creature, destroy that creature and Loyal Sentry. - Ability ability = new BlocksSourceTriggeredAbility(new DestroyTargetEffect().setText("destroy that creature"), false, true, true); + TriggeredAbility ability = new BlocksCreatureTriggeredAbility(new DestroyTargetEffect().setText("destroy that creature")); ability.addEffect(new DestroySourceEffect().setText("and {this}")); + ability.setTriggerPhrase("When {this} blocks a creature, "); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/m/Meglonoth.java b/Mage.Sets/src/mage/cards/m/Meglonoth.java index 7769165fffe..870b0f67276 100644 --- a/Mage.Sets/src/mage/cards/m/Meglonoth.java +++ b/Mage.Sets/src/mage/cards/m/Meglonoth.java @@ -2,7 +2,7 @@ package mage.cards.m; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.BlocksSourceTriggeredAbility; +import mage.abilities.common.BlocksCreatureTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.TrampleAbility; import mage.abilities.keyword.VigilanceAbility; @@ -35,7 +35,7 @@ public final class Meglonoth extends CardImpl { this.addAbility(TrampleAbility.getInstance()); // Whenever Meglonoth blocks a creature, Meglonoth deals damage to that creature's controller equal to Meglonoth's power. - this.addAbility(new BlocksSourceTriggeredAbility(new MeglonothEffect(), false, true)); + this.addAbility(new BlocksCreatureTriggeredAbility(new MeglonothEffect())); } diff --git a/Mage.Sets/src/mage/cards/r/RoyalTrooper.java b/Mage.Sets/src/mage/cards/r/RoyalTrooper.java index 94180eb5cee..9fc2e3a4fb7 100644 --- a/Mage.Sets/src/mage/cards/r/RoyalTrooper.java +++ b/Mage.Sets/src/mage/cards/r/RoyalTrooper.java @@ -1,16 +1,14 @@ - package mage.cards.r; import java.util.UUID; import mage.MageInt; import mage.abilities.common.BlocksSourceTriggeredAbility; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; /** * @@ -26,9 +24,7 @@ public final class RoyalTrooper extends CardImpl { this.toughness = new MageInt(2); // Whenever Royal Trooper blocks, it gets +2/+2 until end of turn. - Effect effect = new BoostSourceEffect(2, 2, Duration.EndOfTurn); - effect.setText("it gets +2/+2 until end of turn"); - this.addAbility(new BlocksSourceTriggeredAbility(effect, false)); + this.addAbility(new BlocksSourceTriggeredAbility(new BoostSourceEffect(2, 2, Duration.EndOfTurn, "it"))); } private RoyalTrooper(final RoyalTrooper card) { diff --git a/Mage.Sets/src/mage/cards/s/SereneMaster.java b/Mage.Sets/src/mage/cards/s/SereneMaster.java index f39a4eae8d7..b52985a7815 100644 --- a/Mage.Sets/src/mage/cards/s/SereneMaster.java +++ b/Mage.Sets/src/mage/cards/s/SereneMaster.java @@ -4,6 +4,7 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.BlocksSourceTriggeredAbility; +import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.SetPowerToughnessTargetEffect; @@ -14,11 +15,9 @@ import mage.constants.SubType; import mage.constants.Duration; import mage.constants.Outcome; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.permanent.BlockedByIdPredicate; +import mage.filter.predicate.permanent.BlockingOrBlockedBySourcePredicate; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.target.Target; import mage.target.common.TargetCreaturePermanent; import mage.target.targetpointer.FixedTarget; @@ -28,6 +27,13 @@ import mage.target.targetpointer.FixedTarget; */ public final class SereneMaster extends CardImpl { + private static final FilterCreaturePermanent filter + = new FilterCreaturePermanent("creature it's blocking"); + + static { + filter.add(BlockingOrBlockedBySourcePredicate.BLOCKED_BY); + } + public SereneMaster(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); this.subtype.add(SubType.HUMAN); @@ -37,8 +43,9 @@ public final class SereneMaster extends CardImpl { this.toughness = new MageInt(2); // Whenever Serene Master blocks, exchange its power and the power of target creature it's blocking until end of combat. - this.addAbility(new BlocksSourceTriggeredAbility(new SereneMasterEffect(), false)); - + Ability ability = new BlocksSourceTriggeredAbility(new SereneMasterEffect()); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); } private SereneMaster(final SereneMaster card) { @@ -69,31 +76,19 @@ class SereneMasterEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); Permanent sourceCreature = game.getPermanent(source.getSourceId()); - if (controller != null && sourceCreature != null) { - FilterCreaturePermanent filter = new FilterCreaturePermanent("creature it's blocking"); - filter.add(new BlockedByIdPredicate((source.getSourceId()))); - Target target = new TargetCreaturePermanent(filter); - if (target.canChoose(controller.getId(), source, game)) { - if (controller.chooseTarget(outcome, target, source, game)) { - Permanent attackingCreature = game.getPermanent(target.getFirstTarget()); - if (attackingCreature != null) { - int newSourcePower = attackingCreature.getPower().getValue(); - int newAttackerPower = sourceCreature.getPower().getValue(); - ContinuousEffect effect = new SetPowerToughnessTargetEffect(newSourcePower, sourceCreature.getToughness().getValue(), Duration.EndOfCombat); - effect.setTargetPointer(new FixedTarget(source.getSourceId(), game)); - game.addEffect(effect, source); - effect = new SetPowerToughnessTargetEffect(newAttackerPower, attackingCreature.getToughness().getValue(), Duration.EndOfCombat); - effect.setTargetPointer(new FixedTarget(attackingCreature.getId(), game)); - game.addEffect(effect, source); - return true; - } - } - } - + Permanent attackingCreature = game.getPermanent(targetPointer.getFirst(game, source)); + if (sourceCreature != null && attackingCreature != null) { + StaticValue newSourcePower = StaticValue.get(attackingCreature.getPower().getValue()); + StaticValue newAttackerPower = StaticValue.get(sourceCreature.getPower().getValue()); + ContinuousEffect effect = new SetPowerToughnessTargetEffect(newSourcePower, null, Duration.EndOfCombat); + effect.setTargetPointer(new FixedTarget(source.getSourceId(), game)); + game.addEffect(effect, source); + effect = new SetPowerToughnessTargetEffect(newAttackerPower, null, Duration.EndOfCombat); + effect.setTargetPointer(new FixedTarget(attackingCreature.getId(), game)); + game.addEffect(effect, source); + return true; } return false; } - } diff --git a/Mage.Sets/src/mage/cards/s/ShuDefender.java b/Mage.Sets/src/mage/cards/s/ShuDefender.java index 7900c35b4d1..e4d3fc2d686 100644 --- a/Mage.Sets/src/mage/cards/s/ShuDefender.java +++ b/Mage.Sets/src/mage/cards/s/ShuDefender.java @@ -1,4 +1,3 @@ - package mage.cards.s; import java.util.UUID; @@ -8,8 +7,8 @@ import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; /** * @@ -25,7 +24,7 @@ public final class ShuDefender extends CardImpl { this.toughness = new MageInt(2); // Whenever Shu Defender blocks, it gets +0/+2 until end of turn. - this.addAbility(new BlocksSourceTriggeredAbility(new BoostSourceEffect(0, 2, Duration.EndOfTurn), false)); + this.addAbility(new BlocksSourceTriggeredAbility(new BoostSourceEffect(0, 2, Duration.EndOfTurn, "it"))); } private ShuDefender(final ShuDefender card) { diff --git a/Mage.Sets/src/mage/cards/s/StoicEphemera.java b/Mage.Sets/src/mage/cards/s/StoicEphemera.java index 21191738956..a0f1b1a5d4e 100644 --- a/Mage.Sets/src/mage/cards/s/StoicEphemera.java +++ b/Mage.Sets/src/mage/cards/s/StoicEphemera.java @@ -31,11 +31,13 @@ public final class StoicEphemera extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // When Stoic Ephemera blocks, sacrifice it at end of combat. - this.addAbility(new BlocksSourceTriggeredAbility( - new CreateDelayedTriggeredAbilityEffect( - new AtTheEndOfCombatDelayedTriggeredAbility(new SacrificeSourceEffect()) - ), false, false, true - )); + this.addAbility( + new BlocksSourceTriggeredAbility( + new CreateDelayedTriggeredAbilityEffect( + new AtTheEndOfCombatDelayedTriggeredAbility(new SacrificeSourceEffect()) + ).setText("sacrifice it at end of combat") + ).setTriggerPhrase("When {this} blocks, ") + ); } private StoicEphemera(final StoicEphemera card) { diff --git a/Mage.Sets/src/mage/cards/s/SustainerOfTheRealm.java b/Mage.Sets/src/mage/cards/s/SustainerOfTheRealm.java index 9fa32c744de..6c591f7ea1b 100644 --- a/Mage.Sets/src/mage/cards/s/SustainerOfTheRealm.java +++ b/Mage.Sets/src/mage/cards/s/SustainerOfTheRealm.java @@ -1,4 +1,3 @@ - package mage.cards.s; import java.util.UUID; @@ -9,8 +8,8 @@ import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; /** * @@ -28,7 +27,7 @@ public final class SustainerOfTheRealm extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // Whenever Sustainer of the Realm blocks, it gets +0/+2 until end of turn. - this.addAbility(new BlocksSourceTriggeredAbility(new BoostSourceEffect(0, 2, Duration.EndOfTurn), false)); + this.addAbility(new BlocksSourceTriggeredAbility(new BoostSourceEffect(0, 2, Duration.EndOfTurn, "it"))); } private SustainerOfTheRealm(final SustainerOfTheRealm card) { diff --git a/Mage.Sets/src/mage/cards/t/TownSentry.java b/Mage.Sets/src/mage/cards/t/TownSentry.java index 3bd3e75d021..1e9d4c239fb 100644 --- a/Mage.Sets/src/mage/cards/t/TownSentry.java +++ b/Mage.Sets/src/mage/cards/t/TownSentry.java @@ -1,4 +1,3 @@ - package mage.cards.t; import java.util.UUID; @@ -8,8 +7,8 @@ import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; /** * @@ -25,7 +24,7 @@ public final class TownSentry extends CardImpl { this.toughness = new MageInt(2); // Whenever Town Sentry blocks, it gets +0/+2 until end of turn. - this.addAbility(new BlocksSourceTriggeredAbility(new BoostSourceEffect(0, 2, Duration.EndOfTurn), false)); + this.addAbility(new BlocksSourceTriggeredAbility(new BoostSourceEffect(0, 2, Duration.EndOfTurn, "it"))); } private TownSentry(final TownSentry card) { diff --git a/Mage.Sets/src/mage/cards/v/VertigoSpawn.java b/Mage.Sets/src/mage/cards/v/VertigoSpawn.java index 8c8c4c79751..86153b040bf 100644 --- a/Mage.Sets/src/mage/cards/v/VertigoSpawn.java +++ b/Mage.Sets/src/mage/cards/v/VertigoSpawn.java @@ -1,10 +1,9 @@ - package mage.cards.v; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.BlocksSourceTriggeredAbility; +import mage.abilities.common.BlocksCreatureTriggeredAbility; import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect; import mage.abilities.effects.common.TapTargetEffect; import mage.abilities.keyword.DefenderAbility; @@ -29,7 +28,7 @@ public final class VertigoSpawn extends CardImpl { this.addAbility(DefenderAbility.getInstance()); // Whenever Vertigo Spawn blocks a creature, tap that creature. That creature doesn't untap during its controller's next untap step. - Ability ability = new BlocksSourceTriggeredAbility(new TapTargetEffect("tap that creature"), false, true); + Ability ability = new BlocksCreatureTriggeredAbility(new TapTargetEffect("tap that creature")); ability.addEffect(new DontUntapInControllersNextUntapStepTargetEffect("that creature")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/w/WallOfCaltrops.java b/Mage.Sets/src/mage/cards/w/WallOfCaltrops.java index 6fb5850498c..10376b4f3b5 100644 --- a/Mage.Sets/src/mage/cards/w/WallOfCaltrops.java +++ b/Mage.Sets/src/mage/cards/w/WallOfCaltrops.java @@ -3,7 +3,7 @@ package mage.cards.w; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.BlocksSourceTriggeredAbility; +import mage.abilities.common.BlocksCreatureTriggeredAbility; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.BandingAbility; import mage.abilities.keyword.DefenderAbility; @@ -47,7 +47,7 @@ public final class WallOfCaltrops extends CardImpl { } } -class WallOfCaltropsAbility extends BlocksSourceTriggeredAbility { +class WallOfCaltropsAbility extends BlocksCreatureTriggeredAbility { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Wall creature"); @@ -56,7 +56,7 @@ class WallOfCaltropsAbility extends BlocksSourceTriggeredAbility { } public WallOfCaltropsAbility() { - super(new GainAbilitySourceEffect(BandingAbility.getInstance(), Duration.EndOfTurn), false, false); + super(new GainAbilitySourceEffect(BandingAbility.getInstance(), Duration.EndOfTurn)); } public WallOfCaltropsAbility(WallOfCaltropsAbility ability) { diff --git a/Mage.Sets/src/mage/cards/w/WallOfDust.java b/Mage.Sets/src/mage/cards/w/WallOfDust.java index 5a5c40947cb..af110164e2e 100644 --- a/Mage.Sets/src/mage/cards/w/WallOfDust.java +++ b/Mage.Sets/src/mage/cards/w/WallOfDust.java @@ -3,7 +3,7 @@ package mage.cards.w; import mage.MageInt; import mage.MageObjectReference; import mage.abilities.Ability; -import mage.abilities.common.BlocksSourceTriggeredAbility; +import mage.abilities.common.BlocksCreatureTriggeredAbility; import mage.abilities.effects.RestrictionEffect; import mage.abilities.keyword.DefenderAbility; import mage.cards.CardImpl; @@ -32,7 +32,7 @@ public final class WallOfDust extends CardImpl { this.addAbility(DefenderAbility.getInstance()); // Whenever Wall of Dust blocks a creature, that creature can't attack during its controller's next turn. - this.addAbility(new BlocksSourceTriggeredAbility(new WallOfDustRestrictionEffect(), false, true)); + this.addAbility(new BlocksCreatureTriggeredAbility(new WallOfDustRestrictionEffect())); } private WallOfDust(final WallOfDust card) { diff --git a/Mage.Sets/src/mage/cards/w/WallOfFrost.java b/Mage.Sets/src/mage/cards/w/WallOfFrost.java index df94ac34cbc..2c676efff99 100644 --- a/Mage.Sets/src/mage/cards/w/WallOfFrost.java +++ b/Mage.Sets/src/mage/cards/w/WallOfFrost.java @@ -1,9 +1,8 @@ - package mage.cards.w; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.BlocksSourceTriggeredAbility; +import mage.abilities.common.BlocksCreatureTriggeredAbility; import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect; import mage.abilities.keyword.DefenderAbility; import mage.cards.CardImpl; @@ -27,7 +26,9 @@ public final class WallOfFrost extends CardImpl { this.addAbility(DefenderAbility.getInstance()); // Whenever Wall of Frost blocks a creature, that creature doesn't untap during its controller's next untap step. - this.addAbility(new BlocksSourceTriggeredAbility(new DontUntapInControllersNextUntapStepTargetEffect("that creature"), false, true)); + this.addAbility(new BlocksCreatureTriggeredAbility( + new DontUntapInControllersNextUntapStepTargetEffect("that creature") + )); } private WallOfFrost(final WallOfFrost card) { diff --git a/Mage.Sets/src/mage/cards/w/WallOfJunk.java b/Mage.Sets/src/mage/cards/w/WallOfJunk.java index 58d2962fd45..8142b7b8e68 100644 --- a/Mage.Sets/src/mage/cards/w/WallOfJunk.java +++ b/Mage.Sets/src/mage/cards/w/WallOfJunk.java @@ -33,7 +33,7 @@ public final class WallOfJunk extends CardImpl { Effect effect = new CreateDelayedTriggeredAbilityEffect( new AtTheEndOfCombatDelayedTriggeredAbility(new ReturnToHandSourceEffect(true))); effect.setText("return it to its owner's hand at end of combat"); - this.addAbility(new BlocksSourceTriggeredAbility(effect, false, false, true)); + this.addAbility(new BlocksSourceTriggeredAbility(effect).setTriggerPhrase("When {this} blocks, ")); } private WallOfJunk(final WallOfJunk card) { diff --git a/Mage.Sets/src/mage/cards/w/WallOfTears.java b/Mage.Sets/src/mage/cards/w/WallOfTears.java index 71be945367d..c2424a1260e 100644 --- a/Mage.Sets/src/mage/cards/w/WallOfTears.java +++ b/Mage.Sets/src/mage/cards/w/WallOfTears.java @@ -1,11 +1,9 @@ - package mage.cards.w; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.BlocksSourceTriggeredAbility; +import mage.abilities.common.BlocksCreatureTriggeredAbility; import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.abilities.keyword.DefenderAbility; @@ -30,9 +28,11 @@ public final class WallOfTears extends CardImpl { this.addAbility(DefenderAbility.getInstance()); // Whenever Wall of Tears blocks a creature, return that creature to its owner's hand at end of combat. - Effect effect = new ReturnToHandTargetEffect(); - effect.setText("return that creature to its owner's hand at end of combat"); - this.addAbility(new BlocksSourceTriggeredAbility(new CreateDelayedTriggeredAbilityEffect(new AtTheEndOfCombatDelayedTriggeredAbility(effect)), false, true)); + this.addAbility(new BlocksCreatureTriggeredAbility( + new CreateDelayedTriggeredAbilityEffect( + new AtTheEndOfCombatDelayedTriggeredAbility(new ReturnToHandTargetEffect()) + ).setText("return that creature to its owner's hand at end of combat") + )); } private WallOfTears(final WallOfTears card) { diff --git a/Mage.Sets/src/mage/cards/z/ZephyrSpirit.java b/Mage.Sets/src/mage/cards/z/ZephyrSpirit.java index ac88f4d9cfd..7e164047c20 100644 --- a/Mage.Sets/src/mage/cards/z/ZephyrSpirit.java +++ b/Mage.Sets/src/mage/cards/z/ZephyrSpirit.java @@ -24,10 +24,11 @@ public final class ZephyrSpirit extends CardImpl { this.toughness = new MageInt(6); // When Zephyr Spirit blocks, return it to its owner's hand. - this.addAbility(new BlocksSourceTriggeredAbility( - new ReturnToHandSourceEffect(true).setText("return it to its owner's hand"), - false, false, true - )); + this.addAbility( + new BlocksSourceTriggeredAbility( + new ReturnToHandSourceEffect(true).setText("return it to its owner's hand") + ).setTriggerPhrase("When {this} blocks, ") + ); } private ZephyrSpirit(final ZephyrSpirit card) { diff --git a/Mage.Sets/src/mage/cards/z/ZhaoZilongTigerGeneral.java b/Mage.Sets/src/mage/cards/z/ZhaoZilongTigerGeneral.java index d7939286090..9e6055a1f10 100644 --- a/Mage.Sets/src/mage/cards/z/ZhaoZilongTigerGeneral.java +++ b/Mage.Sets/src/mage/cards/z/ZhaoZilongTigerGeneral.java @@ -29,7 +29,7 @@ public final class ZhaoZilongTigerGeneral extends CardImpl { // Horsemanship this.addAbility(HorsemanshipAbility.getInstance()); // Whenever Zhao Zilong, Tiger General blocks, it gets +1/+1 until end of turn. - this.addAbility(new BlocksSourceTriggeredAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn), false)); + this.addAbility(new BlocksSourceTriggeredAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn, "it"))); } private ZhaoZilongTigerGeneral(final ZhaoZilongTigerGeneral card) { diff --git a/Mage/src/main/java/mage/abilities/common/BecomesBlockedByCreatureTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BecomesBlockedByCreatureTriggeredAbility.java index 80bdb8296db..0fb76640ff3 100644 --- a/Mage/src/main/java/mage/abilities/common/BecomesBlockedByCreatureTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/BecomesBlockedByCreatureTriggeredAbility.java @@ -7,8 +7,8 @@ import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; /** * @author North @@ -41,21 +41,16 @@ public class BecomesBlockedByCreatureTriggeredAbility extends TriggeredAbilityIm if (!event.getTargetId().equals(this.getSourceId())) { return false; } - Permanent blocker = game.getPermanent(event.getSourceId()); - if (!filter.match(blocker, game)) { + if (!filter.match(game.getPermanent(event.getSourceId()), getControllerId(), this, game)) { return false; } - for (Effect effect : this.getEffects()) { - effect.setTargetPointer(new FixedTarget(event.getSourceId(), game)); - } + getEffects().setTargetPointer(new FixedTarget(event.getSourceId(), game)); return true; } @Override public String getTriggerPhrase() { - return "Whenever {this} becomes blocked by " - + (filter.getMessage().startsWith("an ") ? "" : "a ") - + filter.getMessage() + ", " ; + return "Whenever {this} becomes blocked by " + CardUtil.addArticle(filter.getMessage()) + ", "; } @Override diff --git a/Mage/src/main/java/mage/abilities/common/BlocksCreatureTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BlocksCreatureTriggeredAbility.java index 42eef29b037..e8dc56c4c6f 100644 --- a/Mage/src/main/java/mage/abilities/common/BlocksCreatureTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/BlocksCreatureTriggeredAbility.java @@ -7,6 +7,7 @@ import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.events.GameEvent; +import mage.target.targetpointer.FixedTarget; import mage.util.CardUtil; /** @@ -16,6 +17,10 @@ public class BlocksCreatureTriggeredAbility extends TriggeredAbilityImpl { private final FilterCreaturePermanent filter; + public BlocksCreatureTriggeredAbility(Effect effect) { + this(effect, false); + } + public BlocksCreatureTriggeredAbility(Effect effect, boolean optional) { this(effect, StaticFilters.FILTER_PERMANENT_CREATURE, optional); } @@ -37,8 +42,14 @@ public class BlocksCreatureTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - return event.getSourceId().equals(this.getSourceId()) - && filter.match(game.getPermanent(event.getTargetId()), getControllerId(), this, game); + if (!event.getSourceId().equals(this.getSourceId())) { + return false; + } + if (!filter.match(game.getPermanent(event.getTargetId()), getControllerId(), this, game)) { + return false; + } + getEffects().setTargetPointer(new FixedTarget(event.getTargetId(), game)); + return true; } @Override diff --git a/Mage/src/main/java/mage/abilities/common/BlocksSourceTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BlocksSourceTriggeredAbility.java index ea59eed6ee9..98b517163e4 100644 --- a/Mage/src/main/java/mage/abilities/common/BlocksSourceTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/BlocksSourceTriggeredAbility.java @@ -1,4 +1,3 @@ - package mage.abilities.common; import mage.constants.Zone; @@ -6,7 +5,7 @@ import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; import mage.game.Game; import mage.game.events.GameEvent; -import mage.target.targetpointer.FixedTarget; +import mage.game.permanent.Permanent; /** * @@ -14,50 +13,32 @@ import mage.target.targetpointer.FixedTarget; */ public class BlocksSourceTriggeredAbility extends TriggeredAbilityImpl { - private boolean setTargetPointer; - private boolean once = false; + public BlocksSourceTriggeredAbility(Effect effect) { + this(effect, false); + } public BlocksSourceTriggeredAbility(Effect effect, boolean optional) { - this(effect, optional, false); - } - - public BlocksSourceTriggeredAbility(Effect effect, boolean optional, boolean setTargetPointer) { - this(effect, optional, setTargetPointer, false); - } - - public BlocksSourceTriggeredAbility(Effect effect, boolean optional, boolean setTargetPointer, boolean once) { super(Zone.BATTLEFIELD, effect, optional); - this.setTargetPointer = setTargetPointer; - this.once = once; } public BlocksSourceTriggeredAbility(final BlocksSourceTriggeredAbility ability) { super(ability); - this.setTargetPointer = ability.setTargetPointer; - this.once = ability.once; } @Override public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.BLOCKER_DECLARED; + return event.getType() == GameEvent.EventType.DECLARED_BLOCKERS; } @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event.getSourceId().equals(this.getSourceId())) { - if (setTargetPointer) { - for (Effect effect : this.getEffects()) { - effect.setTargetPointer(new FixedTarget(event.getTargetId())); - } - } - return true; - } - return false; + Permanent permanent = game.getPermanent(getSourceId()); + return permanent != null && permanent.getBlocking() > 0; } @Override public String getTriggerPhrase() { - return "When" + (once ? "" : "ever") + " {this} blocks" + (setTargetPointer ? " a creature, " : ", ") ; + return "Whenever {this} blocks, "; } @Override diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostSourceEffect.java index 2523c515157..1e0bdc5f33c 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostSourceEffect.java @@ -23,7 +23,11 @@ public class BoostSourceEffect extends ContinuousEffectImpl implements SourceEff private final boolean lockedIn; public BoostSourceEffect(int power, int toughness, Duration duration) { - this(StaticValue.get(power), StaticValue.get(toughness), duration, false); + this(power, toughness, duration, "{this}"); + } + + public BoostSourceEffect(int power, int toughness, Duration duration, String description) { + this(StaticValue.get(power), StaticValue.get(toughness), duration, false, description); } public BoostSourceEffect(DynamicValue power, DynamicValue toughness, Duration duration) { diff --git a/Mage/src/main/java/mage/game/permanent/token/MesmerizingBenthidToken.java b/Mage/src/main/java/mage/game/permanent/token/MesmerizingBenthidToken.java index 3dcd37d1ddb..685f5dc84d5 100644 --- a/Mage/src/main/java/mage/game/permanent/token/MesmerizingBenthidToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/MesmerizingBenthidToken.java @@ -1,7 +1,7 @@ package mage.game.permanent.token; import mage.MageInt; -import mage.abilities.common.BlocksSourceTriggeredAbility; +import mage.abilities.common.BlocksCreatureTriggeredAbility; import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect; import mage.constants.CardType; import mage.constants.SubType; @@ -20,9 +20,8 @@ public final class MesmerizingBenthidToken extends TokenImpl { subtype.add(SubType.ILLUSION); power = new MageInt(0); toughness = new MageInt(2); - this.addAbility(new BlocksSourceTriggeredAbility( - new DontUntapInControllersNextUntapStepTargetEffect("that creature"), - false, true + this.addAbility(new BlocksCreatureTriggeredAbility( + new DontUntapInControllersNextUntapStepTargetEffect("that creature") )); }