GainAbilityControlledEffect now requires a filter to prevent mistakes in implementation

This commit is contained in:
theelk801 2025-05-14 20:02:36 -04:00
parent ac0f23410a
commit af527810ac
19 changed files with 126 additions and 109 deletions

View file

@ -1,7 +1,6 @@
package mage.cards.b;
import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.MyTurnCondition;
@ -14,6 +13,7 @@ import mage.abilities.keyword.ClassLevelAbility;
import mage.abilities.keyword.ClassReminderAbility;
import mage.abilities.keyword.DoubleStrikeAbility;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
@ -74,7 +74,7 @@ public final class BlacksmithsTalent extends CardImpl {
DoubleStrikeAbility.getInstance(), Duration.WhileOnBattlefield, filter2
), MyTurnCondition.instance, "during your turn, equipped creatures you control have double strike"));
ability.addEffect(new ConditionalContinuousEffect(new GainAbilityControlledEffect(
HasteAbility.getInstance(), Duration.WhileOnBattlefield
HasteAbility.getInstance(), Duration.WhileOnBattlefield, filter2
), MyTurnCondition.instance, "and haste"));
this.addAbility(new SimpleStaticAbility(new GainClassAbilitySourceEffect(ability, 3)));
}

View file

@ -2,7 +2,6 @@ package mage.cards.b;
import mage.abilities.Mode;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.DoubleStrikeAbility;
@ -11,6 +10,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.filter.StaticFilters;
import mage.target.common.TargetCreaturePermanent;
import mage.target.common.TargetPlayerOrPlaneswalker;
@ -27,10 +27,12 @@ public final class BorosCharm extends CardImpl {
//Choose one - Boros Charm deals 4 damage to target player
this.getSpellAbility().addEffect(new DamageTargetEffect(4));
this.getSpellAbility().addTarget(new TargetPlayerOrPlaneswalker());
//or permanents you control are indestructible this turn
this.getSpellAbility().addMode(new Mode(new GainAbilityControlledEffect(
IndestructibleAbility.getInstance(), Duration.EndOfTurn
IndestructibleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENTS
)));
//or target creature gains double strike until end of turn.
Mode mode2 = new Mode(new GainAbilityTargetEffect(DoubleStrikeAbility.getInstance(), Duration.EndOfTurn));
mode2.addTarget(new TargetCreaturePermanent());

View file

@ -16,6 +16,9 @@ import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.CounterAnyPredicate;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
@ -25,6 +28,12 @@ import java.util.UUID;
*/
public final class BulwarkOx extends CardImpl {
private static final FilterPermanent filter = new FilterCreaturePermanent();
static {
filter.add(CounterAnyPredicate.instance);
}
public BulwarkOx(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");
@ -40,10 +49,10 @@ public final class BulwarkOx extends CardImpl {
// Sacrifice this creature: Creatures you control with counters on them gain hexproof and indestructible until end of turn.
ability = new SimpleActivatedAbility(new GainAbilityControlledEffect(
HexproofAbility.getInstance(), Duration.EndOfTurn
HexproofAbility.getInstance(), Duration.EndOfTurn, filter
).setText("creatures you control with counters on them gain hexproof"), new SacrificeSourceCost());
ability.addEffect(new GainAbilityControlledEffect(
IndestructibleAbility.getInstance(), Duration.EndOfTurn
IndestructibleAbility.getInstance(), Duration.EndOfTurn, filter
).setText("and indestructible until end of turn"));
this.addAbility(ability);

View file

@ -14,6 +14,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import java.util.UUID;
@ -35,7 +36,7 @@ public final class DawngladeRegent extends CardImpl {
// As long as you're the monarch, permanents you control have hexproof.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new GainAbilityControlledEffect(
HexproofAbility.getInstance(), Duration.WhileOnBattlefield
HexproofAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENTS
), MonarchIsSourceControllerCondition.instance,
"as long as you're the monarch, permanents you control have hexproof"
)));

View file

@ -13,6 +13,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.GiftType;
import mage.filter.StaticFilters;
import java.util.UUID;
@ -32,11 +33,12 @@ public final class DawnsTruce extends CardImpl {
HexproofAbility.getInstance(), Duration.EndOfTurn
).setText("you"));
this.getSpellAbility().addEffect(new GainAbilityControlledEffect(
HexproofAbility.getInstance(), Duration.EndOfTurn
HexproofAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENTS
).concatBy("and"));
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
new AddContinuousEffectToGame(new GainAbilityControlledEffect(
IndestructibleAbility.getInstance(), Duration.EndOfTurn
IndestructibleAbility.getInstance(), Duration.EndOfTurn,
StaticFilters.FILTER_PERMANENTS
)), GiftWasPromisedCondition.TRUE, "if the gift was promised, " +
"permanents you control also gain indestructible until end of turn"
));

View file

@ -1,8 +1,6 @@
package mage.cards.d;
import java.util.UUID;
import mage.abilities.TriggeredAbility;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
@ -17,8 +15,9 @@ import mage.constants.Duration;
import mage.constants.SpellAbilityType;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class DrivenDespair extends SplitCard {
@ -27,26 +26,27 @@ public final class DrivenDespair extends SplitCard {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, new CardType[]{CardType.SORCERY}, "{1}{G}", "{1}{B}", SpellAbilityType.SPLIT_AFTERMATH);
// Until end of turn, creatures you control gain trample and "Whenever this creature deals combat damage to a player, draw a card."
getLeftHalfCard().getSpellAbility().addEffect(new GainAbilityControlledEffect(
TrampleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES)
.setText("Until end of turn, creatures you control gain trample"));
TriggeredAbility ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DrawCardSourceControllerEffect(1), false);
getLeftHalfCard().getSpellAbility().addEffect(new GainAbilityControlledEffect(ability, Duration.EndOfTurn)
.setText("\"Whenever this creature deals combat damage to a player, draw a card.\"")
.concatBy("and"));
this.getLeftHalfCard().getSpellAbility().addEffect(new GainAbilityControlledEffect(
TrampleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES
).setText("Until end of turn, creatures you control gain trample"));
this.getLeftHalfCard().getSpellAbility().addEffect(new GainAbilityControlledEffect(
new DealsCombatDamageToAPlayerTriggeredAbility(new DrawCardSourceControllerEffect(1), false),
Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES
).setText("\"Whenever this creature deals combat damage to a player, draw a card.\"").concatBy("and"));
// Despair {1}{B}
// Sorcery
// Aftermath
getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
this.getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
// Until end of turn, creatures you control gain menace and "Whenever this creature deals combat damage to a player, that player discards a card."
getRightHalfCard().getSpellAbility().addEffect(new GainAbilityControlledEffect(
new MenaceAbility(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES)
.setText("Until end of turn, creatures you control gain menace"));
ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DiscardTargetEffect(1), false, true);
getRightHalfCard().getSpellAbility().addEffect(new GainAbilityControlledEffect(ability, Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURES)
.setText("\"Whenever this creature deals combat damage to a player, that player discards a card.\"")
.concatBy("and"));
this.getRightHalfCard().getSpellAbility().addEffect(new GainAbilityControlledEffect(
new MenaceAbility(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES
).setText("Until end of turn, creatures you control gain menace"));
this.getRightHalfCard().getSpellAbility().addEffect(new GainAbilityControlledEffect(
new DealsCombatDamageToAPlayerTriggeredAbility(
new DiscardTargetEffect(1), false, true
), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES
).setText("\"Whenever this creature deals combat damage to a player, that player discards a card.\"").concatBy("and"));
}

View file

@ -1,7 +1,6 @@
package mage.cards.f;
import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.condition.common.FatefulHourCondition;
@ -17,13 +16,15 @@ import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.filter.FilterCard;
import mage.filter.StaticFilters;
import mage.filter.predicate.mageobject.ColorPredicate;
import mage.game.Game;
import mage.players.Player;
import mage.target.common.TargetControlledPermanent;
import java.util.UUID;
/**
*
* @author BetaSteward
*/
public final class FaithsShield extends CardImpl {
@ -63,30 +64,26 @@ class FaithsShieldEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
MageObject mageObject = game.getObject(source);
if (controller != null && mageObject != null) {
if (FatefulHourCondition.instance.apply(game, source)) {
ChoiceColor choice = new ChoiceColor();
if (!controller.choose(Outcome.Protect, choice, game)) {
if (controller == null || mageObject == null) {
return false;
}
if (!FatefulHourCondition.instance.apply(game, source)) {
game.addEffect(new GainProtectionFromColorTargetEffect(Duration.EndOfTurn), source);
return true;
}
ChoiceColor choice = new ChoiceColor();
if (!controller.choose(Outcome.Protect, choice, game) || choice.getColor() == null) {
return false;
}
if (choice.getColor() != null) {
game.informPlayers(mageObject.getLogName() + ": " + controller.getLogName() + " has chosen " + choice.getChoice());
FilterCard filter = new FilterCard();
filter.add(new ColorPredicate(choice.getColor()));
filter.setMessage(choice.getChoice());
Ability ability = new ProtectionAbility(filter);
game.addEffect(new GainAbilityControlledEffect(ability, Duration.EndOfTurn), source);
game.addEffect(new GainAbilityControlledEffect(ability, Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT), source);
game.addEffect(new GainAbilityControllerEffect(ability, Duration.EndOfTurn), source);
return true;
}
} else {
game.addEffect(new GainProtectionFromColorTargetEffect(Duration.EndOfTurn), source);
return true;
}
}
return false;
}
@Override
public FaithsShieldEffect copy() {

View file

@ -1,6 +1,5 @@
package mage.cards.f;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
@ -10,22 +9,23 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Zone;
import mage.filter.StaticFilters;
import mage.target.common.TargetAnyTarget;
import java.util.UUID;
/**
*
* @author Loki
*/
public final class FlameFusillade extends CardImpl {
public FlameFusillade(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{R}");
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{R}");
// Until end of turn, permanents you control gain "{tap}: This permanent deals 1 damage to any target."
Ability gainedAbility = new SimpleActivatedAbility(new DamageTargetEffect(1, "this permanent"), new TapSourceCost());
gainedAbility.addTarget(new TargetAnyTarget());
this.getSpellAbility().addEffect(new GainAbilityControlledEffect(gainedAbility, Duration.EndOfTurn).withDurationRuleAtStart(true));
this.getSpellAbility().addEffect(new GainAbilityControlledEffect(gainedAbility, Duration.EndOfTurn, StaticFilters.FILTER_PERMANENTS).withDurationRuleAtStart(true));
}
private FlameFusillade(final FlameFusillade card) {

View file

@ -2,12 +2,12 @@ package mage.cards.g;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityControllerEffect;
import mage.abilities.keyword.ProtectionAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
@ -45,7 +45,7 @@ public final class GorMuldrakAmphinologist extends CardImpl {
new GainAbilityControllerEffect(new ProtectionAbility(filter)).setText("you")
);
ability.addEffect(new GainAbilityControlledEffect(
new ProtectionAbility(filter), Duration.WhileOnBattlefield
new ProtectionAbility(filter), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENTS
).concatBy("and"));
this.addAbility(ability);

View file

@ -1,17 +1,18 @@
package mage.cards.l;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityControllerEffect;
import mage.abilities.effects.keyword.AmassEffect;
import mage.abilities.keyword.HexproofAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import java.util.UUID;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.GainAbilityControllerEffect;
import mage.constants.SubType;
/**
* @author TheElk801
@ -29,7 +30,7 @@ public final class LazotepPlating extends CardImpl {
HexproofAbility.getInstance(), Duration.EndOfTurn
);
Effect effect2 = new GainAbilityControlledEffect(
HexproofAbility.getInstance(), Duration.EndOfTurn
HexproofAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENTS
);
effect.setText("You");
effect2.setText("and permanents you control gain hexproof until end of turn");

View file

@ -35,9 +35,8 @@ public final class MishraTamerOfMakFawa extends CardImpl {
// Permanents you control have "Ward--Sacrifice a permanent."
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
new WardAbility(new SacrificeTargetCost(
StaticFilters.FILTER_PERMANENT
), false), Duration.WhileOnBattlefield
new WardAbility(new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT), false),
Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENTS
).withForceQuotes()));
// Each artifact card in your graveyard has unearth {1}{B}{R}

View file

@ -1,40 +1,38 @@
package mage.cards.s;
import java.util.UUID;
import mage.abilities.Mode;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.HexproofAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.StaticFilters;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author Plopman
*/
public final class SimicCharm extends CardImpl {
public SimicCharm (UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{G}{U}");
public SimicCharm(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{G}{U}");
//Choose one - Target creature gets +3/+3 until end of turn
this.getSpellAbility().addEffect(new BoostTargetEffect(3, 3, Duration.EndOfTurn));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
//permanents you control gain hexproof until end of turn
Mode mode = new Mode(new GainAbilityControlledEffect(HexproofAbility.getInstance(), Duration.EndOfTurn));
this.getSpellAbility().addMode(mode);
this.getSpellAbility().addMode(new Mode(new GainAbilityControlledEffect(HexproofAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENTS)));
//return target creature to its owner's hand.
Mode mode2 = new Mode(new ReturnToHandTargetEffect());
mode2.addTarget(new TargetCreaturePermanent());
this.getSpellAbility().addMode(mode2);
}
private SimicCharm(final SimicCharm card) {

View file

@ -1,7 +1,6 @@
package mage.cards.s;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
@ -13,18 +12,20 @@ import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class SoulOfNewPhyrexia extends CardImpl {
public SoulOfNewPhyrexia(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{6}");
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{6}");
this.subtype.add(SubType.PHYREXIAN);
this.subtype.add(SubType.AVATAR);
@ -33,10 +34,12 @@ public final class SoulOfNewPhyrexia extends CardImpl {
// Trample
this.addAbility(TrampleAbility.getInstance());
// {5}: Permanents you control gain indestructible until end of turn.
this.addAbility(new SimpleActivatedAbility(new GainAbilityControlledEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn), new GenericManaCost(5)));
this.addAbility(new SimpleActivatedAbility(new GainAbilityControlledEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENTS), new GenericManaCost(5)));
// {5}, Exile Soul of New Phyrexia from your graveyard: Permanents you control gain indestructible until end of turn.
Ability ability = new SimpleActivatedAbility(Zone.GRAVEYARD, new GainAbilityControlledEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn), new GenericManaCost(5));
Ability ability = new SimpleActivatedAbility(Zone.GRAVEYARD, new GainAbilityControlledEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENTS), new GenericManaCost(5));
ability.addCost(new ExileSourceFromGraveCost());
this.addAbility(ability);
}

View file

@ -1,24 +1,23 @@
package mage.cards.s;
import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.effects.PreventionEffectImpl;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityControllerEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.keyword.HexproofAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import java.util.UUID;
/**
*
* @author TheElk801
*/
public final class SurgeOfSalvation extends CardImpl {
@ -29,7 +28,11 @@ public final class SurgeOfSalvation extends CardImpl {
// You and permanents you control gain hexproof until end of turn. Prevent all damage that black and/or red sources would deal to creatures you control this turn.
this.getSpellAbility().addEffect(new GainAbilityControllerEffect(
HexproofAbility.getInstance(), Duration.EndOfTurn
).setText("you"));this.getSpellAbility().addEffect(new GainAbilityControlledEffect(HexproofAbility.getInstance(),Duration.EndOfTurn).concatBy("and"));this.getSpellAbility().addEffect(new SurgeOfSalvationEffect());
).setText("you"));
this.getSpellAbility().addEffect(new GainAbilityControlledEffect(
HexproofAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENTS
).concatBy("and"));
this.getSpellAbility().addEffect(new SurgeOfSalvationEffect());
}
private SurgeOfSalvation(final SurgeOfSalvation card) {
@ -45,7 +48,7 @@ public final class SurgeOfSalvation extends CardImpl {
class SurgeOfSalvationEffect extends PreventionEffectImpl {
SurgeOfSalvationEffect() {
super(Duration.EndOfTurn,Integer.MAX_VALUE,false);
super(Duration.EndOfTurn, Integer.MAX_VALUE, false);
staticText = "Prevent all damage that black and/or red sources would deal to creatures you control this turn";
}
@ -60,16 +63,16 @@ class SurgeOfSalvationEffect extends PreventionEffectImpl {
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType()== GameEvent.EventType.DAMAGE_PERMANENT;
return event.getType() == GameEvent.EventType.DAMAGE_PERMANENT;
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if(! super.applies(event, source, game)){
if (!super.applies(event, source, game)) {
return false;
}
Permanent permanent=game.getPermanent(event.getTargetId());
MageObject sourceObject=game.getObject(event.getSourceId());
Permanent permanent = game.getPermanent(event.getTargetId());
MageObject sourceObject = game.getObject(event.getSourceId());
return permanent != null
&& sourceObject != null
&& permanent.isCreature(game)

View file

@ -13,6 +13,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Zone;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.stack.Spell;
@ -29,7 +30,7 @@ public final class UltimateMagicHoly extends CardImpl {
// Permanents you control gain indestructible until end of turn. If this spell was cast from exile, prevent all damage that would be dealt to you this turn.
this.getSpellAbility().addEffect(new GainAbilityControlledEffect(
IndestructibleAbility.getInstance(), Duration.EndOfTurn
IndestructibleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENTS
));
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
new AddContinuousEffectToGame(new PreventDamageToControllerEffect(Duration.EndOfTurn)),

View file

@ -120,10 +120,12 @@ class VeilOfSummerEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
game.addEffect(new GainAbilityControlledEffect(
HexproofFromBlueAbility.getInstance(), Duration.EndOfTurn
HexproofFromBlueAbility.getInstance(), Duration.EndOfTurn,
StaticFilters.FILTER_PERMANENTS
), source);
game.addEffect(new GainAbilityControlledEffect(
HexproofFromBlackAbility.getInstance(), Duration.EndOfTurn
HexproofFromBlackAbility.getInstance(), Duration.EndOfTurn,
StaticFilters.FILTER_PERMANENTS
), source);
game.addEffect(new GainAbilityControllerEffect(
HexproofFromBlueAbility.getInstance(), Duration.EndOfTurn

View file

@ -2,16 +2,19 @@ package mage.cards.w;
import mage.ApprovingObject;
import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.WardAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.players.Player;
@ -29,13 +32,12 @@ public final class WondrousCrucible extends CardImpl {
// Permanents you control have ward {2}.
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
new WardAbility(new GenericManaCost(2), false), Duration.WhileOnBattlefield
new WardAbility(new GenericManaCost(2), false),
Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENTS
)));
// At the beginning of your end step, mill two cards, then exile a nonland card at random from your graveyard. Copy it. You may cast the copy without paying its mana cost.
this.addAbility(new BeginningOfEndStepTriggeredAbility(
new WondrousCrucibleEffect()
));
this.addAbility(new BeginningOfEndStepTriggeredAbility(new WondrousCrucibleEffect()));
}
private WondrousCrucible(final WondrousCrucible card) {

View file

@ -12,6 +12,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.predicate.permanent.TokenPredicate;
import java.util.UUID;
@ -43,7 +44,8 @@ public final class ZurgoThundersDecree extends CardImpl {
// During your end step, Warrior tokens you control have "This token can't be sacrificed."
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(new GainAbilityControlledEffect(
new SimpleStaticAbility(new CantBeSacrificedSourceEffect()), Duration.WhileOnBattlefield
new SimpleStaticAbility(new CantBeSacrificedSourceEffect()),
Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENTS
), condition, "during your end step, Warrior tokens you control have \"This token can't be sacrificed.\"")));
}

View file

@ -9,7 +9,6 @@ import mage.constants.Layer;
import mage.constants.Outcome;
import mage.constants.SubLayer;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.util.CardUtil;
@ -27,10 +26,6 @@ public class GainAbilityControlledEffect extends ContinuousEffectImpl {
protected boolean forceQuotes = false;
protected boolean durationRuleAtStart = false; // put duration rule to the start of the rules instead end
public GainAbilityControlledEffect(Ability ability, Duration duration) {
this(ability, duration, StaticFilters.FILTER_PERMANENTS);
}
public GainAbilityControlledEffect(Ability ability, Duration duration, FilterPermanent filter) {
this(ability, duration, filter, false);
}