diff --git a/Mage.Sets/src/mage/cards/a/Abomination.java b/Mage.Sets/src/mage/cards/a/Abomination.java
index 5e3adfd1688..9713b57e3a6 100644
--- a/Mage.Sets/src/mage/cards/a/Abomination.java
+++ b/Mage.Sets/src/mage/cards/a/Abomination.java
@@ -1,10 +1,9 @@
-
package mage.cards.a;
import java.util.UUID;
import mage.MageInt;
import mage.ObjectColor;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
@@ -39,7 +38,7 @@ public final class Abomination extends CardImpl {
// Whenever Abomination blocks or becomes blocked by a green or white 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 BlocksOrBecomesBlockedSourceTriggeredAbility(effect, filter, false));
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(effect, filter));
}
private Abomination(final Abomination card) {
diff --git a/Mage.Sets/src/mage/cards/a/AislingLeprechaun.java b/Mage.Sets/src/mage/cards/a/AislingLeprechaun.java
index 6854efffd40..8eaac1bab1b 100644
--- a/Mage.Sets/src/mage/cards/a/AislingLeprechaun.java
+++ b/Mage.Sets/src/mage/cards/a/AislingLeprechaun.java
@@ -1,11 +1,9 @@
-
package mage.cards.a;
import java.util.UUID;
import mage.MageInt;
import mage.ObjectColor;
-import mage.abilities.Ability;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.BecomesColorTargetEffect;
import mage.cards.CardImpl;
@@ -29,8 +27,7 @@ public final class AislingLeprechaun extends CardImpl {
// Whenever Aisling Leprechaun blocks or becomes blocked by a creature, that creature becomes green.
Effect effect = new BecomesColorTargetEffect(ObjectColor.GREEN, Duration.EndOfGame);
effect.setText("that creature becomes green");
- Ability ability = new BlocksOrBecomesBlockedSourceTriggeredAbility(effect, false);
- this.addAbility(ability);
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(effect));
}
private AislingLeprechaun(final AislingLeprechaun card) {
diff --git a/Mage.Sets/src/mage/cards/a/ArrogantBloodlord.java b/Mage.Sets/src/mage/cards/a/ArrogantBloodlord.java
index d4210950b76..45185d1dd66 100644
--- a/Mage.Sets/src/mage/cards/a/ArrogantBloodlord.java
+++ b/Mage.Sets/src/mage/cards/a/ArrogantBloodlord.java
@@ -1,41 +1,43 @@
-
package mage.cards.a;
-import java.util.Objects;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility;
-import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
+import mage.abilities.effects.common.DestroySourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.Outcome;
+import mage.constants.ComparisonType;
import mage.constants.SubType;
-import mage.constants.Zone;
-import mage.game.Game;
-import mage.game.events.GameEvent;
-import mage.game.permanent.Permanent;
-import mage.target.targetpointer.FixedTarget;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.PowerPredicate;
/**
*
- * @author jeffwadsworth
+ * @author awjackson
*/
public final class ArrogantBloodlord extends CardImpl {
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with power 1 or less");
+
+ static {
+ filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, 2));
+ }
+
public ArrogantBloodlord(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{B}");
- this.subtype.add(SubType.VAMPIRE);
- this.subtype.add(SubType.KNIGHT);
+ this.subtype.add(SubType.VAMPIRE, SubType.KNIGHT);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
// Whenever Arrogant Bloodlord blocks or becomes blocked by a creature with power 1 or less, destroy Arrogant Bloodlord at end of combat.
- this.addAbility(new ArrogantBloodlordTriggeredAbility());
+ Effect effect = new CreateDelayedTriggeredAbilityEffect(new AtTheEndOfCombatDelayedTriggeredAbility(new DestroySourceEffect()));
+ effect.setText("destroy {this} at end of combat");
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(effect, filter));
}
private ArrogantBloodlord(final ArrogantBloodlord card) {
@@ -47,72 +49,3 @@ public final class ArrogantBloodlord extends CardImpl {
return new ArrogantBloodlord(this);
}
}
-
-class ArrogantBloodlordTriggeredAbility extends TriggeredAbilityImpl {
-
- ArrogantBloodlordTriggeredAbility() {
- super(Zone.BATTLEFIELD, new ArrogantBloodlordEffect());
- }
-
- ArrogantBloodlordTriggeredAbility(final ArrogantBloodlordTriggeredAbility ability) {
- super(ability);
- }
-
- @Override
- public ArrogantBloodlordTriggeredAbility copy() {
- return new ArrogantBloodlordTriggeredAbility(this);
- }
-
- @Override
- public boolean checkEventType(GameEvent event, Game game) {
- return event.getType() == GameEvent.EventType.BLOCKER_DECLARED;
- }
-
- @Override
- public boolean checkTrigger(GameEvent event, Game game) {
- Permanent blocker = game.getPermanent(event.getSourceId());
- Permanent blocked = game.getPermanent(event.getTargetId());
- Permanent arrogantBloodlord = game.getPermanent(sourceId);
- if (blocker != null && !Objects.equals(blocker, arrogantBloodlord)
- && blocker.getPower().getValue() < 2
- && Objects.equals(blocked, arrogantBloodlord)) {
- return true;
- }
- return blocker != null && Objects.equals(blocker, arrogantBloodlord)
- && game.getPermanent(event.getTargetId()).getPower().getValue() < 2;
- }
-
- @Override
- public String getRule() {
- return "Whenever {this} blocks or becomes blocked by a creature with power 1 or less, destroy {this} at end of combat.";
- }
-}
-
-class ArrogantBloodlordEffect extends OneShotEffect {
-
- ArrogantBloodlordEffect() {
- super(Outcome.Detriment);
- staticText = "Destroy {this} at the end of combat";
- }
-
- ArrogantBloodlordEffect(final ArrogantBloodlordEffect effect) {
- super(effect);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Permanent permanent = game.getPermanent(source.getSourceId());
- if (permanent != null) {
- AtTheEndOfCombatDelayedTriggeredAbility delayedAbility = new AtTheEndOfCombatDelayedTriggeredAbility(new DestroyTargetEffect());
- delayedAbility.getEffects().get(0).setTargetPointer(new FixedTarget(permanent, game));
- game.addDelayedTriggeredAbility(delayedAbility, source);
- return true;
- }
- return false;
- }
-
- @Override
- public ArrogantBloodlordEffect copy() {
- return new ArrogantBloodlordEffect(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/a/AshmouthHound.java b/Mage.Sets/src/mage/cards/a/AshmouthHound.java
index a602c971040..4fcfac4c2ab 100644
--- a/Mage.Sets/src/mage/cards/a/AshmouthHound.java
+++ b/Mage.Sets/src/mage/cards/a/AshmouthHound.java
@@ -1,9 +1,8 @@
-
package mage.cards.a;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -18,14 +17,13 @@ public final class AshmouthHound extends CardImpl {
public AshmouthHound(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
- this.subtype.add(SubType.ELEMENTAL);
- this.subtype.add(SubType.DOG);
+ this.subtype.add(SubType.ELEMENTAL, SubType.DOG);
this.power = new MageInt(2);
this.toughness = new MageInt(1);
// Whenever Ashmouth Hound blocks or becomes blocked by a creature, Ashmouth Hound deals 1 damage to that creature.
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(new DamageTargetEffect(1, true, "that creature"), false));
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(new DamageTargetEffect(1, true, "that creature")));
}
private AshmouthHound(final AshmouthHound card) {
diff --git a/Mage.Sets/src/mage/cards/a/AssembledAlphas.java b/Mage.Sets/src/mage/cards/a/AssembledAlphas.java
index ba886a2ec13..dd5ca0e07cf 100644
--- a/Mage.Sets/src/mage/cards/a/AssembledAlphas.java
+++ b/Mage.Sets/src/mage/cards/a/AssembledAlphas.java
@@ -1,11 +1,9 @@
-
package mage.cards.a;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
-import mage.abilities.effects.Effect;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.effects.common.DamageTargetControllerEffect;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.cards.CardImpl;
@@ -27,12 +25,8 @@ public final class AssembledAlphas extends CardImpl {
this.toughness = new MageInt(5);
// Whenever Assembled Alphas blocks or becomes blocked by a creature, Assembled Alphas deals 3 damage to that creature and 3 damage to that creature's controller.
- Ability ability = new BlocksOrBecomesBlockedSourceTriggeredAbility(
- new DamageTargetEffect(3, true, "that creature"), StaticFilters.FILTER_PERMANENT_CREATURE, false, null, true);
-
- Effect effect = new DamageTargetControllerEffect(3);
- effect.setText("and 3 damage to that creature's controller");
- ability.addEffect(effect);
+ Ability ability = new BlocksOrBlockedByCreatureSourceTriggeredAbility(new DamageTargetEffect(3, true, "that creature"));
+ ability.addEffect(new DamageTargetControllerEffect(3).setText("and 3 damage to that creature's controller"));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/b/BlastfireBolt.java b/Mage.Sets/src/mage/cards/b/BlastfireBolt.java
index 681b81191fe..282ba82e489 100644
--- a/Mage.Sets/src/mage/cards/b/BlastfireBolt.java
+++ b/Mage.Sets/src/mage/cards/b/BlastfireBolt.java
@@ -1,11 +1,11 @@
-
package mage.cards.b;
import mage.abilities.effects.common.DamageTargetEffect;
-import mage.abilities.effects.common.DestroyAllAttachedEquipmentEffect;
+import mage.abilities.effects.common.DestroyAllAttachedToTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.filter.StaticFilters;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
@@ -19,10 +19,9 @@ public final class BlastfireBolt extends CardImpl {
public BlastfireBolt(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{5}{R}");
-
// Blastfire Bolt deals 5 damage to target creature. Destroy all Equipment attached to that creature.
this.getSpellAbility().addEffect(new DamageTargetEffect(5));
- this.getSpellAbility().addEffect(new DestroyAllAttachedEquipmentEffect());
+ this.getSpellAbility().addEffect(new DestroyAllAttachedToTargetEffect(StaticFilters.FILTER_PERMANENT_EQUIPMENT, "that creature"));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
}
diff --git a/Mage.Sets/src/mage/cards/b/Brushwagg.java b/Mage.Sets/src/mage/cards/b/Brushwagg.java
index 38a1a71e03c..d7ad4e24adf 100644
--- a/Mage.Sets/src/mage/cards/b/Brushwagg.java
+++ b/Mage.Sets/src/mage/cards/b/Brushwagg.java
@@ -1,9 +1,8 @@
-
package mage.cards.b;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedSourceTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -24,7 +23,7 @@ public final class Brushwagg extends CardImpl {
this.toughness = new MageInt(2);
// Whenever Brushwagg blocks or becomes blocked, it gets -2/+2 until end of turn.
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(new BoostSourceEffect(-2, 2, Duration.EndOfTurn), false));
+ this.addAbility(new BlocksOrBlockedSourceTriggeredAbility(new BoostSourceEffect(-2, 2, Duration.EndOfTurn, "it")));
}
private Brushwagg(final Brushwagg card) {
diff --git a/Mage.Sets/src/mage/cards/c/ChubToad.java b/Mage.Sets/src/mage/cards/c/ChubToad.java
index 6273ec86601..0569f91801f 100644
--- a/Mage.Sets/src/mage/cards/c/ChubToad.java
+++ b/Mage.Sets/src/mage/cards/c/ChubToad.java
@@ -1,11 +1,8 @@
-
package mage.cards.c;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
-import mage.abilities.effects.Effect;
+import mage.abilities.common.BlocksOrBlockedSourceTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -22,14 +19,12 @@ public final class ChubToad extends CardImpl {
public ChubToad(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}");
this.subtype.add(SubType.FROG);
+
this.power = new MageInt(1);
this.toughness = new MageInt(1);
// Whenever Chub Toad blocks or becomes blocked, 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");
- Ability ability = new BlocksOrBecomesBlockedSourceTriggeredAbility(effect, false);
- this.addAbility(ability);
+ this.addAbility(new BlocksOrBlockedSourceTriggeredAbility(new BoostSourceEffect(2, 2, Duration.EndOfTurn, "it")));
}
private ChubToad(final ChubToad card) {
diff --git a/Mage.Sets/src/mage/cards/c/Cockatrice.java b/Mage.Sets/src/mage/cards/c/Cockatrice.java
index fd1dc18e5b3..58d9352a1e6 100644
--- a/Mage.Sets/src/mage/cards/c/Cockatrice.java
+++ b/Mage.Sets/src/mage/cards/c/Cockatrice.java
@@ -1,9 +1,8 @@
-
package mage.cards.c;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
@@ -37,11 +36,11 @@ public final class Cockatrice extends CardImpl {
// Flying
this.addAbility(FlyingAbility.getInstance());
-
+
// Whenever Cockatrice blocks or becomes blocked by a non-Wall 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 BlocksOrBecomesBlockedSourceTriggeredAbility(effect, filter, false));
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(effect, filter));
}
private Cockatrice(final Cockatrice card) {
diff --git a/Mage.Sets/src/mage/cards/c/CorrosiveOoze.java b/Mage.Sets/src/mage/cards/c/CorrosiveOoze.java
index 84b7c2c9c1a..636ac17ecf1 100644
--- a/Mage.Sets/src/mage/cards/c/CorrosiveOoze.java
+++ b/Mage.Sets/src/mage/cards/c/CorrosiveOoze.java
@@ -3,7 +3,7 @@ package mage.cards.c;
import mage.MageInt;
import mage.MageObjectReference;
import mage.abilities.Ability;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
@@ -44,7 +44,7 @@ public final class CorrosiveOoze extends CardImpl {
// Whenever Corrosive Ooze blocks or becomes blocked by an equipped creature, destroy all Equipment attached to that creature at end of combat.
Effect effect = new CreateDelayedTriggeredAbilityEffect(new AtTheEndOfCombatDelayedTriggeredAbility(new CorrosiveOozeEffect()), true);
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(effect, filter, false), new CorrosiveOozeCombatWatcher());
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(effect, filter), new CorrosiveOozeCombatWatcher());
}
private CorrosiveOoze(final CorrosiveOoze card) {
diff --git a/Mage.Sets/src/mage/cards/d/Deathgazer.java b/Mage.Sets/src/mage/cards/d/Deathgazer.java
index 91b1633fdca..517aa728fed 100644
--- a/Mage.Sets/src/mage/cards/d/Deathgazer.java
+++ b/Mage.Sets/src/mage/cards/d/Deathgazer.java
@@ -2,7 +2,7 @@ package mage.cards.d;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
@@ -29,8 +29,7 @@ public final class Deathgazer extends CardImpl {
// Whenever Deathgazer blocks or becomes blocked by a nonblack 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 BlocksOrBecomesBlockedSourceTriggeredAbility(effect, StaticFilters.FILTER_PERMANENT_CREATURE_NON_BLACK, false));
-
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(effect, StaticFilters.FILTER_PERMANENT_CREATURE_NON_BLACK));
}
private Deathgazer(final Deathgazer card) {
diff --git a/Mage.Sets/src/mage/cards/d/DreadSpecter.java b/Mage.Sets/src/mage/cards/d/DreadSpecter.java
index 46ea7fd1b12..4353d7af85e 100644
--- a/Mage.Sets/src/mage/cards/d/DreadSpecter.java
+++ b/Mage.Sets/src/mage/cards/d/DreadSpecter.java
@@ -2,7 +2,7 @@ package mage.cards.d;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
@@ -28,7 +28,7 @@ public final class DreadSpecter extends CardImpl {
// Whenever Dread Specter blocks or becomes blocked by a nonblack 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 BlocksOrBecomesBlockedSourceTriggeredAbility(effect, StaticFilters.FILTER_PERMANENT_CREATURE_NON_BLACK, false));
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(effect, StaticFilters.FILTER_PERMANENT_CREATURE_NON_BLACK));
}
private DreadSpecter(final DreadSpecter card) {
diff --git a/Mage.Sets/src/mage/cards/d/DreamFighter.java b/Mage.Sets/src/mage/cards/d/DreamFighter.java
index 7933672484e..34d757e4763 100644
--- a/Mage.Sets/src/mage/cards/d/DreamFighter.java
+++ b/Mage.Sets/src/mage/cards/d/DreamFighter.java
@@ -2,14 +2,13 @@ package mage.cards.d;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.effects.common.PhaseOutSourceEffect;
import mage.abilities.effects.common.PhaseOutTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
-import mage.filter.StaticFilters;
import java.util.UUID;
@@ -27,12 +26,8 @@ public final class DreamFighter extends CardImpl {
this.toughness = new MageInt(1);
// Whenever Dream Fighter blocks or becomes blocked by a creature, Dream Fighter and that creature phase out.
- Ability ability = new BlocksOrBecomesBlockedSourceTriggeredAbility(
- new PhaseOutSourceEffect(), StaticFilters.FILTER_PERMANENT_CREATURE,
- false, "Whenever {this} blocks or becomes blocked by a creature, " +
- "{this} and that creature phase out.", true
- );
- ability.addEffect(new PhaseOutTargetEffect());
+ Ability ability = new BlocksOrBlockedByCreatureSourceTriggeredAbility(new PhaseOutSourceEffect().setText("{this}"));
+ ability.addEffect(new PhaseOutTargetEffect().setText("and that creature phase out"));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/d/Dromosaur.java b/Mage.Sets/src/mage/cards/d/Dromosaur.java
index 227fe7b9ebc..72896856ea6 100644
--- a/Mage.Sets/src/mage/cards/d/Dromosaur.java
+++ b/Mage.Sets/src/mage/cards/d/Dromosaur.java
@@ -1,9 +1,8 @@
-
package mage.cards.d;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedSourceTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -13,7 +12,7 @@ import mage.constants.SubType;
/**
*
- * @author Backfir3
+ * @author awjackson
*/
public final class Dromosaur extends CardImpl {
@@ -24,8 +23,8 @@ public final class Dromosaur extends CardImpl {
this.power = new MageInt(2);
this.toughness = new MageInt(3);
- // Whenever Dromosaur blocks or becomes blocked by a creature, it gets +2/-2 until end of turn.
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(new BoostSourceEffect(2, -2, Duration.EndOfTurn), false));
+ // Whenever Dromosaur blocks or becomes blocked, it gets +2/-2 until end of turn.
+ this.addAbility(new BlocksOrBlockedSourceTriggeredAbility(new BoostSourceEffect(2, -2, Duration.EndOfTurn, "it")));
}
private Dromosaur(final Dromosaur card) {
diff --git a/Mage.Sets/src/mage/cards/e/EngulfingSlagwurm.java b/Mage.Sets/src/mage/cards/e/EngulfingSlagwurm.java
index 6def86c4fd1..5b9c24b6c20 100644
--- a/Mage.Sets/src/mage/cards/e/EngulfingSlagwurm.java
+++ b/Mage.Sets/src/mage/cards/e/EngulfingSlagwurm.java
@@ -4,7 +4,7 @@ package mage.cards.e;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.cards.CardImpl;
@@ -30,7 +30,7 @@ public final class EngulfingSlagwurm extends CardImpl {
this.toughness = new MageInt(7);
// Whenever Engulfing Slagwurm blocks or becomes blocked by a creature, destroy that creature. You gain life equal to that creature's toughness.
- Ability ability = new BlocksOrBecomesBlockedSourceTriggeredAbility(new DestroyTargetEffect(), false);
+ Ability ability = new BlocksOrBlockedByCreatureSourceTriggeredAbility(new DestroyTargetEffect());
ability.addEffect(new EngulfingSlagwurmEffect());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/e/EscapedNull.java b/Mage.Sets/src/mage/cards/e/EscapedNull.java
index ad1ad8718dc..2f782576184 100644
--- a/Mage.Sets/src/mage/cards/e/EscapedNull.java
+++ b/Mage.Sets/src/mage/cards/e/EscapedNull.java
@@ -1,9 +1,8 @@
-
package mage.cards.e;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedSourceTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.keyword.LifelinkAbility;
import mage.cards.CardImpl;
@@ -27,7 +26,7 @@ public final class EscapedNull extends CardImpl {
this.toughness = new MageInt(2);
this.addAbility(LifelinkAbility.getInstance());
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(new BoostSourceEffect(5, 0, Duration.EndOfTurn).setText("it gets +5/+0 until end of turn"), false, false));
+ this.addAbility(new BlocksOrBlockedSourceTriggeredAbility(new BoostSourceEffect(5, 0, Duration.EndOfTurn, "it")));
}
private EscapedNull(final EscapedNull card) {
diff --git a/Mage.Sets/src/mage/cards/f/Ferocity.java b/Mage.Sets/src/mage/cards/f/Ferocity.java
index dff660cc420..3f7ea48e28b 100644
--- a/Mage.Sets/src/mage/cards/f/Ferocity.java
+++ b/Mage.Sets/src/mage/cards/f/Ferocity.java
@@ -1,27 +1,22 @@
package mage.cards.f;
import java.util.UUID;
-import mage.constants.SubType;
-import mage.target.common.TargetCreaturePermanent;
-import mage.abilities.Ability;
-import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.BlocksOrBlockedAttachedTriggeredAbility;
import mage.abilities.effects.common.AttachEffect;
-import mage.abilities.effects.common.counter.AddCountersAttachedEffect;
-import mage.constants.Outcome;
-import mage.target.TargetPermanent;
+import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.Zone;
+import mage.constants.Outcome;
+import mage.constants.SubType;
import mage.counters.CounterType;
-import mage.game.Game;
-import mage.game.events.GameEvent;
-import mage.game.permanent.Permanent;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetCreaturePermanent;
/**
*
- * @author TheElk801
+ * @author awjackson
*/
public final class Ferocity extends CardImpl {
@@ -34,11 +29,13 @@ public final class Ferocity extends CardImpl {
TargetPermanent auraTarget = new TargetCreaturePermanent();
this.getSpellAbility().addTarget(auraTarget);
this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
- Ability ability = new EnchantAbility(auraTarget.getTargetName());
- this.addAbility(ability);
+ this.addAbility(new EnchantAbility(auraTarget.getTargetName()));
// Whenever enchanted creature blocks or becomes blocked, you may put a +1/+1 counter on it.
- this.addAbility(new FerocityTriggeredAbility());
+ this.addAbility(new BlocksOrBlockedAttachedTriggeredAbility(
+ new AddCountersTargetEffect(CounterType.P1P1.createInstance()).setText("put a +1/+1 counter on it"),
+ true
+ ));
}
private Ferocity(final Ferocity card) {
@@ -50,47 +47,3 @@ public final class Ferocity extends CardImpl {
return new Ferocity(this);
}
}
-
-class FerocityTriggeredAbility extends TriggeredAbilityImpl {
-
- public FerocityTriggeredAbility() {
- super(Zone.BATTLEFIELD, new AddCountersAttachedEffect(CounterType.P1P1.createInstance(), "it"), true);
- }
-
- public FerocityTriggeredAbility(final FerocityTriggeredAbility ability) {
- super(ability);
- }
-
- @Override
- public boolean checkEventType(GameEvent event, Game game) {
- return event.getType() == GameEvent.EventType.BLOCKER_DECLARED;
- }
-
- @Override
- public boolean checkTrigger(GameEvent event, Game game) {
- Permanent aura = game.getPermanent(sourceId);
- if (aura == null || aura.getAttachedTo() == null) {
- return false;
- }
- if (event.getSourceId().equals(aura.getAttachedTo())) {
- Permanent blocks = game.getPermanent(event.getTargetId());
- return blocks != null;
- }
- if (event.getTargetId().equals(aura.getAttachedTo())) {
- Permanent blockedBy = game.getPermanent(event.getSourceId());
- return blockedBy != null;
- }
- return false;
- }
-
- @Override
- public String getRule() {
- return "Whenever enchanted creature blocks or becomes blocked, "
- + "you may put a +1/+1 counter on it";
- }
-
- @Override
- public FerocityTriggeredAbility copy() {
- return new FerocityTriggeredAbility(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/f/FlailingDrake.java b/Mage.Sets/src/mage/cards/f/FlailingDrake.java
index e152eb5a9f3..5266a722d34 100644
--- a/Mage.Sets/src/mage/cards/f/FlailingDrake.java
+++ b/Mage.Sets/src/mage/cards/f/FlailingDrake.java
@@ -1,10 +1,8 @@
-
package mage.cards.f;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.keyword.FlyingAbility;
@@ -13,7 +11,6 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Duration;
-import mage.filter.StaticFilters;
/**
*
@@ -32,8 +29,7 @@ public final class FlailingDrake extends CardImpl {
// Whenever Flailing Drake blocks or becomes blocked by a creature, that creature gets +1/+1 until end of turn.
Effect effect = new BoostTargetEffect(+1, +1, Duration.EndOfTurn);
effect.setText("that creature gets +1/+1 until end of turn");
- Ability ability = new BlocksOrBecomesBlockedSourceTriggeredAbility(effect, StaticFilters.FILTER_PERMANENT_A_CREATURE, false, null, true);
- this.addAbility(ability);
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(effect));
}
private FlailingDrake(final FlailingDrake card) {
diff --git a/Mage.Sets/src/mage/cards/f/FlameheartWerewolf.java b/Mage.Sets/src/mage/cards/f/FlameheartWerewolf.java
index b73d8bc11e7..a1666e46be1 100644
--- a/Mage.Sets/src/mage/cards/f/FlameheartWerewolf.java
+++ b/Mage.Sets/src/mage/cards/f/FlameheartWerewolf.java
@@ -1,14 +1,13 @@
package mage.cards.f;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.common.WerewolfBackTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
-import mage.filter.StaticFilters;
import java.util.UUID;
@@ -28,8 +27,7 @@ public final class FlameheartWerewolf extends CardImpl {
this.nightCard = true;
// Whenever Flameheart Werewolf blocks or becomes blocked by a creature, Flameheart Werewolf deals 2 damage to that creature.
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(new DamageTargetEffect(2, true, "that creature"),
- StaticFilters.FILTER_PERMANENT_CREATURE, false, null, true));
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(new DamageTargetEffect(2, true, "that creature")));
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Flameheart Werewolf.
this.addAbility(new WerewolfBackTriggeredAbility());
diff --git a/Mage.Sets/src/mage/cards/g/GhostHounds.java b/Mage.Sets/src/mage/cards/g/GhostHounds.java
index e48e31b8a04..033873715fa 100644
--- a/Mage.Sets/src/mage/cards/g/GhostHounds.java
+++ b/Mage.Sets/src/mage/cards/g/GhostHounds.java
@@ -1,10 +1,9 @@
-
package mage.cards.g;
import java.util.UUID;
import mage.MageInt;
import mage.ObjectColor;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.abilities.keyword.VigilanceAbility;
@@ -40,8 +39,7 @@ public final class GhostHounds extends CardImpl {
this.addAbility(VigilanceAbility.getInstance());
// Whenever Ghost Hounds blocks or becomes blocked by a white creature, Ghost Hounds gains first strike until end of turn.
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(new GainAbilitySourceEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn), filter, false));
-
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(new GainAbilitySourceEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn), filter));
}
private GhostHounds(final GhostHounds card) {
diff --git a/Mage.Sets/src/mage/cards/g/GiantShark.java b/Mage.Sets/src/mage/cards/g/GiantShark.java
index 3176d52907e..5d28dd48549 100644
--- a/Mage.Sets/src/mage/cards/g/GiantShark.java
+++ b/Mage.Sets/src/mage/cards/g/GiantShark.java
@@ -2,7 +2,7 @@ package mage.cards.g;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.SacrificeSourceEffect;
@@ -43,7 +43,7 @@ public final class GiantShark extends CardImpl {
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(filter)));
// Whenever Giant Shark blocks or becomes blocked by a creature that has been dealt damage this turn, Giant Shark gets +2/+0 and gains trample until end of turn.
- Ability ability = new BlocksOrBecomesBlockedSourceTriggeredAbility(new BoostSourceEffect(2, 0, Duration.EndOfTurn).setText("{this} gets +2/+0"), filter2, false);
+ Ability ability = new BlocksOrBlockedByCreatureSourceTriggeredAbility(new BoostSourceEffect(2, 0, Duration.EndOfTurn).setText("{this} gets +2/+0"), filter2);
ability.addEffect(new GainAbilitySourceEffect(TrampleAbility.getInstance(), Duration.EndOfTurn).setText("and gains trample until end of turn"));
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/g/GiftOfTheWoods.java b/Mage.Sets/src/mage/cards/g/GiftOfTheWoods.java
index 2dd91bd49d2..e78b9676f0b 100644
--- a/Mage.Sets/src/mage/cards/g/GiftOfTheWoods.java
+++ b/Mage.Sets/src/mage/cards/g/GiftOfTheWoods.java
@@ -1,16 +1,16 @@
package mage.cards.g;
-import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.Ability;
+import mage.abilities.common.BlocksOrBlockedAttachedTriggeredAbility;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.GainLifeEffect;
-import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
-import mage.game.Game;
-import mage.game.events.GameEvent;
-import mage.game.permanent.Permanent;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.SubType;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
@@ -28,12 +28,14 @@ public final class GiftOfTheWoods extends CardImpl {
// Enchant creature
TargetPermanent auraTarget = new TargetCreaturePermanent();
- this.getSpellAbility().addEffect(new AttachEffect(Outcome.Benefit));
+ this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
this.getSpellAbility().addTarget(auraTarget);
this.addAbility(new EnchantAbility(auraTarget.getTargetName()));
// Whenever enchanted creature blocks or becomes blocked, it gets +0/+3 until end of turn and you gain 1 life.
- this.addAbility(new GiftOfTheWoodsTriggeredAbility());
+ Ability ability = new BlocksOrBlockedAttachedTriggeredAbility(new BoostTargetEffect(0, 3).setText("it gets +0/+3 until end of turn"));
+ ability.addEffect(new GainLifeEffect(1).concatBy("and"));
+ this.addAbility(ability);
}
private GiftOfTheWoods(final GiftOfTheWoods card) {
@@ -45,39 +47,3 @@ public final class GiftOfTheWoods extends CardImpl {
return new GiftOfTheWoods(this);
}
}
-
-class GiftOfTheWoodsTriggeredAbility extends TriggeredAbilityImpl {
-
- GiftOfTheWoodsTriggeredAbility() {
- super(Zone.BATTLEFIELD, new BoostEnchantedEffect(0, 3, Duration.EndOfTurn));
- this.addEffect(new GainLifeEffect(1));
- }
-
- private GiftOfTheWoodsTriggeredAbility(final GiftOfTheWoodsTriggeredAbility ability) {
- super(ability);
- }
-
- @Override
- public GiftOfTheWoodsTriggeredAbility copy() {
- return new GiftOfTheWoodsTriggeredAbility(this);
- }
-
- @Override
- public boolean checkEventType(GameEvent event, Game game) {
- return event.getType() == GameEvent.EventType.BLOCKER_DECLARED;
- }
-
- @Override
- public boolean checkTrigger(GameEvent event, Game game) {
- Permanent permanent = getSourcePermanentIfItStillExists(game);
- return permanent != null && permanent.getAttachedTo() != null
- && (event.getSourceId().equals(permanent.getAttachedTo())
- || event.getTargetId().equals(permanent.getAttachedTo()));
- }
-
- @Override
- public String getRule() {
- return "Whenever enchanted creature blocks or becomes blocked, " +
- "it gets +0/+3 until end of turn and you gain 1 life.";
- }
-}
diff --git a/Mage.Sets/src/mage/cards/g/GoblinCadets.java b/Mage.Sets/src/mage/cards/g/GoblinCadets.java
index ef6c5679d0c..89921ec5275 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinCadets.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinCadets.java
@@ -1,10 +1,9 @@
-
package mage.cards.g;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedSourceTriggeredAbility;
import mage.abilities.effects.ContinuousEffectImpl;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -27,7 +26,7 @@ public final class GoblinCadets extends CardImpl {
this.toughness = new MageInt(1);
// Whenever Goblin Cadets blocks or becomes blocked, target opponent gains control of it.
- Ability ability = new BlocksOrBecomesBlockedSourceTriggeredAbility(new GoblinCadetsChangeControlEffect(), false);
+ Ability ability = new BlocksOrBlockedSourceTriggeredAbility(new GoblinCadetsChangeControlEffect());
ability.addTarget(new TargetOpponent());
this.addAbility(ability);
@@ -47,7 +46,7 @@ class GoblinCadetsChangeControlEffect extends ContinuousEffectImpl {
public GoblinCadetsChangeControlEffect() {
super(Duration.Custom, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl);
- staticText = "target opponent gains control of {this}";
+ staticText = "target opponent gains control of it. (This removes {this} from combat.)";
}
public GoblinCadetsChangeControlEffect(final GoblinCadetsChangeControlEffect effect) {
@@ -69,5 +68,4 @@ class GoblinCadetsChangeControlEffect extends ContinuousEffectImpl {
}
return false;
}
-
}
diff --git a/Mage.Sets/src/mage/cards/g/GoblinEliteInfantry.java b/Mage.Sets/src/mage/cards/g/GoblinEliteInfantry.java
index e0e9f696dad..a3b1deafda2 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinEliteInfantry.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinEliteInfantry.java
@@ -1,9 +1,8 @@
-
package mage.cards.g;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedSourceTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -24,7 +23,7 @@ public final class GoblinEliteInfantry extends CardImpl {
this.power = new MageInt(2);
this.toughness = new MageInt(2);
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(new BoostSourceEffect(-1, -1, Duration.EndOfTurn), false));
+ this.addAbility(new BlocksOrBlockedSourceTriggeredAbility(new BoostSourceEffect(-1, -1, Duration.EndOfTurn, "it")));
}
private GoblinEliteInfantry(final GoblinEliteInfantry card) {
diff --git a/Mage.Sets/src/mage/cards/g/GoblinFlotilla.java b/Mage.Sets/src/mage/cards/g/GoblinFlotilla.java
index 9b7a64726a8..fb45202374d 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinFlotilla.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinFlotilla.java
@@ -3,7 +3,7 @@ package mage.cards.g;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.BeginningOfCombatTriggeredAbility;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DoUnlessControllerPaysEffect;
@@ -37,7 +37,7 @@ public final class GoblinFlotilla extends CardImpl {
// At the beginning of each combat, unless you pay {R}, whenever Goblin Flotilla blocks or becomes blocked by a creature this combat, that creature gains first strike until end of turn.
Effect effect = new DoUnlessControllerPaysEffect(
new GainAbilitySourceEffect(
- new BlocksOrBecomesBlockedSourceTriggeredAbility(
+ new BlocksOrBlockedByCreatureSourceTriggeredAbility(
new GainAbilityTargetEffect(FirstStrikeAbility.getInstance(),
Duration.EndOfTurn,
"Blocks or Blocked by Goblin Flotilla"),
diff --git a/Mage.Sets/src/mage/cards/g/GorgonRecluse.java b/Mage.Sets/src/mage/cards/g/GorgonRecluse.java
index c5b4d424ae4..fb0e06e0f19 100644
--- a/Mage.Sets/src/mage/cards/g/GorgonRecluse.java
+++ b/Mage.Sets/src/mage/cards/g/GorgonRecluse.java
@@ -2,7 +2,7 @@ package mage.cards.g;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.Effect;
@@ -30,7 +30,7 @@ public final class GorgonRecluse extends CardImpl {
// Whenever Gorgon Recluse blocks or becomes blocked by a nonblack 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 BlocksOrBecomesBlockedSourceTriggeredAbility(effect, StaticFilters.FILTER_PERMANENT_CREATURE_NON_BLACK, false));
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(effect, StaticFilters.FILTER_PERMANENT_CREATURE_NON_BLACK));
// Madness {B}{B}
this.addAbility(new MadnessAbility(new ManaCostsImpl<>("{B}{B}")));
diff --git a/Mage.Sets/src/mage/cards/i/InfernoElemental.java b/Mage.Sets/src/mage/cards/i/InfernoElemental.java
index 165ab2daf5b..1ba8734e94d 100644
--- a/Mage.Sets/src/mage/cards/i/InfernoElemental.java
+++ b/Mage.Sets/src/mage/cards/i/InfernoElemental.java
@@ -1,9 +1,8 @@
-
package mage.cards.i;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -24,7 +23,7 @@ public final class InfernoElemental extends CardImpl {
this.toughness = new MageInt(4);
// Whenever Inferno Elemental blocks or becomes blocked by a creature, Inferno Elemental deals 3 damage to that creature.
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(new DamageTargetEffect(3, true, "that creature"), false));
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(new DamageTargetEffect(3, true, "that creature")));
}
private InfernoElemental(final InfernoElemental card) {
diff --git a/Mage.Sets/src/mage/cards/j/JukaiTrainee.java b/Mage.Sets/src/mage/cards/j/JukaiTrainee.java
index 147dba078fe..ce4e0cdb671 100644
--- a/Mage.Sets/src/mage/cards/j/JukaiTrainee.java
+++ b/Mage.Sets/src/mage/cards/j/JukaiTrainee.java
@@ -1,7 +1,7 @@
package mage.cards.j;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedSourceTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -25,11 +25,7 @@ public final class JukaiTrainee extends CardImpl {
this.toughness = new MageInt(2);
// Whenever Jukai Trainee blocks or becomes blocked, it gets +1/+1 until end of turn.
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(
- new BoostSourceEffect(1, 1, Duration.EndOfTurn)
- .setText("it gets +1/+1 until end of turn"),
- false, false
- ));
+ this.addAbility(new BlocksOrBlockedSourceTriggeredAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn, "it")));
}
private JukaiTrainee(final JukaiTrainee card) {
diff --git a/Mage.Sets/src/mage/cards/k/KarnSilverGolem.java b/Mage.Sets/src/mage/cards/k/KarnSilverGolem.java
index 3a15dc78ee9..246c81e981e 100644
--- a/Mage.Sets/src/mage/cards/k/KarnSilverGolem.java
+++ b/Mage.Sets/src/mage/cards/k/KarnSilverGolem.java
@@ -1,10 +1,9 @@
-
package mage.cards.k;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedSourceTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.ContinuousEffectImpl;
@@ -38,7 +37,7 @@ public final class KarnSilverGolem extends CardImpl {
this.toughness = new MageInt(4);
// Whenever Karn, Silver Golem blocks or becomes blocked, it gets -4/+4 until end of turn.
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(new BoostSourceEffect(-4, +4, Duration.EndOfTurn), false));
+ this.addAbility(new BlocksOrBlockedSourceTriggeredAbility(new BoostSourceEffect(-4, +4, Duration.EndOfTurn, "it")));
// {1}: Target noncreature artifact becomes an artifact creature with power and toughness each equal to its converted mana cost until end of turn.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new KarnSilverGolemEffect(), new ManaCostsImpl<>("{1}"));
diff --git a/Mage.Sets/src/mage/cards/k/KessigForgemaster.java b/Mage.Sets/src/mage/cards/k/KessigForgemaster.java
index 1b2339634d8..77c073320d1 100644
--- a/Mage.Sets/src/mage/cards/k/KessigForgemaster.java
+++ b/Mage.Sets/src/mage/cards/k/KessigForgemaster.java
@@ -1,7 +1,7 @@
package mage.cards.k;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.common.WerewolfFrontTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.keyword.TransformAbility;
@@ -20,22 +20,18 @@ public final class KessigForgemaster extends CardImpl {
public KessigForgemaster(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.SHAMAN);
- this.subtype.add(SubType.WEREWOLF);
+ this.subtype.add(SubType.HUMAN, SubType.SHAMAN, SubType.WEREWOLF);
this.power = new MageInt(2);
this.toughness = new MageInt(1);
this.secondSideCardClazz = mage.cards.f.FlameheartWerewolf.class;
// Whenever Kessig Forgemaster blocks or becomes blocked by a creature, Kessig Forgemaster deals 1 damage to that creature.
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(new DamageTargetEffect(1, true, "that creature"),
- StaticFilters.FILTER_PERMANENT_CREATURE, false, null, true));
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(new DamageTargetEffect(1, true, "that creature")));
// At the beginning of each upkeep, if no spells were cast last turn, transform Kessig Forgemaster.
this.addAbility(new TransformAbility());
this.addAbility(new WerewolfFrontTriggeredAbility());
-
}
private KessigForgemaster(final KessigForgemaster card) {
diff --git a/Mage.Sets/src/mage/cards/l/LimDulsCohort.java b/Mage.Sets/src/mage/cards/l/LimDulsCohort.java
index 0472534abd7..dbf33c0b1f1 100644
--- a/Mage.Sets/src/mage/cards/l/LimDulsCohort.java
+++ b/Mage.Sets/src/mage/cards/l/LimDulsCohort.java
@@ -2,7 +2,7 @@ package mage.cards.l;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.effects.common.CantBeRegeneratedTargetEffect;
import mage.constants.SubType;
import mage.cards.CardImpl;
@@ -25,13 +25,10 @@ public final class LimDulsCohort extends CardImpl {
this.toughness = new MageInt(3);
// Whenever Lim-Dûl's Cohort blocks or becomes blocked by a creature, that creature can't be regenerated this turn.
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(
- new CantBeRegeneratedTargetEffect(Duration.EndOfTurn),
- new FilterCreaturePermanent(),
- false,
- "Whenever {this} blocks or becomes blocked by a creature, that creature can't be regenerated this turn.",
- true));
-
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(
+ new CantBeRegeneratedTargetEffect(Duration.EndOfTurn)
+ .setText("that creature can't be regenerated this turn")
+ ));
}
private LimDulsCohort(final LimDulsCohort card) {
diff --git a/Mage.Sets/src/mage/cards/m/MammothHarness.java b/Mage.Sets/src/mage/cards/m/MammothHarness.java
index 48bde41bbe4..636ca192783 100644
--- a/Mage.Sets/src/mage/cards/m/MammothHarness.java
+++ b/Mage.Sets/src/mage/cards/m/MammothHarness.java
@@ -2,7 +2,7 @@ package mage.cards.m;
import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
@@ -12,13 +12,7 @@ import mage.abilities.keyword.FirstStrikeAbility;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.AttachmentType;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.Zone;
-import mage.filter.StaticFilters;
+import mage.constants.*;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
@@ -44,7 +38,7 @@ public final class MammothHarness extends CardImpl {
this.addAbility(ability);
// Enchanted creature loses flying.
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new LoseAbilityAttachedEffect(FlyingAbility.getInstance(), AttachmentType.AURA)));
+ this.addAbility(new SimpleStaticAbility(new LoseAbilityAttachedEffect(FlyingAbility.getInstance(), AttachmentType.AURA)));
// Whenever enchanted creature blocks or becomes blocked by a creature, the other creature gains first strike until end of turn.
this.addAbility(new MammothHarnessTriggeredAbility());
@@ -60,38 +54,38 @@ public final class MammothHarness extends CardImpl {
}
}
-class MammothHarnessTriggeredAbility extends BlocksOrBecomesBlockedSourceTriggeredAbility {
+class MammothHarnessTriggeredAbility extends TriggeredAbilityImpl {
public MammothHarnessTriggeredAbility() {
- super(new GainAbilityTargetEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn), StaticFilters.FILTER_PERMANENT_CREATURE, false, null, false);
+ super(Zone.BATTLEFIELD, new GainAbilityTargetEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn), false);
}
public MammothHarnessTriggeredAbility(final MammothHarnessTriggeredAbility ability) {
super(ability);
+ }
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.BLOCKER_DECLARED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
- Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(this.getSourceId());
- if (sourcePermanent != null) {
- Permanent attachedTo = game.getPermanentOrLKIBattlefield(sourcePermanent.getAttachedTo());
- if (event.getSourceId().equals(attachedTo.getId())) {
- Permanent blocked = game.getPermanent(event.getTargetId());
- if (blocked != null && filter.match(blocked, game)) {
- this.getEffects().setTargetPointer(new FixedTarget(event.getTargetId(), game));
- return true;
- }
- }
- if (event.getTargetId().equals(attachedTo.getId())) {
- Permanent blocker = game.getPermanent(event.getSourceId());
- if (blocker != null) {
- this.getEffects().setTargetPointer(new FixedTarget(event.getSourceId(), game));
- return true;
- }
- }
+ Permanent aura = getSourcePermanentIfItStillExists(game);
+ if (aura == null) {
+ return false;
}
- return false;
+ Permanent otherCreature = null;
+ if (event.getSourceId().equals(aura.getAttachedTo())) {
+ otherCreature = game.getPermanent(event.getTargetId());
+ } else if (event.getTargetId().equals(aura.getAttachedTo())) {
+ otherCreature = game.getPermanent(event.getSourceId());
+ }
+ if (otherCreature == null) {
+ return false;
+ }
+ getEffects().setTargetPointer(new FixedTarget(otherCreature, game));
+ return true;
}
@Override
diff --git a/Mage.Sets/src/mage/cards/m/MirrorShield.java b/Mage.Sets/src/mage/cards/m/MirrorShield.java
index 27d9368dc83..1896efa66a3 100644
--- a/Mage.Sets/src/mage/cards/m/MirrorShield.java
+++ b/Mage.Sets/src/mage/cards/m/MirrorShield.java
@@ -1,7 +1,7 @@
package mage.cards.m;
import mage.abilities.Ability;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
@@ -25,14 +25,14 @@ import java.util.UUID;
*/
public final class MirrorShield extends CardImpl {
- private static final FilterPermanent filter = new FilterCreaturePermanent();
+ private static final FilterPermanent filter = new FilterCreaturePermanent("creature with deathtouch");
static {
filter.add(new AbilityPredicate(DeathtouchAbility.class));
}
- private static final String rule
- = "Whenever a creature with deathtouch blocks or becomes blocked by this creature, destroy that creature.";
+ private static final String triggerPhrase
+ = "Whenever a creature with deathtouch blocks or becomes blocked by this creature, ";
public MirrorShield(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
@@ -40,13 +40,14 @@ public final class MirrorShield extends CardImpl {
this.subtype.add(SubType.EQUIPMENT);
// Equipped creature gets +0/+2 and has hexproof and "Whenever a creature with deathtouch blocks or becomes blocked by this creature, destroy that creature."
+ Ability gainedAbility = new BlocksOrBlockedByCreatureSourceTriggeredAbility(new DestroyTargetEffect(), filter).setTriggerPhrase(triggerPhrase);
Ability ability = new SimpleStaticAbility(new BoostEquippedEffect(0, 2));
ability.addEffect(new GainAbilityAttachedEffect(
HexproofAbility.getInstance(), AttachmentType.EQUIPMENT
).setText("and has hexproof"));
- ability.addEffect(new GainAbilityAttachedEffect(new BlocksOrBecomesBlockedSourceTriggeredAbility(
- new DestroyTargetEffect(), filter, false, rule + "", true
- ), AttachmentType.EQUIPMENT).setText("and \"" + rule + "\""));
+ ability.addEffect(new GainAbilityAttachedEffect(
+ gainedAbility, AttachmentType.EQUIPMENT
+ ).setText("and \"" + triggerPhrase + "destroy that creature.\""));
this.addAbility(ability);
// Equip {2}
diff --git a/Mage.Sets/src/mage/cards/o/OrneryGoblin.java b/Mage.Sets/src/mage/cards/o/OrneryGoblin.java
index 07269701359..5c78ad12729 100644
--- a/Mage.Sets/src/mage/cards/o/OrneryGoblin.java
+++ b/Mage.Sets/src/mage/cards/o/OrneryGoblin.java
@@ -2,7 +2,7 @@ package mage.cards.o;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.constants.SubType;
import mage.cards.CardImpl;
@@ -24,9 +24,7 @@ public final class OrneryGoblin extends CardImpl {
this.toughness = new MageInt(1);
// Whenever Ornery Goblin blocks or becomes blocked by a creature, Ornery Goblin deals 1 damage to that creature.
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(
- new DamageTargetEffect(1, true, "that creature"), false
- ));
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(new DamageTargetEffect(1, true, "that creature")));
}
private OrneryGoblin(final OrneryGoblin card) {
diff --git a/Mage.Sets/src/mage/cards/r/RagingGorilla.java b/Mage.Sets/src/mage/cards/r/RagingGorilla.java
index 288041ae45e..96338c8452b 100644
--- a/Mage.Sets/src/mage/cards/r/RagingGorilla.java
+++ b/Mage.Sets/src/mage/cards/r/RagingGorilla.java
@@ -1,9 +1,8 @@
-
package mage.cards.r;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedSourceTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -24,7 +23,7 @@ public final class RagingGorilla extends CardImpl {
this.toughness = new MageInt(3);
// Whenever Raging Gorilla blocks or becomes blocked, it gets +2/-2 until end of turn.
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(new BoostSourceEffect(2, -2, Duration.EndOfTurn), false));
+ this.addAbility(new BlocksOrBlockedSourceTriggeredAbility(new BoostSourceEffect(2, -2, Duration.EndOfTurn, "it")));
}
private RagingGorilla(final RagingGorilla card) {
diff --git a/Mage.Sets/src/mage/cards/r/RockBasilisk.java b/Mage.Sets/src/mage/cards/r/RockBasilisk.java
index 7c73da9d99e..c1471580bba 100644
--- a/Mage.Sets/src/mage/cards/r/RockBasilisk.java
+++ b/Mage.Sets/src/mage/cards/r/RockBasilisk.java
@@ -1,9 +1,8 @@
-
package mage.cards.r;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
@@ -38,7 +37,7 @@ public final class RockBasilisk extends CardImpl {
Effect effect = new CreateDelayedTriggeredAbilityEffect(
new AtTheEndOfCombatDelayedTriggeredAbility(new DestroyTargetEffect()), true);
effect.setText("destroy that creature at end of combat");
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(effect, filter, false));
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(effect, filter));
}
private RockBasilisk(final RockBasilisk card) {
diff --git a/Mage.Sets/src/mage/cards/s/SawtoothOgre.java b/Mage.Sets/src/mage/cards/s/SawtoothOgre.java
index 6c3d702d2b2..a16e563da8b 100644
--- a/Mage.Sets/src/mage/cards/s/SawtoothOgre.java
+++ b/Mage.Sets/src/mage/cards/s/SawtoothOgre.java
@@ -3,7 +3,7 @@ package mage.cards.s;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
@@ -26,10 +26,9 @@ public final class SawtoothOgre extends CardImpl {
this.toughness = new MageInt(3);
// Whenever Sawtooth Ogre blocks or becomes blocked by a creature, Sawtooth Ogre deals 1 damage to that creature at end of combat.
- Effect effect = new CreateDelayedTriggeredAbilityEffect(new AtTheEndOfCombatDelayedTriggeredAbility(
- new DamageTargetEffect(1)), true)
- .setText("{this} deals 1 damage to that creature at end of combat");
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(effect, false));
+ Effect effect = new CreateDelayedTriggeredAbilityEffect(new AtTheEndOfCombatDelayedTriggeredAbility(new DamageTargetEffect(1)), true);
+ effect.setText("{this} deals 1 damage to that creature at end of combat");
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(effect));
}
private SawtoothOgre(final SawtoothOgre card) {
diff --git a/Mage.Sets/src/mage/cards/s/ShapeStealer.java b/Mage.Sets/src/mage/cards/s/ShapeStealer.java
index 29edfa696f4..e80a425c385 100644
--- a/Mage.Sets/src/mage/cards/s/ShapeStealer.java
+++ b/Mage.Sets/src/mage/cards/s/ShapeStealer.java
@@ -4,7 +4,7 @@ package mage.cards.s;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect;
@@ -37,7 +37,7 @@ public final class ShapeStealer extends CardImpl {
// each one in succession. The first trigger put on the stack will be the last to resolve,
// so that will set Shape Stealer's final power and toughness.
// Whenever Shape Stealer blocks or becomes blocked by a creature, change Shape Stealer's base power and toughness to that creature's power and toughness until end of turn.
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(new ShapeStealerEffect(), false));
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(new ShapeStealerEffect()));
}
private ShapeStealer(final ShapeStealer card) {
diff --git a/Mage.Sets/src/mage/cards/s/SlinkingGiant.java b/Mage.Sets/src/mage/cards/s/SlinkingGiant.java
index f5d58e3e95b..26d8901d527 100644
--- a/Mage.Sets/src/mage/cards/s/SlinkingGiant.java
+++ b/Mage.Sets/src/mage/cards/s/SlinkingGiant.java
@@ -1,9 +1,8 @@
-
package mage.cards.s;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedSourceTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.keyword.WitherAbility;
import mage.cards.CardImpl;
@@ -28,7 +27,7 @@ public final class SlinkingGiant extends CardImpl {
this.addAbility(WitherAbility.getInstance());
// Whenever Slinking Giant blocks or becomes blocked, it gets -3/-0 until end of turn.
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(new BoostSourceEffect(-3, 0, Duration.EndOfTurn).setText("it gets -3/-0 until end of turn"), false).setTriggerPhrase("Whenever {this} blocks or becomes blocked, "));
+ this.addAbility(new BlocksOrBlockedSourceTriggeredAbility(new BoostSourceEffect(-3, 0, Duration.EndOfTurn, "it")));
}
private SlinkingGiant(final SlinkingGiant card) {
diff --git a/Mage.Sets/src/mage/cards/s/SpittingSlug.java b/Mage.Sets/src/mage/cards/s/SpittingSlug.java
index d4e2c1cabbb..031532866b3 100644
--- a/Mage.Sets/src/mage/cards/s/SpittingSlug.java
+++ b/Mage.Sets/src/mage/cards/s/SpittingSlug.java
@@ -1,30 +1,21 @@
-
package mage.cards.s;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedSourceTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.effects.ContinuousEffect;
-import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
-import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Duration;
-import mage.constants.Outcome;
import mage.filter.common.FilterCreaturePermanent;
-import mage.filter.predicate.Predicates;
-import mage.filter.predicate.permanent.BlockedByIdPredicate;
-import mage.filter.predicate.permanent.BlockingAttackerIdPredicate;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
-import mage.target.targetpointer.FixedTarget;
+import mage.filter.predicate.permanent.BlockingOrBlockedBySourcePredicate;
/**
*
@@ -32,6 +23,12 @@ import mage.target.targetpointer.FixedTarget;
*/
public final class SpittingSlug extends CardImpl {
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("each creature blocking or blocked by {this}");
+
+ static {
+ filter.add(BlockingOrBlockedBySourcePredicate.EITHER);
+ }
+
public SpittingSlug(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}{G}");
this.subtype.add(SubType.SLUG);
@@ -39,9 +36,10 @@ public final class SpittingSlug extends CardImpl {
this.toughness = new MageInt(4);
// Whenever Spitting Slug blocks or becomes blocked, you may pay {1}{G}. If you do, Spitting Slug gains first strike until end of turn. Otherwise, each creature blocking or blocked by Spitting Slug gains first strike until end of turn.
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(
- new DoIfCostPaid(new GainAbilitySourceEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn),
- new SpittingSlugEffect(),
+ this.addAbility(new BlocksOrBlockedSourceTriggeredAbility(
+ new DoIfCostPaid(
+ new GainAbilitySourceEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn),
+ new GainAbilityAllEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn, filter),
new ManaCostsImpl<>("{1}{G}")).setText("you may pay {1}{G}. If you do, {this} gains first strike until end of turn. Otherwise, each creature blocking or blocked by {this} gains first strike until end of turn"),
false));
}
@@ -55,35 +53,3 @@ public final class SpittingSlug extends CardImpl {
return new SpittingSlug(this);
}
}
-
-class SpittingSlugEffect extends OneShotEffect {
-
- public SpittingSlugEffect() {
- super(Outcome.Detriment);
- }
-
- public SpittingSlugEffect(final SpittingSlugEffect effect) {
- super(effect);
- }
-
- @Override
- public SpittingSlugEffect copy() {
- return new SpittingSlugEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
- if (sourcePermanent != null) {
- FilterCreaturePermanent filter = new FilterCreaturePermanent();
- filter.add(Predicates.or(new BlockedByIdPredicate(sourcePermanent.getId()), new BlockingAttackerIdPredicate(sourcePermanent.getId())));
- for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, game)) {
- ContinuousEffect effect = new GainAbilityTargetEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn);
- effect.setTargetPointer(new FixedTarget(permanent, game));
- game.addEffect(effect, source);
- }
- return true;
- }
- return false;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/s/StripBare.java b/Mage.Sets/src/mage/cards/s/StripBare.java
index ed5e726cde4..fb223835c13 100644
--- a/Mage.Sets/src/mage/cards/s/StripBare.java
+++ b/Mage.Sets/src/mage/cards/s/StripBare.java
@@ -1,35 +1,34 @@
-
package mage.cards.s;
import java.util.UUID;
-import mage.abilities.Ability;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DestroyAllAttachedToTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.Outcome;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.predicate.Predicates;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
import mage.target.common.TargetCreaturePermanent;
/**
*
- * @author jeffwadsworth
+ * @author awjackson
*
*/
public final class StripBare extends CardImpl {
+ private static final FilterPermanent filter = new FilterPermanent("Auras and Equipment");
+
+ static {
+ filter.add(Predicates.or(SubType.AURA.getPredicate(), SubType.EQUIPMENT.getPredicate()));
+ }
+
public StripBare(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{W}");
-
// Destroy all Auras and Equipment attached to target creature.
- this.getSpellAbility().addEffect(new StripBareEffect());
+ this.getSpellAbility().addEffect(new DestroyAllAttachedToTargetEffect(filter, "target creature"));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
-
}
private StripBare(final StripBare card) {
@@ -41,39 +40,3 @@ public final class StripBare extends CardImpl {
return new StripBare(this);
}
}
-
-class StripBareEffect extends OneShotEffect {
-
- public StripBareEffect() {
- super(Outcome.GainLife);
- this.staticText = "Destroy all Auras and Equipment attached to target creature";
- }
-
- public StripBareEffect(final StripBareEffect effect) {
- super(effect);
- }
-
- @Override
- public StripBareEffect copy() {
- return new StripBareEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- boolean applied = false;
- FilterPermanent filter = new FilterPermanent();
- filter.add(Predicates.or(SubType.EQUIPMENT.getPredicate(),
- SubType.AURA.getPredicate()));
- Permanent targetCreature = game.getPermanent(source.getFirstTarget());
- if (targetCreature != null
- && !targetCreature.getAttachments().isEmpty()) {
- for (Permanent attachment : game.getBattlefield().getAllActivePermanents(filter, game)) {
- if (attachment != null
- && targetCreature.getAttachments().contains(attachment.getId())) {
- applied = attachment.destroy(source, game, false);
- }
- }
- }
- return applied;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/t/TalruumChampion.java b/Mage.Sets/src/mage/cards/t/TalruumChampion.java
index 81b7ed44233..47060b7c0bd 100644
--- a/Mage.Sets/src/mage/cards/t/TalruumChampion.java
+++ b/Mage.Sets/src/mage/cards/t/TalruumChampion.java
@@ -1,9 +1,8 @@
-
package mage.cards.t;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.LoseAbilityTargetEffect;
import mage.abilities.keyword.FirstStrikeAbility;
@@ -31,7 +30,7 @@ public final class TalruumChampion extends CardImpl {
// Whenever Talruum Champion blocks or becomes blocked by a creature, that creature loses first strike until end of turn.
Effect effect = new LoseAbilityTargetEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn);
effect.setText("that creature loses first strike until end of turn");
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(effect, false));
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(effect));
}
private TalruumChampion(final TalruumChampion card) {
diff --git a/Mage.Sets/src/mage/cards/t/TangleAsp.java b/Mage.Sets/src/mage/cards/t/TangleAsp.java
index 05de2bac31b..2d4dc767eb6 100644
--- a/Mage.Sets/src/mage/cards/t/TangleAsp.java
+++ b/Mage.Sets/src/mage/cards/t/TangleAsp.java
@@ -1,9 +1,8 @@
-
package mage.cards.t;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
@@ -30,7 +29,7 @@ public final class TangleAsp extends CardImpl {
// Whenever Tangle Asp blocks or becomes blocked by 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 BlocksOrBecomesBlockedSourceTriggeredAbility(effect, false));
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(effect));
}
private TangleAsp(final TangleAsp card) {
diff --git a/Mage.Sets/src/mage/cards/t/ThicketBasilisk.java b/Mage.Sets/src/mage/cards/t/ThicketBasilisk.java
index 7f63dab733f..d2500dedc9f 100644
--- a/Mage.Sets/src/mage/cards/t/ThicketBasilisk.java
+++ b/Mage.Sets/src/mage/cards/t/ThicketBasilisk.java
@@ -1,9 +1,8 @@
-
package mage.cards.t;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
@@ -37,7 +36,7 @@ public final class ThicketBasilisk extends CardImpl {
// Whenever Thicket Basilisk blocks or becomes blocked by a non-Wall 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 BlocksOrBecomesBlockedSourceTriggeredAbility(effect, filter, false));
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(effect, filter));
}
private ThicketBasilisk(final ThicketBasilisk card) {
diff --git a/Mage.Sets/src/mage/cards/t/TreefolkMystic.java b/Mage.Sets/src/mage/cards/t/TreefolkMystic.java
index 9b29a443622..dd6a8e95a64 100644
--- a/Mage.Sets/src/mage/cards/t/TreefolkMystic.java
+++ b/Mage.Sets/src/mage/cards/t/TreefolkMystic.java
@@ -1,20 +1,14 @@
-
package mage.cards.t;
-import java.util.LinkedList;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.Mode;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
+import mage.abilities.effects.common.DestroyAllAttachedToTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
-import mage.constants.Outcome;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
+import mage.filter.StaticFilters;
/**
*
@@ -30,7 +24,9 @@ public final class TreefolkMystic extends CardImpl {
this.toughness = new MageInt(4);
// Whenever Treefolk Mystic blocks or becomes blocked by a creature, destroy all Auras attached to that creature.
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(new TreefolkMysticEffect(), false));
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(
+ new DestroyAllAttachedToTargetEffect(StaticFilters.FILTER_PERMANENT_AURAS, "that creature")
+ ));
}
private TreefolkMystic(final TreefolkMystic card) {
@@ -42,36 +38,3 @@ public final class TreefolkMystic extends CardImpl {
return new TreefolkMystic(this);
}
}
-
-class TreefolkMysticEffect extends OneShotEffect {
-
- public TreefolkMysticEffect() {
- super(Outcome.DestroyPermanent);
- this.staticText = "destroy all Auras attached to that creature";
- }
-
- public TreefolkMysticEffect(final TreefolkMysticEffect effect) {
- super(effect);
- }
-
- @Override
- public TreefolkMysticEffect copy() {
- return new TreefolkMysticEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Permanent permanent = game.getPermanent(source.getFirstTarget());
- if (permanent != null) {
- LinkedList attachments = new LinkedList();
- attachments.addAll(permanent.getAttachments());
- for (UUID uuid : attachments) {
- Permanent aura = game.getPermanent(uuid);
- if (aura != null && aura.hasSubtype(SubType.AURA, game)) {
- aura.destroy(source, game, false);
- }
- }
- }
- return false;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/t/TurnToSlag.java b/Mage.Sets/src/mage/cards/t/TurnToSlag.java
index b20c61c2177..06775ae039a 100644
--- a/Mage.Sets/src/mage/cards/t/TurnToSlag.java
+++ b/Mage.Sets/src/mage/cards/t/TurnToSlag.java
@@ -1,31 +1,27 @@
-
-
package mage.cards.t;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-import mage.abilities.Ability;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.effects.common.DestroyAllAttachedToTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.Outcome;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
+import mage.filter.StaticFilters;
import mage.target.common.TargetCreaturePermanent;
+import java.util.UUID;
+
/**
*
- * @author Loki
+ * @author awjackson
*/
public final class TurnToSlag extends CardImpl {
public TurnToSlag (UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{R}{R}");
- this.getSpellAbility().addEffect(new TurnToSlagEffect());
+ // Turn To Slag deals 5 damage to target creature. Destroy all Equipment attached to that creature.
+ this.getSpellAbility().addEffect(new DamageTargetEffect(5));
+ this.getSpellAbility().addEffect(new DestroyAllAttachedToTargetEffect(StaticFilters.FILTER_PERMANENT_EQUIPMENT, "that creature"));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
}
@@ -38,41 +34,3 @@ public final class TurnToSlag extends CardImpl {
return new TurnToSlag(this);
}
}
-
-class TurnToSlagEffect extends OneShotEffect {
-
- public TurnToSlagEffect() {
- super(Outcome.DestroyPermanent);
- staticText = "{this} deals 5 damage to target creature. Destroy all Equipment attached to that creature";
- }
-
- public TurnToSlagEffect(final TurnToSlagEffect effect) {
- super(effect);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Permanent target = game.getPermanent(source.getFirstTarget());
- if (target != null) {
- List attachments = new ArrayList<>();
- for (UUID uuid : target.getAttachments()) {
- Permanent attached = game.getBattlefield().getPermanent(uuid);
- if (attached.hasSubtype(SubType.EQUIPMENT, game)) {
- attachments.add(attached);
- }
- }
- for (Permanent p : attachments) {
- p.destroy(source, game, false);
- }
- target.damage(5, source.getSourceId(), source, game, false, false);
- return true;
- }
- return false;
- }
-
- @Override
- public TurnToSlagEffect copy() {
- return new TurnToSlagEffect(this);
- }
-
-}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/v/VenomousDragonfly.java b/Mage.Sets/src/mage/cards/v/VenomousDragonfly.java
index c47fdae41a2..ce264ed04dc 100644
--- a/Mage.Sets/src/mage/cards/v/VenomousDragonfly.java
+++ b/Mage.Sets/src/mage/cards/v/VenomousDragonfly.java
@@ -1,9 +1,8 @@
-
package mage.cards.v;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
@@ -30,9 +29,9 @@ public final class VenomousDragonfly extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// Whenever Venomous Dragonfly blocks or becomes blocked by a creature, destroy that creature at end of combat.
- Effect effect = new CreateDelayedTriggeredAbilityEffect(new AtTheEndOfCombatDelayedTriggeredAbility(new DestroyTargetEffect()));
+ Effect effect = new CreateDelayedTriggeredAbilityEffect(new AtTheEndOfCombatDelayedTriggeredAbility(new DestroyTargetEffect()), true);
effect.setText("destroy that creature at end of combat");
- this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(effect, false));
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(effect));
}
private VenomousDragonfly(final VenomousDragonfly card) {
diff --git a/Mage.Sets/src/mage/cards/w/WitherscaleWurm.java b/Mage.Sets/src/mage/cards/w/WitherscaleWurm.java
index 05d46868d40..f882ca25290 100644
--- a/Mage.Sets/src/mage/cards/w/WitherscaleWurm.java
+++ b/Mage.Sets/src/mage/cards/w/WitherscaleWurm.java
@@ -3,8 +3,7 @@ package mage.cards.w;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.BlocksOrBecomesBlockedSourceTriggeredAbility;
+import mage.abilities.common.BlocksOrBlockedByCreatureSourceTriggeredAbility;
import mage.abilities.common.DealsDamageToOpponentTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.RemoveAllCountersSourceEffect;
@@ -34,8 +33,7 @@ public final class WitherscaleWurm extends CardImpl {
// Whenever Witherscale Wurm blocks or becomes blocked by a creature, that creature gains wither until end of turn.
Effect effect = new GainAbilityTargetEffect(WitherAbility.getInstance(), Duration.EndOfTurn);
effect.setText("that creature gains wither until end of turn");
- Ability ability = new BlocksOrBecomesBlockedSourceTriggeredAbility(effect, StaticFilters.FILTER_PERMANENT_CREATURE, false, null, true);
- this.addAbility(ability);
+ this.addAbility(new BlocksOrBlockedByCreatureSourceTriggeredAbility(effect));
// Whenever Witherscale Wurm deals damage to an opponent, remove all -1/-1 counters from it.
this.addAbility(new DealsDamageToOpponentTriggeredAbility(new RemoveAllCountersSourceEffect(CounterType.M1M1), false));
diff --git a/Mage/src/main/java/mage/abilities/common/BlocksOrBecomesBlockedSourceTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BlocksOrBecomesBlockedSourceTriggeredAbility.java
deleted file mode 100644
index 93fdfff9261..00000000000
--- a/Mage/src/main/java/mage/abilities/common/BlocksOrBecomesBlockedSourceTriggeredAbility.java
+++ /dev/null
@@ -1,91 +0,0 @@
-
-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 North, Loki
- */
-public class BlocksOrBecomesBlockedSourceTriggeredAbility extends TriggeredAbilityImpl {
-
- protected FilterPermanent filter;
- protected String rule;
- protected boolean setTargetPointer;
-
- public BlocksOrBecomesBlockedSourceTriggeredAbility(Effect effect, boolean optional) {
- this(effect, optional, true);
- }
-
- public BlocksOrBecomesBlockedSourceTriggeredAbility(Effect effect, boolean optional, boolean setTargetPointer) {
- this(effect, StaticFilters.FILTER_PERMANENT_CREATURE, optional, null, setTargetPointer);
- }
-
- public BlocksOrBecomesBlockedSourceTriggeredAbility(Effect effect, FilterPermanent filter, boolean optional) {
- this(effect, filter, optional, null, true);
- }
-
- public BlocksOrBecomesBlockedSourceTriggeredAbility(Effect effect, FilterPermanent filter, boolean optional, String rule) {
- this(effect, filter, optional, rule, true);
- }
-
- public BlocksOrBecomesBlockedSourceTriggeredAbility(Effect effect, FilterPermanent filter, boolean optional, String rule, boolean setTargetPointer) {
- super(Zone.BATTLEFIELD, effect, optional);
- this.filter = filter;
- this.rule = rule;
- this.setTargetPointer = setTargetPointer;
- setTriggerPhrase("Whenever {this} blocks or becomes blocked" + (setTargetPointer ? " by a " + filter.getMessage() : "") + ", ");
- }
-
- public BlocksOrBecomesBlockedSourceTriggeredAbility(final BlocksOrBecomesBlockedSourceTriggeredAbility ability) {
- super(ability);
- this.filter = ability.filter;
- this.rule = ability.rule;
- this.setTargetPointer = ability.setTargetPointer;
- }
-
- @Override
- public boolean checkEventType(GameEvent event, Game game) {
- return event.getType() == GameEvent.EventType.BLOCKER_DECLARED;
- }
-
- @Override
- public boolean checkTrigger(GameEvent event, Game game) {
- if (event.getSourceId().equals(this.getSourceId())) {
- Permanent blocked = game.getPermanent(event.getTargetId());
- if (filter.match(blocked, game)) {
- if (setTargetPointer) {
- this.getEffects().setTargetPointer(new FixedTarget(blocked, game));
- }
- return true;
- }
- }
- if (event.getTargetId().equals(this.getSourceId())) {
- Permanent blocker = game.getPermanent(event.getSourceId());
- if (filter.match(blocker, game)) {
- if (setTargetPointer) {
- this.getEffects().setTargetPointer(new FixedTarget(blocker, game));
- }
- return true;
- }
- }
- return false;
- }
-
- @Override
- public String getRule() {
- return rule != null ? rule : super.getRule();
- }
-
- @Override
- public BlocksOrBecomesBlockedSourceTriggeredAbility copy() {
- return new BlocksOrBecomesBlockedSourceTriggeredAbility(this);
- }
-}
diff --git a/Mage/src/main/java/mage/abilities/common/BlocksOrBlockedAttachedTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BlocksOrBlockedAttachedTriggeredAbility.java
new file mode 100644
index 00000000000..703125af55a
--- /dev/null
+++ b/Mage/src/main/java/mage/abilities/common/BlocksOrBlockedAttachedTriggeredAbility.java
@@ -0,0 +1,48 @@
+package mage.abilities.common;
+
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.effects.Effect;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.permanent.Permanent;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ * @author awjackson
+ */
+public class BlocksOrBlockedAttachedTriggeredAbility extends TriggeredAbilityImpl {
+
+ public BlocksOrBlockedAttachedTriggeredAbility(Effect effect) {
+ this(effect, false);
+ }
+ public BlocksOrBlockedAttachedTriggeredAbility(Effect effect, boolean optional) {
+ super(Zone.BATTLEFIELD, effect, optional);
+ setTriggerPhrase("Whenever enchanted creature blocks or becomes blocked, ");
+ }
+
+ public BlocksOrBlockedAttachedTriggeredAbility(final BlocksOrBlockedAttachedTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.CREATURE_BLOCKS
+ || event.getType() == GameEvent.EventType.CREATURE_BLOCKED;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ Permanent creature = game.getPermanent(event.getTargetId());
+ if (creature == null || !creature.getAttachments().contains(getSourceId())) {
+ return false;
+ }
+ getEffects().setTargetPointer(new FixedTarget(creature, game));
+ return true;
+ }
+
+ @Override
+ public BlocksOrBlockedAttachedTriggeredAbility copy() {
+ return new BlocksOrBlockedAttachedTriggeredAbility(this);
+ }
+}
diff --git a/Mage/src/main/java/mage/abilities/common/BlocksOrBlockedByCreatureSourceTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BlocksOrBlockedByCreatureSourceTriggeredAbility.java
new file mode 100644
index 00000000000..7b87ff091fe
--- /dev/null
+++ b/Mage/src/main/java/mage/abilities/common/BlocksOrBlockedByCreatureSourceTriggeredAbility.java
@@ -0,0 +1,70 @@
+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;
+import mage.util.CardUtil;
+
+/**
+ * @author awjackson
+ */
+public class BlocksOrBlockedByCreatureSourceTriggeredAbility extends TriggeredAbilityImpl {
+
+ private final FilterPermanent filter;
+
+ public BlocksOrBlockedByCreatureSourceTriggeredAbility(Effect effect) {
+ this(effect, false);
+ }
+
+ public BlocksOrBlockedByCreatureSourceTriggeredAbility(Effect effect, FilterPermanent filter) {
+ this(effect, filter, false);
+ }
+
+ public BlocksOrBlockedByCreatureSourceTriggeredAbility(Effect effect, boolean optional) {
+ this(effect, StaticFilters.FILTER_PERMANENT_CREATURE, optional);
+ }
+
+ public BlocksOrBlockedByCreatureSourceTriggeredAbility(Effect effect, FilterPermanent filter, boolean optional) {
+ super(Zone.BATTLEFIELD, effect, optional);
+ this.filter = filter;
+ setTriggerPhrase("Whenever {this} blocks or becomes blocked by " + CardUtil.addArticle(filter.getMessage()) + ", ");
+ }
+
+ public BlocksOrBlockedByCreatureSourceTriggeredAbility(final BlocksOrBlockedByCreatureSourceTriggeredAbility ability) {
+ super(ability);
+ this.filter = ability.filter;
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.BLOCKER_DECLARED;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ Permanent otherCreature = null;
+ if (this.getSourceId().equals(event.getSourceId())) {
+ otherCreature = game.getPermanent(event.getTargetId());
+ } else if (this.getSourceId().equals(event.getTargetId())) {
+ otherCreature = game.getPermanent(event.getSourceId());
+ } else {
+ return false;
+ }
+ if (!filter.match(otherCreature, getControllerId(), this, game)) {
+ return false;
+ }
+ getEffects().setTargetPointer(new FixedTarget(otherCreature, game));
+ return true;
+ }
+
+ @Override
+ public BlocksOrBlockedByCreatureSourceTriggeredAbility copy() {
+ return new BlocksOrBlockedByCreatureSourceTriggeredAbility(this);
+ }
+}
diff --git a/Mage/src/main/java/mage/abilities/common/BlocksOrBlockedSourceTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BlocksOrBlockedSourceTriggeredAbility.java
new file mode 100644
index 00000000000..ea3f6da0ec0
--- /dev/null
+++ b/Mage/src/main/java/mage/abilities/common/BlocksOrBlockedSourceTriggeredAbility.java
@@ -0,0 +1,41 @@
+package mage.abilities.common;
+
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.effects.Effect;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+
+/**
+ * @author awjackson
+ */
+public class BlocksOrBlockedSourceTriggeredAbility extends TriggeredAbilityImpl {
+
+ public BlocksOrBlockedSourceTriggeredAbility(Effect effect) {
+ this(effect, false);
+ }
+ public BlocksOrBlockedSourceTriggeredAbility(Effect effect, boolean optional) {
+ super(Zone.BATTLEFIELD, effect, optional);
+ setTriggerPhrase("Whenever {this} blocks or becomes blocked, ");
+ }
+
+ public BlocksOrBlockedSourceTriggeredAbility(final BlocksOrBlockedSourceTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.CREATURE_BLOCKS
+ || event.getType() == GameEvent.EventType.CREATURE_BLOCKED;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ return event.getTargetId().equals(getSourceId());
+ }
+
+ @Override
+ public BlocksOrBlockedSourceTriggeredAbility copy() {
+ return new BlocksOrBlockedSourceTriggeredAbility(this);
+ }
+}
diff --git a/Mage/src/main/java/mage/abilities/effects/common/DestroyAllAttachedEquipmentEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DestroyAllAttachedEquipmentEffect.java
deleted file mode 100644
index e307f592df5..00000000000
--- a/Mage/src/main/java/mage/abilities/effects/common/DestroyAllAttachedEquipmentEffect.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package mage.abilities.effects.common;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-import mage.abilities.Ability;
-import mage.abilities.effects.OneShotEffect;
-import mage.constants.Outcome;
-import mage.constants.SubType;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
-import mage.players.Player;
-
-/**
- *
- * @author Quercitron
- */
-public class DestroyAllAttachedEquipmentEffect extends OneShotEffect {
-
- public DestroyAllAttachedEquipmentEffect() {
- super(Outcome.Benefit);
- this.staticText = "Destroy all Equipment attached to that creature";
- }
-
- public DestroyAllAttachedEquipmentEffect(final DestroyAllAttachedEquipmentEffect effect) {
- super(effect);
- }
-
- @Override
- public DestroyAllAttachedEquipmentEffect copy() {
- return new DestroyAllAttachedEquipmentEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player controller = game.getPlayer(source.getControllerId());
- if (controller != null) {
- Permanent targetPermanent = game.getPermanent(getTargetPointer().getFirst(game, source));
- if (targetPermanent != null) {
- List attachments = new ArrayList<>(targetPermanent.getAttachments());
- for (UUID attachmentId : attachments) {
- Permanent attachment = game.getPermanent(attachmentId);
- if (attachment != null && attachment.hasSubtype(SubType.EQUIPMENT, game)) {
- attachment.destroy(source, game, false);
- }
- }
- }
- return true;
- }
- return false;
- }
-
-}
diff --git a/Mage/src/main/java/mage/abilities/effects/common/DestroyAllAttachedToTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DestroyAllAttachedToTargetEffect.java
new file mode 100644
index 00000000000..83976cc5ab8
--- /dev/null
+++ b/Mage/src/main/java/mage/abilities/effects/common/DestroyAllAttachedToTargetEffect.java
@@ -0,0 +1,52 @@
+package mage.abilities.effects.common;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.constants.Outcome;
+import mage.constants.SubType;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.filter.FilterPermanent;
+
+/**
+ *
+ * @author awjackson
+ */
+public class DestroyAllAttachedToTargetEffect extends OneShotEffect {
+
+ private final FilterPermanent filter;
+
+ public DestroyAllAttachedToTargetEffect(FilterPermanent filter, String description) {
+ super(Outcome.DestroyPermanent);
+ this.filter = filter;
+ this.staticText = "destroy all " + filter.getMessage() + " attached to " + description;
+ }
+
+ public DestroyAllAttachedToTargetEffect(final DestroyAllAttachedToTargetEffect effect) {
+ super(effect);
+ this.filter = effect.filter;
+ }
+
+ @Override
+ public DestroyAllAttachedToTargetEffect copy() {
+ return new DestroyAllAttachedToTargetEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent targetPermanent = getTargetPointer().getFirstTargetPermanentOrLKI(game, source);
+ if (targetPermanent != null) {
+ List attachments = new ArrayList<>(targetPermanent.getAttachments());
+ for (UUID attachmentId : attachments) {
+ Permanent attachment = game.getPermanent(attachmentId);
+ if (filter.match(attachment, source.getControllerId(), source, game)) {
+ attachment.destroy(source, game, false);
+ }
+ }
+ }
+ return true;
+ }
+}
diff --git a/Mage/src/main/java/mage/abilities/keyword/BushidoAbility.java b/Mage/src/main/java/mage/abilities/keyword/BushidoAbility.java
index fe61fea3a22..044b1b778fb 100644
--- a/Mage/src/main/java/mage/abilities/keyword/BushidoAbility.java
+++ b/Mage/src/main/java/mage/abilities/keyword/BushidoAbility.java
@@ -1,8 +1,7 @@
-
package mage.abilities.keyword;
import mage.abilities.Ability;
-import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.BlocksOrBlockedSourceTriggeredAbility;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.Effect;
@@ -10,26 +9,27 @@ import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.constants.Duration;
import mage.constants.Zone;
import mage.game.Game;
-import mage.game.combat.CombatGroup;
-import mage.game.events.GameEvent;
-import mage.game.permanent.Permanent;
-public class BushidoAbility extends TriggeredAbilityImpl {
+/**
+ * @author awjackson
+ */
+public class BushidoAbility extends BlocksOrBlockedSourceTriggeredAbility {
- private DynamicValue value;
- private String rulesText = null;
+ private final DynamicValue value;
+ private final String rule;
public BushidoAbility(int value) {
this(StaticValue.get(value));
- rulesText = "Bushido " + value + getReminder(Integer.toString(value));
}
public BushidoAbility(DynamicValue value) {
- super(Zone.BATTLEFIELD, new BoostSourceEffect(value, value, Duration.EndOfTurn, true), false);
- if (!(value instanceof StaticValue)) {
- rulesText = "{this} has bushido X, where X is " + value.getMessage() + getReminder(value.toString());
- }
+ super(new BoostSourceEffect(value, value, Duration.EndOfTurn, true));
this.value = value;
+ rule = (
+ value instanceof StaticValue ?
+ "Bushido " + value.toString() :
+ "{this} has bushido X, where X is " + value.getMessage()
+ ) + getReminder(value.toString());
}
static String getReminder(String xValue) {
@@ -39,28 +39,7 @@ public class BushidoAbility extends TriggeredAbilityImpl {
public BushidoAbility(final BushidoAbility ability) {
super(ability);
this.value = ability.value;
- this.rulesText = ability.rulesText;
- }
-
- @Override
- public boolean checkEventType(GameEvent event, Game game) {
- return event.getType() == GameEvent.EventType.DECLARE_BLOCKERS_STEP;
- }
-
- @Override
- public boolean checkTrigger(GameEvent event, Game game) {
- Permanent source = game.getPermanent(getSourceId());
- if (source != null) {
- if (source.isBlocked(game)) {
- return true;
- }
- for (CombatGroup group : game.getCombat().getGroups()) {
- if (group.getBlockers().contains(getSourceId())) {
- return true;
- }
- }
- }
- return false;
+ this.rule = ability.rule;
}
@Override
@@ -74,6 +53,6 @@ public class BushidoAbility extends TriggeredAbilityImpl {
@Override
public String getRule() {
- return rulesText;
+ return rule;
}
}
diff --git a/Mage/src/main/java/mage/filter/StaticFilters.java b/Mage/src/main/java/mage/filter/StaticFilters.java
index 15e44c69967..0e1c43cb106 100644
--- a/Mage/src/main/java/mage/filter/StaticFilters.java
+++ b/Mage/src/main/java/mage/filter/StaticFilters.java
@@ -952,12 +952,11 @@ public final class StaticFilters {
FILTER_BLOCKING_CREATURES.setLockedFilter(true);
}
- public static final FilterPermanent FILTER_PERMANENT_AURA = new FilterPermanent();
+ public static final FilterPermanent FILTER_PERMANENT_AURAS = new FilterEnchantmentPermanent("Auras");
static {
- FILTER_PERMANENT_AURA.add(CardType.ENCHANTMENT.getPredicate());
- FILTER_PERMANENT_AURA.add(SubType.AURA.getPredicate());
- FILTER_PERMANENT_AURA.setLockedFilter(true);
+ FILTER_PERMANENT_AURAS.add(SubType.AURA.getPredicate());
+ FILTER_PERMANENT_AURAS.setLockedFilter(true);
}
public static final FilterPermanent FILTER_PERMANENT_EQUIPMENT = new FilterEquipmentPermanent();