diff --git a/Mage.Sets/src/mage/cards/d/DisruptDecorum.java b/Mage.Sets/src/mage/cards/d/DisruptDecorum.java
index eb0db8267da..40aa70b4565 100644
--- a/Mage.Sets/src/mage/cards/d/DisruptDecorum.java
+++ b/Mage.Sets/src/mage/cards/d/DisruptDecorum.java
@@ -6,6 +6,7 @@ import mage.abilities.effects.common.combat.GoadAllEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.filter.StaticFilters;
/**
*
@@ -17,7 +18,7 @@ public final class DisruptDecorum extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{R}{R}");
// Goad all creatures you don't control.
- this.getSpellAbility().addEffect(new GoadAllEffect());
+ this.getSpellAbility().addEffect(new GoadAllEffect(StaticFilters.FILTER_CREATURES_YOU_DONT_CONTROL));
}
private DisruptDecorum(final DisruptDecorum card) {
diff --git a/Mage.Sets/src/mage/cards/g/GeodeRager.java b/Mage.Sets/src/mage/cards/g/GeodeRager.java
index 91435e17034..786bf64221a 100644
--- a/Mage.Sets/src/mage/cards/g/GeodeRager.java
+++ b/Mage.Sets/src/mage/cards/g/GeodeRager.java
@@ -3,19 +3,16 @@ package mage.cards.g;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.LandfallAbility;
-import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.combat.GoadTargetEffect;
+import mage.abilities.effects.common.combat.GoadAllEffect;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.Outcome;
import mage.constants.SubType;
-import mage.filter.StaticFilters;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
+import mage.constants.TargetController;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterCreaturePermanent;
import mage.target.TargetPlayer;
-import mage.target.targetpointer.FixedTarget;
import java.util.UUID;
@@ -24,6 +21,12 @@ import java.util.UUID;
*/
public final class GeodeRager extends CardImpl {
+ private static final FilterPermanent filter = new FilterCreaturePermanent();
+
+ static {
+ filter.add(TargetController.SOURCE_TARGETS.getControllerPredicate());
+ }
+
public GeodeRager(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{R}{R}");
@@ -35,7 +38,7 @@ public final class GeodeRager extends CardImpl {
this.addAbility(FirstStrikeAbility.getInstance());
// Landfall — Whenever a land enters the battlefield under your control, goad each creature target player controls.
- Ability ability = new LandfallAbility(new GeodeRagerEffect());
+ Ability ability = new LandfallAbility(new GoadAllEffect(filter).setText("goad each creature target player controls"));
ability.addTarget(new TargetPlayer());
this.addAbility(ability);
}
@@ -49,33 +52,3 @@ public final class GeodeRager extends CardImpl {
return new GeodeRager(this);
}
}
-
-class GeodeRagerEffect extends OneShotEffect {
-
- GeodeRagerEffect() {
- super(Outcome.Benefit);
- staticText = "goad each creature target player controls";
- }
-
- private GeodeRagerEffect(final GeodeRagerEffect effect) {
- super(effect);
- }
-
- @Override
- public GeodeRagerEffect copy() {
- return new GeodeRagerEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- for (Permanent permanent : game.getBattlefield().getActivePermanents(
- StaticFilters.FILTER_CONTROLLED_CREATURE, source.getFirstTarget(), source, game
- )) {
- if (permanent == null) {
- continue;
- }
- game.addEffect(new GoadTargetEffect().setTargetPointer(new FixedTarget(permanent, game)), source);
- }
- return true;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/k/KomainuBattleArmor.java b/Mage.Sets/src/mage/cards/k/KomainuBattleArmor.java
index d64439ad352..fea9d00e3a4 100644
--- a/Mage.Sets/src/mage/cards/k/KomainuBattleArmor.java
+++ b/Mage.Sets/src/mage/cards/k/KomainuBattleArmor.java
@@ -19,6 +19,7 @@ import mage.game.events.DamagedEvent;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.target.targetpointer.FixedTarget;
+import mage.target.targetpointer.FixedTargets;
import java.util.UUID;
@@ -126,12 +127,11 @@ class KomainuBattleArmorEffect extends OneShotEffect {
if (playerId == null) {
return false;
}
- for (Permanent permanent : game.getBattlefield().getActivePermanents(
- StaticFilters.FILTER_CONTROLLED_CREATURE,
- playerId, source, game
- )) {
- game.addEffect(new GoadTargetEffect().setTargetPointer(new FixedTarget(permanent, game)), source);
- }
+ game.addEffect(new GoadTargetEffect().setTargetPointer(new FixedTargets(
+ game.getBattlefield().getActivePermanents(
+ StaticFilters.FILTER_CONTROLLED_CREATURE, playerId, source, game
+ ), game
+ )), source);
return true;
}
}
diff --git a/Mage.Sets/src/mage/cards/m/MaestrosConfluence.java b/Mage.Sets/src/mage/cards/m/MaestrosConfluence.java
index cd3ab2d3321..0b646f38971 100644
--- a/Mage.Sets/src/mage/cards/m/MaestrosConfluence.java
+++ b/Mage.Sets/src/mage/cards/m/MaestrosConfluence.java
@@ -1,25 +1,21 @@
package mage.cards.m;
-import mage.abilities.Ability;
import mage.abilities.Mode;
-import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
-import mage.abilities.effects.common.combat.GoadTargetEffect;
+import mage.abilities.effects.common.combat.GoadAllEffect;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.Outcome;
+import mage.constants.TargetController;
import mage.filter.FilterCard;
-import mage.filter.StaticFilters;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterCreaturePermanent;
import mage.filter.common.FilterInstantOrSorceryCard;
import mage.filter.predicate.mageobject.MonocoloredPredicate;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
import mage.target.TargetPlayer;
import mage.target.common.TargetCardInYourGraveyard;
import mage.target.common.TargetCreaturePermanent;
-import mage.target.targetpointer.FixedTarget;
import java.util.UUID;
@@ -30,9 +26,11 @@ public final class MaestrosConfluence extends CardImpl {
private static final FilterCard filter
= new FilterInstantOrSorceryCard("monocolored instant or sorcery card from your graveyard");
+ private static final FilterPermanent filter2 = new FilterCreaturePermanent();
static {
filter.add(MonocoloredPredicate.instance);
+ filter2.add(TargetController.SOURCE_TARGETS.getControllerPredicate());
}
public MaestrosConfluence(UUID ownerId, CardSetInfo setInfo) {
@@ -53,7 +51,7 @@ public final class MaestrosConfluence extends CardImpl {
).addTarget(new TargetCreaturePermanent()));
// • Goad each creature target player controls.
- this.getSpellAbility().addMode(new Mode(new MaestrosConfluenceEffect()).addTarget(new TargetPlayer()));
+ this.getSpellAbility().addMode(new Mode(new GoadAllEffect(filter2).setText("goad each creature target player controls")).addTarget(new TargetPlayer()));
}
private MaestrosConfluence(final MaestrosConfluence card) {
@@ -65,30 +63,3 @@ public final class MaestrosConfluence extends CardImpl {
return new MaestrosConfluence(this);
}
}
-
-class MaestrosConfluenceEffect extends OneShotEffect {
-
- MaestrosConfluenceEffect() {
- super(Outcome.Benefit);
- staticText = "goad each creature target player controls";
- }
-
- private MaestrosConfluenceEffect(final MaestrosConfluenceEffect effect) {
- super(effect);
- }
-
- @Override
- public MaestrosConfluenceEffect copy() {
- return new MaestrosConfluenceEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- for (Permanent permanent : game.getBattlefield().getActivePermanents(
- StaticFilters.FILTER_CONTROLLED_CREATURE, source.getFirstTarget(), source, game
- )) {
- game.addEffect(new GoadTargetEffect().setTargetPointer(new FixedTarget(permanent, game)), source);
- }
- return true;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/m/MarisiBreakerOfTheCoil.java b/Mage.Sets/src/mage/cards/m/MarisiBreakerOfTheCoil.java
index f11c5eda0b5..8b5c14d8839 100644
--- a/Mage.Sets/src/mage/cards/m/MarisiBreakerOfTheCoil.java
+++ b/Mage.Sets/src/mage/cards/m/MarisiBreakerOfTheCoil.java
@@ -13,8 +13,7 @@ import mage.constants.*;
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.target.targetpointer.FixedTargets;
import java.util.UUID;
@@ -104,12 +103,15 @@ class MarisiBreakerOfTheCoilEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- for (Permanent permanent : game.getBattlefield().getAllActivePermanents(
- StaticFilters.FILTER_PERMANENT_CREATURE,
- targetPointer.getFirst(game, source), game
- )) {
- game.addEffect(new GoadTargetEffect().setTargetPointer(new FixedTarget(permanent, game)), source);
+ UUID playerId = getTargetPointer().getFirst(game, source);
+ if (playerId == null) {
+ return false;
}
+ game.addEffect(new GoadTargetEffect().setTargetPointer(new FixedTargets(
+ game.getBattlefield().getActivePermanents(
+ StaticFilters.FILTER_CONTROLLED_CREATURE, playerId, source, game
+ ), game
+ )), source);
return true;
}
}
diff --git a/Mage/src/main/java/mage/abilities/effects/common/combat/GoadAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/combat/GoadAllEffect.java
index 33e6ad778a3..44f6c75a8e0 100644
--- a/Mage/src/main/java/mage/abilities/effects/common/combat/GoadAllEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/common/combat/GoadAllEffect.java
@@ -1,26 +1,36 @@
package mage.abilities.effects.common.combat;
+import mage.MageObjectReference;
import mage.abilities.Ability;
-import mage.abilities.effects.Effect;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.Mode;
+import mage.abilities.effects.ContinuousEffectImpl;
+import mage.constants.Duration;
+import mage.constants.Layer;
import mage.constants.Outcome;
-import mage.filter.StaticFilters;
+import mage.constants.SubLayer;
+import mage.filter.FilterPermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
-import mage.target.targetpointer.FixedTarget;
/**
* @author TheElk801
*/
-public class GoadAllEffect extends OneShotEffect {
+public class GoadAllEffect extends ContinuousEffectImpl {
- public GoadAllEffect() {
- super(Outcome.Benefit);
- staticText = "Goad all creatures you don't control. (Until your next turn, those creatures attack each combat if able and attack a player other than you if able.)";
+ private final FilterPermanent filter;
+
+ public GoadAllEffect(FilterPermanent filter) {
+ this(Duration.UntilYourNextTurn, filter);
}
- public GoadAllEffect(final GoadAllEffect effect) {
+ public GoadAllEffect(Duration duration, FilterPermanent filter) {
+ super(duration, Layer.RulesEffects, SubLayer.NA, Outcome.Detriment);
+ this.filter = filter;
+ }
+
+ private GoadAllEffect(final GoadAllEffect effect) {
super(effect);
+ this.filter = effect.filter;
}
@Override
@@ -28,15 +38,43 @@ public class GoadAllEffect extends OneShotEffect {
return new GoadAllEffect(this);
}
+ @Override
+ public void init(Ability source, Game game) {
+ super.init(source, game);
+ if (this.affectedObjectsSet) {
+ game.getBattlefield()
+ .getActivePermanents(
+ filter, source.getControllerId(), source, game
+ ).stream()
+ .map(permanent -> new MageObjectReference(permanent, game))
+ .forEach(this.affectedObjectList::add);
+ }
+ }
+
@Override
public boolean apply(Game game, Ability source) {
- for (Permanent creature : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, source.getControllerId(), game)) {
- if (!creature.isControlledBy(source.getControllerId())) {
- Effect effect = new GoadTargetEffect();
- effect.setTargetPointer(new FixedTarget(creature, game));
- effect.apply(game, source);
+ if (this.affectedObjectsSet) {
+ this.affectedObjectList.removeIf(mor -> !mor.zoneCounterIsCurrent(game));
+ if (affectedObjectList.isEmpty()) {
+ discard();
+ return false;
}
+ for (MageObjectReference mor : this.affectedObjectList) {
+ mor.getPermanent(game).addGoadingPlayer(source.getControllerId());
+ }
+ return true;
+ }
+ for (Permanent creature : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source, game)) {
+ creature.addGoadingPlayer(source.getControllerId());
}
return true;
}
+
+ @Override
+ public String getText(Mode mode) {
+ if (staticText != null && !staticText.isEmpty()) {
+ return staticText;
+ }
+ return "Goad all " + filter.getMessage() + ". (Until your next turn, those creatures attack each combat if able and attack a player other than you if able.)";
+ }
}
diff --git a/Mage/src/main/java/mage/abilities/effects/common/combat/GoadTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/combat/GoadTargetEffect.java
index a61b27ca12e..5b7042b7a85 100644
--- a/Mage/src/main/java/mage/abilities/effects/common/combat/GoadTargetEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/common/combat/GoadTargetEffect.java
@@ -11,6 +11,8 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
+import java.util.UUID;
+
/**
* @author TheElk801
*/
@@ -39,20 +41,24 @@ public class GoadTargetEffect extends ContinuousEffectImpl {
@Override
public void init(Ability source, Game game) {
super.init(source, game);
- Permanent targetCreature = game.getPermanent(getTargetPointer().getFirst(game, source));
Player controller = game.getPlayer(source.getControllerId());
- if (targetCreature != null && controller != null) {
- game.informPlayers(controller.getLogName() + " is goading " + targetCreature.getLogName());
+ if (controller == null) {
+ return;
+ }
+ for (UUID targetId : getTargetPointer().getTargets(game, source)) {
+ Permanent targetCreature = game.getPermanent(targetId);
+ if (targetCreature != null) {
+ game.informPlayers(controller.getLogName() + " is goading " + targetCreature.getLogName());
+ }
}
}
@Override
public boolean apply(Game game, Ability source) {
- Permanent targetCreature = game.getPermanent(getTargetPointer().getFirst(game, source));
- if (targetCreature == null) {
- return false;
+ for (UUID targetId : getTargetPointer().getTargets(game, source)) {
+ Permanent targetCreature = game.getPermanent(targetId);
+ targetCreature.addGoadingPlayer(source.getControllerId());
}
- targetCreature.addGoadingPlayer(source.getControllerId());
return true;
}