mirror of
https://github.com/magefree/mage.git
synced 2025-12-20 10:40:06 -08:00
new AuraSpellPredicate for Brine Comber, Fugitive Druid (related to #11174)
This commit is contained in:
parent
48d7d07f93
commit
a7cda75b22
4 changed files with 65 additions and 115 deletions
|
|
@ -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.";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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.";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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<StackObject> {
|
||||
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";
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue