diff --git a/Mage.Sets/src/mage/cards/b/BrineComber.java b/Mage.Sets/src/mage/cards/b/BrineComber.java index b2d5b594d90..959136a2bd4 100644 --- a/Mage.Sets/src/mage/cards/b/BrineComber.java +++ b/Mage.Sets/src/mage/cards/b/BrineComber.java @@ -1,19 +1,19 @@ package mage.cards.b; import mage.MageInt; -import mage.abilities.SpellAbility; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.BecomesTargetSourceTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.keyword.DisturbAbility; +import mage.abilities.meta.OrTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; +import mage.filter.FilterSpell; +import mage.filter.predicate.other.AuraSpellPredicate; import mage.game.permanent.token.SpiritWhiteToken; -import mage.game.stack.Spell; import java.util.UUID; @@ -22,6 +22,12 @@ import java.util.UUID; */ public final class BrineComber extends CardImpl { + private static final FilterSpell filter = new FilterSpell("an Aura spell"); + + static { + filter.add(AuraSpellPredicate.instance); + } + public BrineComber(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{U}"); @@ -31,7 +37,10 @@ public final class BrineComber extends CardImpl { this.secondSideCardClazz = mage.cards.b.BrineboundGift.class; // Whenever Brine Comber enters the battlefield or becomes the target of an Aura spell, create a 1/1 white Spirit creature token with flying. - this.addAbility(new BrineComberTriggeredAbility()); + this.addAbility(new OrTriggeredAbility(Zone.ALL, new CreateTokenEffect(new SpiritWhiteToken()), false, + "Whenever {this} enters the battlefield or becomes the target of an Aura spell, ", + new EntersBattlefieldTriggeredAbility(null), + new BecomesTargetSourceTriggeredAbility(null, filter))); // Disturb {W}{U} this.addAbility(new DisturbAbility(this, "{W}{U}")); @@ -46,54 +55,3 @@ public final class BrineComber extends CardImpl { return new BrineComber(this); } } - -class BrineComberTriggeredAbility extends TriggeredAbilityImpl { - - BrineComberTriggeredAbility() { - super(Zone.ALL, new CreateTokenEffect(new SpiritWhiteToken())); - } - - private BrineComberTriggeredAbility(final BrineComberTriggeredAbility effect) { - super(effect); - } - - @Override - public BrineComberTriggeredAbility copy() { - return new BrineComberTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD - || event.getType() == GameEvent.EventType.TARGETED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - switch (event.getType()) { - case ENTERS_THE_BATTLEFIELD: - return event.getTargetId().equals(getSourceId()); - case TARGETED: - break; - default: - return false; - } - if (this.getSourcePermanentIfItStillExists(game) == null - || !event.getTargetId().equals(getSourceId())) { - return false; - } - Spell spell = game.getSpell(event.getSourceId()); - if(spell == null) { - return false; - } - SpellAbility spellAbility = (SpellAbility) spell.getStackAbility(); - return spellAbility != null - && spellAbility.getCharacteristics(game).hasSubtype(SubType.AURA, game); - } - - @Override - public String getRule() { - return "Whenever {this} enters the battlefield or becomes the target " + - "of an Aura spell, create a 1/1 white Spirit creature token with flying."; - } -} diff --git a/Mage.Sets/src/mage/cards/b/BrineboundGift.java b/Mage.Sets/src/mage/cards/b/BrineboundGift.java index 530f797aa62..7789d0a53b3 100644 --- a/Mage.Sets/src/mage/cards/b/BrineboundGift.java +++ b/Mage.Sets/src/mage/cards/b/BrineboundGift.java @@ -1,23 +1,20 @@ package mage.cards.b; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.BecomesTargetAttachedTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.PutIntoGraveFromAnywhereSourceAbility; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.ExileSourceEffect; import mage.abilities.keyword.EnchantAbility; +import mage.abilities.meta.OrTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.SubType; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; +import mage.constants.*; +import mage.filter.FilterSpell; +import mage.filter.predicate.other.AuraSpellPredicate; import mage.game.permanent.token.SpiritWhiteToken; -import mage.game.stack.Spell; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; @@ -28,6 +25,12 @@ import java.util.UUID; */ public final class BrineboundGift extends CardImpl { + private static final FilterSpell filter = new FilterSpell("an Aura spell"); + + static { + filter.add(AuraSpellPredicate.instance); + } + public BrineboundGift(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, ""); @@ -44,7 +47,10 @@ public final class BrineboundGift extends CardImpl { this.addAbility(ability); // Whenever Brinebound Gift enters the battlefield or enchanted creature becomes the target of an Aura spell, create a 1/1 white Spirit creature token with flying. - this.addAbility(new BrineboundGiftTriggeredAbility()); + this.addAbility(new OrTriggeredAbility(Zone.ALL, new CreateTokenEffect(new SpiritWhiteToken()), false, + "Whenever {this} enters the battlefield or enchanted creature becomes the target of an Aura spell, ", + new EntersBattlefieldTriggeredAbility(null), + new BecomesTargetAttachedTriggeredAbility(null, filter, SetTargetPointer.NONE, false))); // If Brinebound Gift would be put into a graveyard from anywhere, exile it instead. this.addAbility(new PutIntoGraveFromAnywhereSourceAbility(new ExileSourceEffect().setText("exile it instead"))); @@ -59,49 +65,3 @@ public final class BrineboundGift extends CardImpl { return new BrineboundGift(this); } } - -class BrineboundGiftTriggeredAbility extends TriggeredAbilityImpl { - - BrineboundGiftTriggeredAbility() { - super(Zone.ALL, new CreateTokenEffect(new SpiritWhiteToken())); - } - - private BrineboundGiftTriggeredAbility(final BrineboundGiftTriggeredAbility effect) { - super(effect); - } - - @Override - public BrineboundGiftTriggeredAbility copy() { - return new BrineboundGiftTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD - || event.getType() == GameEvent.EventType.TARGETED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - switch (event.getType()) { - case ENTERS_THE_BATTLEFIELD: - return event.getTargetId().equals(getSourceId()); - case TARGETED: - break; - default: - return false; - } - Permanent permanent = this.getSourcePermanentOrLKI(game); - if (permanent == null || !event.getTargetId().equals(permanent.getAttachedTo())) { - return false; - } - Spell spell = game.getSpell(event.getSourceId()); - return spell != null && spell.hasSubtype(SubType.AURA, game); - } - - @Override - public String getRule() { - return "Whenever {this} enters the battlefield or enchanted creature becomes the target " + - "of an Aura spell, create a 1/1 white Spirit creature token with flying."; - } -} diff --git a/Mage.Sets/src/mage/cards/f/FugitiveDruid.java b/Mage.Sets/src/mage/cards/f/FugitiveDruid.java index aaf01e3282c..0bd4df57998 100644 --- a/Mage.Sets/src/mage/cards/f/FugitiveDruid.java +++ b/Mage.Sets/src/mage/cards/f/FugitiveDruid.java @@ -10,6 +10,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.filter.FilterSpell; +import mage.filter.predicate.other.AuraSpellPredicate; /** * @@ -20,7 +21,7 @@ public final class FugitiveDruid extends CardImpl { private static final FilterSpell filter = new FilterSpell("an Aura spell"); static { - filter.add(SubType.AURA.getPredicate()); + filter.add(AuraSpellPredicate.instance); } public FugitiveDruid(UUID ownerId, CardSetInfo setInfo) { @@ -31,7 +32,7 @@ public final class FugitiveDruid extends CardImpl { this.toughness = new MageInt(2); // Whenever Fugitive Druid becomes the target of an Aura spell, you draw a card. - this.addAbility(new BecomesTargetSourceTriggeredAbility(new DrawCardSourceControllerEffect(1), filter)); + this.addAbility(new BecomesTargetSourceTriggeredAbility(new DrawCardSourceControllerEffect(1, "you"), filter)); } private FugitiveDruid(final FugitiveDruid card) { diff --git a/Mage/src/main/java/mage/filter/predicate/other/AuraSpellPredicate.java b/Mage/src/main/java/mage/filter/predicate/other/AuraSpellPredicate.java new file mode 100644 index 00000000000..dea183699c1 --- /dev/null +++ b/Mage/src/main/java/mage/filter/predicate/other/AuraSpellPredicate.java @@ -0,0 +1,31 @@ +package mage.filter.predicate.other; + +import mage.abilities.SpellAbility; +import mage.constants.SubType; +import mage.filter.predicate.Predicate; +import mage.game.Game; +import mage.game.stack.Spell; +import mage.game.stack.StackObject; + +/** + * Needed for "becomes the target of an Aura spell" to work correctly with e.g. Disturb, Bestow + * + * @author xenohedron + */ +public enum AuraSpellPredicate implements Predicate { + instance; + + @Override + public boolean apply(StackObject input, Game game) { + if (!(input instanceof Spell)) { + return false; + } + SpellAbility spellAbility = ((Spell) input).getSpellAbility(); + return spellAbility != null && spellAbility.getCharacteristics(game).hasSubtype(SubType.AURA, game); + } + + @Override + public String toString() { + return "an Aura spell"; + } +}