* Bruna, Light of Alabaster - Fixed that the check what aura could be selected was not correct (e.g. Daybreak Coronet condition) fixes #3335.

This commit is contained in:
LevelX2 2017-05-21 00:49:59 +02:00
parent ca9f596e4a
commit c26968a096

View file

@ -27,6 +27,9 @@
*/ */
package mage.cards.b; package mage.cards.b;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.AttacksOrBlocksTriggeredAbility; import mage.abilities.common.AttacksOrBlocksTriggeredAbility;
@ -42,6 +45,8 @@ import mage.constants.SuperType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.CardIdPredicate;
import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.mageobject.CardTypePredicate;
import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.filter.predicate.other.AuraCardCanAttachToPermanentId; import mage.filter.predicate.other.AuraCardCanAttachToPermanentId;
@ -53,14 +58,13 @@ import mage.target.Target;
import mage.target.TargetCard; import mage.target.TargetCard;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import java.util.UUID;
/** /**
* @author noxx * @author noxx
*/ */
public class BrunaLightOfAlabaster extends CardImpl { public class BrunaLightOfAlabaster extends CardImpl {
public BrunaLightOfAlabaster(UUID ownerId, CardSetInfo setInfo) { public BrunaLightOfAlabaster(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}{W}{U}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}{W}{U}");
addSuperType(SuperType.LEGENDARY); addSuperType(SuperType.LEGENDARY);
this.subtype.add("Angel"); this.subtype.add("Angel");
@ -103,7 +107,7 @@ class BrunaLightOfAlabasterEffect extends OneShotEffect {
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
UUID bruna = source.getSourceId(); UUID bruna = source.getSourceId();
Player player = game.getPlayer(source.getControllerId()); Player controller = game.getPlayer(source.getControllerId());
FilterPermanent filterAura = new FilterPermanent("Aura"); FilterPermanent filterAura = new FilterPermanent("Aura");
FilterCard filterAuraCard = new FilterCard("Aura card"); FilterCard filterAuraCard = new FilterCard("Aura card");
@ -115,64 +119,85 @@ class BrunaLightOfAlabasterEffect extends OneShotEffect {
filterAuraCard.add(new SubtypePredicate("Aura")); filterAuraCard.add(new SubtypePredicate("Aura"));
filterAuraCard.add(new AuraCardCanAttachToPermanentId(bruna)); filterAuraCard.add(new AuraCardCanAttachToPermanentId(bruna));
if (player == null) { if (controller == null) {
return false; return false;
} }
Permanent permanent = game.getPermanent(source.getSourceId()); Permanent sourcePermanent = game.getPermanent(source.getSourceId());
if (permanent == null) { if (sourcePermanent == null) {
return false; return false;
} }
List<Permanent> fromBattlefield = new ArrayList<>();
List<Card> fromHandGraveyard = new ArrayList<>();
int countBattlefield = game.getBattlefield().getAllActivePermanents(filterAura, game).size() - permanent.getAttachments().size(); int countBattlefield = game.getBattlefield().getAllActivePermanents(filterAura, game).size() - sourcePermanent.getAttachments().size();
while (player.canRespond() while (controller.canRespond()
&& countBattlefield > 0 && countBattlefield > 0
&& player.chooseUse(Outcome.Benefit, "Attach an Aura from the battlefield?", source, game)) { && controller.chooseUse(Outcome.Benefit, "Attach an Aura from the battlefield?", source, game)) {
Target targetAura = new TargetPermanent(filterAura); Target targetAura = new TargetPermanent(filterAura);
if (player.choose(Outcome.Benefit, targetAura, source.getSourceId(), game)) { if (controller.choose(Outcome.Benefit, targetAura, source.getSourceId(), game)) {
Permanent aura = game.getPermanent(targetAura.getFirstTarget()); Permanent aura = game.getPermanent(targetAura.getFirstTarget());
if (aura != null) { if (aura != null) {
Permanent attachedTo = game.getPermanent(aura.getAttachedTo()); Target target = aura.getSpellAbility().getTargets().get(0);
if (attachedTo != null) { if (target != null && target.canTarget(source.getSourceId(), source, game)) {
attachedTo.removeAttachment(aura.getId(), game); fromBattlefield.add(aura);
filterAura.add(Predicates.not(new CardIdPredicate(aura.getId())));
} }
permanent.addAttachment(aura.getId(), game);
} }
} }
countBattlefield = game.getBattlefield().getAllActivePermanents(filterAura, game).size() - permanent.getAttachments().size(); countBattlefield = game.getBattlefield().getAllActivePermanents(filterAura, game).size() - sourcePermanent.getAttachments().size();
} }
int countHand = player.getHand().count(filterAuraCard, game); int countHand = controller.getHand().count(filterAuraCard, game);
while (player.canRespond() while (controller.canRespond()
&& countHand > 0 && countHand > 0
&& player.chooseUse(Outcome.Benefit, "Attach an Aura from your hand?", source, game)) { && controller.chooseUse(Outcome.Benefit, "Attach an Aura from your hand?", source, game)) {
TargetCard targetAura = new TargetCard(Zone.HAND, filterAuraCard); TargetCard targetAura = new TargetCard(Zone.HAND, filterAuraCard);
if (player.choose(Outcome.Benefit, player.getHand(), targetAura, game)) { if (controller.choose(Outcome.Benefit, controller.getHand(), targetAura, game)) {
Card aura = game.getCard(targetAura.getFirstTarget()); Card aura = game.getCard(targetAura.getFirstTarget());
if (aura != null) { if (aura != null) {
game.getState().setValue("attachTo:" + aura.getId(), permanent); Target target = aura.getSpellAbility().getTargets().get(0);
aura.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), player.getId()); if (target != null && target.canTarget(source.getSourceId(), source, game)) {
permanent.addAttachment(aura.getId(), game); fromHandGraveyard.add(aura);
filterAuraCard.add(Predicates.not(new CardIdPredicate(aura.getId())));
}
} }
} }
countHand = player.getHand().count(filterAuraCard, game); countHand = controller.getHand().count(filterAuraCard, game);
} }
int countGraveyard = player.getGraveyard().count(filterAuraCard, game); int countGraveyard = controller.getGraveyard().count(filterAuraCard, game);
while (player.canRespond() while (controller.canRespond()
&& countGraveyard > 0 && countGraveyard > 0
&& player.chooseUse(Outcome.Benefit, "Attach an Aura from your graveyard?", source, game)) { && controller.chooseUse(Outcome.Benefit, "Attach an Aura from your graveyard?", source, game)) {
TargetCard targetAura = new TargetCard(Zone.GRAVEYARD, filterAuraCard); TargetCard targetAura = new TargetCard(Zone.GRAVEYARD, filterAuraCard);
if (player.choose(Outcome.Benefit, player.getGraveyard(), targetAura, game)) { if (controller.choose(Outcome.Benefit, controller.getGraveyard(), targetAura, game)) {
Card aura = game.getCard(targetAura.getFirstTarget()); Card aura = game.getCard(targetAura.getFirstTarget());
if (aura != null) { if (aura != null) {
game.getState().setValue("attachTo:" + aura.getId(), permanent); Target target = aura.getSpellAbility().getTargets().get(0);
aura.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), player.getId()); if (target != null && target.canTarget(source.getSourceId(), source, game)) {
permanent.addAttachment(aura.getId(), game); fromHandGraveyard.add(aura);
filterAuraCard.add(Predicates.not(new CardIdPredicate(aura.getId())));
}
} }
} }
countGraveyard = player.getGraveyard().count(filterAuraCard, game); countGraveyard = controller.getGraveyard().count(filterAuraCard, game);
}
// Move permanents
for (Permanent aura : fromBattlefield) {
Permanent attachedTo = game.getPermanent(aura.getAttachedTo());
if (attachedTo != null) {
attachedTo.removeAttachment(aura.getId(), game);
}
sourcePermanent.addAttachment(aura.getId(), game);
}
// Move cards
for (Card aura : fromHandGraveyard) {
if (aura != null) {
game.getState().setValue("attachTo:" + aura.getId(), sourcePermanent);
controller.moveCards(aura, Zone.BATTLEFIELD, source, game);
sourcePermanent.addAttachment(aura.getId(), game);
}
} }
return true; return true;
} }
} }