diff --git a/Mage.Sets/src/mage/cards/f/FiresongAndSunspeaker.java b/Mage.Sets/src/mage/cards/f/FiresongAndSunspeaker.java index ec0163115fa..a58d0fc02ed 100644 --- a/Mage.Sets/src/mage/cards/f/FiresongAndSunspeaker.java +++ b/Mage.Sets/src/mage/cards/f/FiresongAndSunspeaker.java @@ -9,13 +9,13 @@ import mage.ObjectColor; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.Effect; -import mage.abilities.effects.GainAbilitySpellsEffect; import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledSpellsEffect; import mage.abilities.keyword.LifelinkAbility; import mage.constants.*; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.FilterObject; +import mage.filter.FilterCard; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ColorPredicate; import mage.game.Game; @@ -28,7 +28,7 @@ import mage.target.common.TargetCreatureOrPlayer; */ public final class FiresongAndSunspeaker extends CardImpl { - private static final FilterObject filter = new FilterObject("Red instant and sorcery spells you control"); + private static final FilterCard filter = new FilterCard("red instant and sorcery spells you control"); static { filter.add(new ColorPredicate(ObjectColor.RED)); @@ -45,7 +45,7 @@ public final class FiresongAndSunspeaker extends CardImpl { this.toughness = new MageInt(6); // Red instant and sorcery spells you control have lifelink. - Effect effect = new GainAbilitySpellsEffect(LifelinkAbility.getInstance(), filter); + Effect effect = new GainAbilityControlledSpellsEffect(LifelinkAbility.getInstance(), filter); effect.setText("Red instant and sorcery spells you control have lifelink"); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); // Whenever a white instant or sorcery spell causes you to gain life, Firesong and Sunspeaker deals 3 damage to target creature or player. diff --git a/Mage.Sets/src/mage/cards/f/FlamekinHerald.java b/Mage.Sets/src/mage/cards/f/FlamekinHerald.java index 256420b7072..07bb4023070 100644 --- a/Mage.Sets/src/mage/cards/f/FlamekinHerald.java +++ b/Mage.Sets/src/mage/cards/f/FlamekinHerald.java @@ -2,13 +2,14 @@ package mage.cards.f; import mage.MageInt; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.GainAbilitySpellsEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledSpellsEffect; import mage.abilities.keyword.CascadeAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.filter.FilterSpell; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CommanderPredicate; import java.util.UUID; @@ -18,10 +19,11 @@ import java.util.UUID; */ public final class FlamekinHerald extends CardImpl { - private static final FilterSpell filter = new FilterSpell("Commander spells you cast"); + private static final FilterCard filter = new FilterCard("Commander spells you cast"); static { filter.add(CommanderPredicate.instance); + filter.add(Predicates.not(CardType.LAND.getPredicate())); } public FlamekinHerald(UUID ownerId, CardSetInfo setInfo) { @@ -33,7 +35,7 @@ public final class FlamekinHerald extends CardImpl { this.toughness = new MageInt(2); // Commander spells you cast have cascade. - this.addAbility(new SimpleStaticAbility(new GainAbilitySpellsEffect(new CascadeAbility(false), filter))); + this.addAbility(new SimpleStaticAbility(new GainAbilityControlledSpellsEffect(new CascadeAbility(false), filter))); } private FlamekinHerald(final FlamekinHerald card) { diff --git a/Mage.Sets/src/mage/cards/h/HoardingBroodlord.java b/Mage.Sets/src/mage/cards/h/HoardingBroodlord.java index 439fe5086ca..1c5e4a24c0b 100644 --- a/Mage.Sets/src/mage/cards/h/HoardingBroodlord.java +++ b/Mage.Sets/src/mage/cards/h/HoardingBroodlord.java @@ -4,17 +4,18 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.GainAbilitySpellsEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledSpellsEffect; import mage.abilities.keyword.ConvokeAbility; import mage.abilities.keyword.FlyingAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.filter.FilterObject; -import mage.filter.FilterSpell; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; import mage.filter.predicate.card.CastFromZonePredicate; +import mage.filter.predicate.mageobject.AbilityPredicate; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInLibrary; @@ -27,10 +28,11 @@ import java.util.UUID; */ public final class HoardingBroodlord extends CardImpl { - private static final FilterObject filter = new FilterSpell("spells you cast from exile"); + private static final FilterCard filter = new FilterCard("spells you cast from exile"); static { filter.add(new CastFromZonePredicate(Zone.EXILED)); + filter.add(Predicates.not(new AbilityPredicate(ConvokeAbility.class))); // So there are not redundant copies being added to each card } public HoardingBroodlord(UUID ownerId, CardSetInfo setInfo) { @@ -50,7 +52,7 @@ public final class HoardingBroodlord extends CardImpl { this.addAbility(new EntersBattlefieldTriggeredAbility(new HoardingBroodlordEffect())); // Spells you cast from exile have convoke. - this.addAbility(new SimpleStaticAbility(new GainAbilitySpellsEffect(new ConvokeAbility(), filter))); + this.addAbility(new SimpleStaticAbility(new GainAbilityControlledSpellsEffect(new ConvokeAbility(), filter))); } private HoardingBroodlord(final HoardingBroodlord card) { diff --git a/Mage.Sets/src/mage/cards/i/ImotiCelebrantOfBounty.java b/Mage.Sets/src/mage/cards/i/ImotiCelebrantOfBounty.java index 32a89d4b7bb..a9675a5bafa 100644 --- a/Mage.Sets/src/mage/cards/i/ImotiCelebrantOfBounty.java +++ b/Mage.Sets/src/mage/cards/i/ImotiCelebrantOfBounty.java @@ -2,7 +2,7 @@ package mage.cards.i; import mage.MageInt; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.GainAbilitySpellsEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledSpellsEffect; import mage.abilities.keyword.CascadeAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -10,7 +10,7 @@ import mage.constants.CardType; import mage.constants.ComparisonType; import mage.constants.SubType; import mage.constants.SuperType; -import mage.filter.FilterObject; +import mage.filter.FilterCard; import mage.filter.predicate.mageobject.ManaValuePredicate; import java.util.UUID; @@ -20,8 +20,7 @@ import java.util.UUID; */ public final class ImotiCelebrantOfBounty extends CardImpl { - private static final FilterObject filter - = new FilterObject("Spells you cast with mana value 6 or greater"); + private static final FilterCard filter = new FilterCard("spells you cast with mana value 6 or greater"); static { filter.add(new ManaValuePredicate(ComparisonType.MORE_THAN, 5)); @@ -41,7 +40,7 @@ public final class ImotiCelebrantOfBounty extends CardImpl { // Spells you cast with converted mana cost 6 or greater have cascade. this.addAbility(new SimpleStaticAbility( - new GainAbilitySpellsEffect(new CascadeAbility(false), filter) + new GainAbilityControlledSpellsEffect(new CascadeAbility(false), filter) )); } diff --git a/Mage.Sets/src/mage/cards/p/PestilentSpirit.java b/Mage.Sets/src/mage/cards/p/PestilentSpirit.java index c051388cc0e..d8842ffcd44 100644 --- a/Mage.Sets/src/mage/cards/p/PestilentSpirit.java +++ b/Mage.Sets/src/mage/cards/p/PestilentSpirit.java @@ -2,7 +2,7 @@ package mage.cards.p; import mage.MageInt; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.GainAbilitySpellsEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledSpellsEffect; import mage.abilities.keyword.DeathtouchAbility; import mage.abilities.keyword.MenaceAbility; import mage.cards.CardImpl; @@ -10,7 +10,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; -import mage.filter.FilterObject; +import mage.filter.FilterCard; import mage.filter.predicate.Predicates; import java.util.UUID; @@ -20,7 +20,7 @@ import java.util.UUID; */ public final class PestilentSpirit extends CardImpl { - private static final FilterObject filter = new FilterObject("instant and sorcery spells you control"); + private static final FilterCard filter = new FilterCard("instant and sorcery spells you control"); static { filter.add(Predicates.or( @@ -45,9 +45,7 @@ public final class PestilentSpirit extends CardImpl { // Instant and sorcery spells you control have deathtouch. this.addAbility(new SimpleStaticAbility( Zone.BATTLEFIELD, - new GainAbilitySpellsEffect( - DeathtouchAbility.getInstance(), filter - ).setText("Instant and sorcery spells you control have deathtouch") + new GainAbilityControlledSpellsEffect(DeathtouchAbility.getInstance(), filter) )); } diff --git a/Mage.Sets/src/mage/cards/r/RadiantScrollwielder.java b/Mage.Sets/src/mage/cards/r/RadiantScrollwielder.java index 7c9eae74af4..de0c34dc7d9 100644 --- a/Mage.Sets/src/mage/cards/r/RadiantScrollwielder.java +++ b/Mage.Sets/src/mage/cards/r/RadiantScrollwielder.java @@ -5,16 +5,16 @@ import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.GainAbilitySpellsEffect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledSpellsEffect; import mage.abilities.keyword.LifelinkAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.filter.FilterObject; +import mage.filter.FilterCard; import mage.filter.StaticFilters; import mage.filter.predicate.Predicates; import mage.game.Game; @@ -33,7 +33,7 @@ import java.util.UUID; */ public final class RadiantScrollwielder extends CardImpl { - private static final FilterObject filter = new FilterObject("instant and sorcery spells you control"); + private static final FilterCard filter = new FilterCard("instant and sorcery spells you control"); static { filter.add(Predicates.or( @@ -51,7 +51,7 @@ public final class RadiantScrollwielder extends CardImpl { this.toughness = new MageInt(4); // Instant and sorcery spells you control have lifelink. - this.addAbility(new SimpleStaticAbility(new GainAbilitySpellsEffect( + this.addAbility(new SimpleStaticAbility(new GainAbilityControlledSpellsEffect( LifelinkAbility.getInstance(), filter ).setText("instant and sorcery spells you control have lifelink"))); diff --git a/Mage.Sets/src/mage/cards/s/SoulfireGrandMaster.java b/Mage.Sets/src/mage/cards/s/SoulfireGrandMaster.java index d8df2ae8249..f43a8e82313 100644 --- a/Mage.Sets/src/mage/cards/s/SoulfireGrandMaster.java +++ b/Mage.Sets/src/mage/cards/s/SoulfireGrandMaster.java @@ -7,15 +7,14 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.Effect; -import mage.abilities.effects.GainAbilitySpellsEffect; import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.continuous.GainAbilityControlledSpellsEffect; import mage.abilities.keyword.LifelinkAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.FilterCard; -import mage.filter.FilterObject; import mage.filter.predicate.Predicates; import mage.game.Game; import mage.game.events.GameEvent; @@ -30,7 +29,7 @@ import java.util.UUID; */ public final class SoulfireGrandMaster extends CardImpl { - private static final FilterObject filter = new FilterObject("instant and sorcery spells you control"); + private static final FilterCard filter = new FilterCard("instant and sorcery spells you control"); static { filter.add(Predicates.or(CardType.INSTANT.getPredicate(), CardType.SORCERY.getPredicate())); @@ -47,7 +46,7 @@ public final class SoulfireGrandMaster extends CardImpl { this.addAbility(LifelinkAbility.getInstance()); // Instant and sorcery spells you control have lifelink. - Effect effect = new GainAbilitySpellsEffect(LifelinkAbility.getInstance(), filter); + Effect effect = new GainAbilityControlledSpellsEffect(LifelinkAbility.getInstance(), filter); effect.setText("Instant and sorcery spells you control have lifelink"); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); diff --git a/Mage/src/main/java/mage/abilities/effects/GainAbilitySpellsEffect.java b/Mage/src/main/java/mage/abilities/effects/GainAbilitySpellsEffect.java deleted file mode 100644 index 45e00330732..00000000000 --- a/Mage/src/main/java/mage/abilities/effects/GainAbilitySpellsEffect.java +++ /dev/null @@ -1,83 +0,0 @@ -package mage.abilities.effects; - -import mage.abilities.Ability; -import mage.cards.Card; -import mage.constants.*; -import mage.filter.FilterObject; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.game.stack.StackObject; -import mage.players.Player; - -public class GainAbilitySpellsEffect extends ContinuousEffectImpl { - - private final Ability ability; - private final FilterObject filter; - - public GainAbilitySpellsEffect(Ability ability, FilterObject filter) { - super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); - this.ability = ability; - this.filter = filter; - staticText = filter.getMessage() + " have " + ability.getRule(); - } - - private GainAbilitySpellsEffect(final GainAbilitySpellsEffect effect) { - super(effect); - this.ability = effect.ability; - this.filter = effect.filter; - } - - @Override - public GainAbilitySpellsEffect copy() { - return new GainAbilitySpellsEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - Permanent permanent = game.getPermanent(source.getSourceId()); - if (player == null || permanent == null) { - return false; - } - for (Card card : game.getExile().getAllCards(game)) { - if (card.isOwnedBy(source.getControllerId()) && filter.match(card, game)) { - game.getState().addOtherAbility(card, ability); - } - } - for (Card card : player.getLibrary().getCards(game)) { - if (filter.match(card, game)) { - game.getState().addOtherAbility(card, ability); - } - } - for (Card card : player.getHand().getCards(game)) { - if (filter.match(card, game)) { - game.getState().addOtherAbility(card, ability); - } - } - for (Card card : player.getGraveyard().getCards(game)) { - if (filter.match(card, game)) { - game.getState().addOtherAbility(card, ability); - } - } - - // workaround to gain cost reduction abilities to commanders before cast (make it playable) - game.getCommanderCardsFromCommandZone(player, CommanderCardType.ANY) - .stream() - .filter(card -> filter.match(card, game)) - .forEach(card -> { - game.getState().addOtherAbility(card, ability); - }); - - for (StackObject stackObject : game.getStack()) { - if (!stackObject.isControlledBy(source.getControllerId())) { - continue; - } - Card card = game.getCard(stackObject.getSourceId()); - if (card == null || !filter.match(stackObject, game)) { - continue; - } - game.getState().addOtherAbility(card, ability); - } - return true; - } -}