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; package mage.cards.b;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.MyTurnCondition; import mage.abilities.condition.common.MyTurnCondition;
@ -14,6 +13,7 @@ import mage.abilities.keyword.ClassLevelAbility;
import mage.abilities.keyword.ClassReminderAbility; import mage.abilities.keyword.ClassReminderAbility;
import mage.abilities.keyword.DoubleStrikeAbility; import mage.abilities.keyword.DoubleStrikeAbility;
import mage.abilities.keyword.HasteAbility; import mage.abilities.keyword.HasteAbility;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.*;
@ -74,7 +74,7 @@ public final class BlacksmithsTalent extends CardImpl {
DoubleStrikeAbility.getInstance(), Duration.WhileOnBattlefield, filter2 DoubleStrikeAbility.getInstance(), Duration.WhileOnBattlefield, filter2
), MyTurnCondition.instance, "during your turn, equipped creatures you control have double strike")); ), MyTurnCondition.instance, "during your turn, equipped creatures you control have double strike"));
ability.addEffect(new ConditionalContinuousEffect(new GainAbilityControlledEffect( ability.addEffect(new ConditionalContinuousEffect(new GainAbilityControlledEffect(
HasteAbility.getInstance(), Duration.WhileOnBattlefield HasteAbility.getInstance(), Duration.WhileOnBattlefield, filter2
), MyTurnCondition.instance, "and haste")); ), MyTurnCondition.instance, "and haste"));
this.addAbility(new SimpleStaticAbility(new GainClassAbilitySourceEffect(ability, 3))); 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.Mode;
import mage.abilities.effects.common.DamageTargetEffect; 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.GainAbilityControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.DoubleStrikeAbility; import mage.abilities.keyword.DoubleStrikeAbility;
@ -11,6 +10,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.filter.StaticFilters;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import mage.target.common.TargetPlayerOrPlaneswalker; 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 //Choose one - Boros Charm deals 4 damage to target player
this.getSpellAbility().addEffect(new DamageTargetEffect(4)); this.getSpellAbility().addEffect(new DamageTargetEffect(4));
this.getSpellAbility().addTarget(new TargetPlayerOrPlaneswalker()); this.getSpellAbility().addTarget(new TargetPlayerOrPlaneswalker());
//or permanents you control are indestructible this turn //or permanents you control are indestructible this turn
this.getSpellAbility().addMode(new Mode(new GainAbilityControlledEffect( 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. //or target creature gains double strike until end of turn.
Mode mode2 = new Mode(new GainAbilityTargetEffect(DoubleStrikeAbility.getInstance(), Duration.EndOfTurn)); Mode mode2 = new Mode(new GainAbilityTargetEffect(DoubleStrikeAbility.getInstance(), Duration.EndOfTurn));
mode2.addTarget(new TargetCreaturePermanent()); mode2.addTarget(new TargetCreaturePermanent());

View file

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

View file

@ -14,6 +14,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.SubType; import mage.constants.SubType;
import mage.filter.StaticFilters;
import java.util.UUID; 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. // As long as you're the monarch, permanents you control have hexproof.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new GainAbilityControlledEffect( new GainAbilityControlledEffect(
HexproofAbility.getInstance(), Duration.WhileOnBattlefield HexproofAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENTS
), MonarchIsSourceControllerCondition.instance, ), MonarchIsSourceControllerCondition.instance,
"as long as you're the monarch, permanents you control have hexproof" "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.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.GiftType; import mage.constants.GiftType;
import mage.filter.StaticFilters;
import java.util.UUID; import java.util.UUID;
@ -32,11 +33,12 @@ public final class DawnsTruce extends CardImpl {
HexproofAbility.getInstance(), Duration.EndOfTurn HexproofAbility.getInstance(), Duration.EndOfTurn
).setText("you")); ).setText("you"));
this.getSpellAbility().addEffect(new GainAbilityControlledEffect( this.getSpellAbility().addEffect(new GainAbilityControlledEffect(
HexproofAbility.getInstance(), Duration.EndOfTurn HexproofAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENTS
).concatBy("and")); ).concatBy("and"));
this.getSpellAbility().addEffect(new ConditionalOneShotEffect( this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
new AddContinuousEffectToGame(new GainAbilityControlledEffect( new AddContinuousEffectToGame(new GainAbilityControlledEffect(
IndestructibleAbility.getInstance(), Duration.EndOfTurn IndestructibleAbility.getInstance(), Duration.EndOfTurn,
StaticFilters.FILTER_PERMANENTS
)), GiftWasPromisedCondition.TRUE, "if the gift was promised, " + )), GiftWasPromisedCondition.TRUE, "if the gift was promised, " +
"permanents you control also gain indestructible until end of turn" "permanents you control also gain indestructible until end of turn"
)); ));

View file

@ -1,8 +1,6 @@
package mage.cards.d; package mage.cards.d;
import java.util.UUID;
import mage.abilities.TriggeredAbility;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
@ -17,8 +15,9 @@ import mage.constants.Duration;
import mage.constants.SpellAbilityType; import mage.constants.SpellAbilityType;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class DrivenDespair extends SplitCard { 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); 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." // 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( this.getLeftHalfCard().getSpellAbility().addEffect(new GainAbilityControlledEffect(
TrampleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES) TrampleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES
.setText("Until end of turn, creatures you control gain trample")); ).setText("Until end of turn, creatures you control gain trample"));
TriggeredAbility ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DrawCardSourceControllerEffect(1), false); this.getLeftHalfCard().getSpellAbility().addEffect(new GainAbilityControlledEffect(
getLeftHalfCard().getSpellAbility().addEffect(new GainAbilityControlledEffect(ability, Duration.EndOfTurn) new DealsCombatDamageToAPlayerTriggeredAbility(new DrawCardSourceControllerEffect(1), false),
.setText("\"Whenever this creature deals combat damage to a player, draw a card.\"") Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES
.concatBy("and")); ).setText("\"Whenever this creature deals combat damage to a player, draw a card.\"").concatBy("and"));
// Despair {1}{B} // Despair {1}{B}
// Sorcery // Sorcery
// Aftermath // 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." // 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( this.getRightHalfCard().getSpellAbility().addEffect(new GainAbilityControlledEffect(
new MenaceAbility(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES) new MenaceAbility(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES
.setText("Until end of turn, creatures you control gain menace")); ).setText("Until end of turn, creatures you control gain menace"));
ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DiscardTargetEffect(1), false, true); this.getRightHalfCard().getSpellAbility().addEffect(new GainAbilityControlledEffect(
getRightHalfCard().getSpellAbility().addEffect(new GainAbilityControlledEffect(ability, Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURES) new DealsCombatDamageToAPlayerTriggeredAbility(
.setText("\"Whenever this creature deals combat damage to a player, that player discards a card.\"") new DiscardTargetEffect(1), false, true
.concatBy("and")); ), 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; package mage.cards.f;
import java.util.UUID;
import mage.MageObject; import mage.MageObject;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.condition.common.FatefulHourCondition; import mage.abilities.condition.common.FatefulHourCondition;
@ -17,13 +16,15 @@ import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.filter.StaticFilters;
import mage.filter.predicate.mageobject.ColorPredicate; import mage.filter.predicate.mageobject.ColorPredicate;
import mage.game.Game; import mage.game.Game;
import mage.players.Player; import mage.players.Player;
import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetControlledPermanent;
import java.util.UUID;
/** /**
*
* @author BetaSteward * @author BetaSteward
*/ */
public final class FaithsShield extends CardImpl { public final class FaithsShield extends CardImpl {
@ -63,29 +64,25 @@ class FaithsShieldEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId()); Player controller = game.getPlayer(source.getControllerId());
MageObject mageObject = game.getObject(source); MageObject mageObject = game.getObject(source);
if (controller != null && mageObject != null) { if (controller == null || mageObject == null) {
if (FatefulHourCondition.instance.apply(game, source)) { return false;
ChoiceColor choice = new ChoiceColor();
if (!controller.choose(Outcome.Protect, choice, game)) {
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 GainAbilityControllerEffect(ability, Duration.EndOfTurn), source);
return true;
}
} else {
game.addEffect(new GainProtectionFromColorTargetEffect(Duration.EndOfTurn), source);
return true;
}
} }
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;
}
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, StaticFilters.FILTER_PERMANENT), source);
game.addEffect(new GainAbilityControllerEffect(ability, Duration.EndOfTurn), source);
return true;
} }
@Override @Override

View file

@ -1,6 +1,5 @@
package mage.cards.f; package mage.cards.f;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
@ -10,22 +9,23 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.Zone; import mage.filter.StaticFilters;
import mage.target.common.TargetAnyTarget; import mage.target.common.TargetAnyTarget;
import java.util.UUID;
/** /**
*
* @author Loki * @author Loki
*/ */
public final class FlameFusillade extends CardImpl { public final class FlameFusillade extends CardImpl {
public FlameFusillade(UUID ownerId, CardSetInfo setInfo) { 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." // 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()); Ability gainedAbility = new SimpleActivatedAbility(new DamageTargetEffect(1, "this permanent"), new TapSourceCost());
gainedAbility.addTarget(new TargetAnyTarget()); 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) { private FlameFusillade(final FlameFusillade card) {

View file

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

View file

@ -1,17 +1,18 @@
package mage.cards.l; package mage.cards.l;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityControllerEffect;
import mage.abilities.effects.keyword.AmassEffect; import mage.abilities.effects.keyword.AmassEffect;
import mage.abilities.keyword.HexproofAbility; import mage.abilities.keyword.HexproofAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import java.util.UUID; import java.util.UUID;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.GainAbilityControllerEffect;
import mage.constants.SubType;
/** /**
* @author TheElk801 * @author TheElk801
@ -29,7 +30,7 @@ public final class LazotepPlating extends CardImpl {
HexproofAbility.getInstance(), Duration.EndOfTurn HexproofAbility.getInstance(), Duration.EndOfTurn
); );
Effect effect2 = new GainAbilityControlledEffect( Effect effect2 = new GainAbilityControlledEffect(
HexproofAbility.getInstance(), Duration.EndOfTurn HexproofAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENTS
); );
effect.setText("You"); effect.setText("You");
effect2.setText("and permanents you control gain hexproof until end of turn"); 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." // Permanents you control have "Ward--Sacrifice a permanent."
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
new WardAbility(new SacrificeTargetCost( new WardAbility(new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT), false),
StaticFilters.FILTER_PERMANENT Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENTS
), false), Duration.WhileOnBattlefield
).withForceQuotes())); ).withForceQuotes()));
// Each artifact card in your graveyard has unearth {1}{B}{R} // Each artifact card in your graveyard has unearth {1}{B}{R}

View file

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

View file

@ -1,7 +1,6 @@
package mage.cards.s; package mage.cards.s;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
@ -13,30 +12,34 @@ import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.filter.StaticFilters;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class SoulOfNewPhyrexia extends CardImpl { public final class SoulOfNewPhyrexia extends CardImpl {
public SoulOfNewPhyrexia(UUID ownerId, CardSetInfo setInfo) { 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.PHYREXIAN);
this.subtype.add(SubType.AVATAR); this.subtype.add(SubType.AVATAR);
this.power = new MageInt(6); this.power = new MageInt(6);
this.toughness = new MageInt(6); this.toughness = new MageInt(6);
// Trample // Trample
this.addAbility(TrampleAbility.getInstance()); this.addAbility(TrampleAbility.getInstance());
// {5}: Permanents you control gain indestructible until end of turn. // {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. // {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()); ability.addCost(new ExileSourceFromGraveCost());
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,24 +1,23 @@
package mage.cards.s; package mage.cards.s;
import java.util.UUID;
import mage.MageObject; import mage.MageObject;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.effects.PreventionEffectImpl; import mage.abilities.effects.PreventionEffectImpl;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityControllerEffect; import mage.abilities.effects.common.continuous.GainAbilityControllerEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.keyword.HexproofAbility; import mage.abilities.keyword.HexproofAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.filter.StaticFilters;
import mage.game.Game; import mage.game.Game;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import java.util.UUID;
/** /**
*
* @author TheElk801 * @author TheElk801
*/ */
public final class SurgeOfSalvation extends CardImpl { 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. // 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( this.getSpellAbility().addEffect(new GainAbilityControllerEffect(
HexproofAbility.getInstance(), Duration.EndOfTurn 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) { private SurgeOfSalvation(final SurgeOfSalvation card) {
@ -45,7 +48,7 @@ public final class SurgeOfSalvation extends CardImpl {
class SurgeOfSalvationEffect extends PreventionEffectImpl { class SurgeOfSalvationEffect extends PreventionEffectImpl {
SurgeOfSalvationEffect() { 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"; 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 @Override
public boolean checksEventType(GameEvent event, Game game) { public boolean checksEventType(GameEvent event, Game game) {
return event.getType()== GameEvent.EventType.DAMAGE_PERMANENT; return event.getType() == GameEvent.EventType.DAMAGE_PERMANENT;
} }
@Override @Override
public boolean applies(GameEvent event, Ability source, Game game) { public boolean applies(GameEvent event, Ability source, Game game) {
if(! super.applies(event, source, game)){ if (!super.applies(event, source, game)) {
return false; return false;
} }
Permanent permanent=game.getPermanent(event.getTargetId()); Permanent permanent = game.getPermanent(event.getTargetId());
MageObject sourceObject=game.getObject(event.getSourceId()); MageObject sourceObject = game.getObject(event.getSourceId());
return permanent != null return permanent != null
&& sourceObject != null && sourceObject != null
&& permanent.isCreature(game) && permanent.isCreature(game)

View file

@ -13,6 +13,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.Zone; import mage.constants.Zone;
import mage.filter.StaticFilters;
import mage.game.Game; import mage.game.Game;
import mage.game.stack.Spell; 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. // 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( this.getSpellAbility().addEffect(new GainAbilityControlledEffect(
IndestructibleAbility.getInstance(), Duration.EndOfTurn IndestructibleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENTS
)); ));
this.getSpellAbility().addEffect(new ConditionalOneShotEffect( this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
new AddContinuousEffectToGame(new PreventDamageToControllerEffect(Duration.EndOfTurn)), new AddContinuousEffectToGame(new PreventDamageToControllerEffect(Duration.EndOfTurn)),

View file

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

View file

@ -2,16 +2,19 @@ package mage.cards.w;
import mage.ApprovingObject; import mage.ApprovingObject;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.WardAbility; import mage.abilities.keyword.WardAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.Card; import mage.cards.Card;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; 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.filter.StaticFilters;
import mage.game.Game; import mage.game.Game;
import mage.players.Player; import mage.players.Player;
@ -29,13 +32,12 @@ public final class WondrousCrucible extends CardImpl {
// Permanents you control have ward {2}. // Permanents you control have ward {2}.
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( 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. // 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( this.addAbility(new BeginningOfEndStepTriggeredAbility(new WondrousCrucibleEffect()));
new WondrousCrucibleEffect()
));
} }
private WondrousCrucible(final WondrousCrucible card) { private WondrousCrucible(final WondrousCrucible card) {

View file

@ -12,6 +12,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.*;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.predicate.permanent.TokenPredicate; import mage.filter.predicate.permanent.TokenPredicate;
import java.util.UUID; 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." // During your end step, Warrior tokens you control have "This token can't be sacrificed."
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(new GainAbilityControlledEffect( 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.\""))); ), 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.Outcome;
import mage.constants.SubLayer; import mage.constants.SubLayer;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.util.CardUtil; import mage.util.CardUtil;
@ -27,10 +26,6 @@ public class GainAbilityControlledEffect extends ContinuousEffectImpl {
protected boolean forceQuotes = false; protected boolean forceQuotes = false;
protected boolean durationRuleAtStart = false; // put duration rule to the start of the rules instead end 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) { public GainAbilityControlledEffect(Ability ability, Duration duration, FilterPermanent filter) {
this(ability, duration, filter, false); this(ability, duration, filter, false);
} }