- Restructured and improved performance of getExternalZoneActivationCards.

This commit is contained in:
Sloth
2012-02-04 10:25:03 +00:00
parent 52cf5089c8
commit 20b7ef075e

View File

@@ -2409,7 +2409,7 @@ public class CardFactoryUtil {
/** /**
* <p> * <p>
* getGraveyardActivationCards. * getExternalZoneActivationCards.
* </p> * </p>
* *
* @param player * @param player
@@ -2417,62 +2417,60 @@ public class CardFactoryUtil {
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public static CardList getExternalZoneActivationCards(final Player player) { public static CardList getExternalZoneActivationCards(final Player player) {
CardList cl = new CardList();
cl.addAll(getActivateablesFromZone(player.getZone(Constant.Zone.Graveyard), player));
cl.addAll(getActivateablesFromZone(player.getZone(Constant.Zone.Exile), player));
cl.addAll(getActivateablesFromZone(player.getZone(Constant.Zone.Library), player));
cl.addAll(getActivateablesFromZone(player.getZone(Constant.Zone.Command), player));
final List<Zone> sb = new ArrayList<Constant.Zone>(3);
sb.add(Constant.Zone.Graveyard);
sb.add(Constant.Zone.Exile);
sb.add(Constant.Zone.Library);
sb.add(Constant.Zone.Command);
CardList cl = player.getCardsIn(sb);
cl.addAll(AllZone.getStackZone().getCards());
cl = cl.filter(new CardListFilter() {
@Override
public boolean addCard(final Card c) {
return CardFactoryUtil.activateFromExternalZones(c, player);
}
});
return cl; return cl;
} }
/** /**
* <p> * <p>
* activateFromGrave. * getActivateablesFromZone.
* </p> * </p>
* *
* @param c * @param zone
* a {@link forge.Card} object. * a PlayerZone object.
* @param player * @param player
* a {@link forge.Player} object. * a {@link forge.Player} object.
* @return a boolean. * @return a boolean.
*/ */
public static boolean activateFromExternalZones(final Card c, final Player player) { public static CardList getActivateablesFromZone(final PlayerZone zone, final Player player) {
final PlayerZone zone = AllZone.getZoneOf(c);
if (zone.is(Constant.Zone.Graveyard)) { CardList cl = new CardList(zone.getCards());
if (c.hasUnearth()) {
return true; cl = cl.filter(new CardListFilter() {
@Override
public boolean addCard(final Card c) {
if (zone.is(Constant.Zone.Graveyard)) {
if (c.hasUnearth()) {
return true;
}
}
if (c.isLand() && c.hasKeyword("May be played")) {
return true;
}
for (final SpellAbility sa : c.getSpellAbility()) {
final Zone restrictZone = sa.getRestrictions().getZone();
if (zone.is(restrictZone)) {
return true;
}
if (sa.isSpell()
&& (c.hasKeyword("May be played") || (c.hasStartOfKeyword("Flashback") && zone
.is(Zone.Graveyard))) && restrictZone.equals(Zone.Hand)) {
return true;
}
}
return false;
} }
});
} return cl;
if (c.isLand() && !zone.is(Constant.Zone.Battlefield) && c.hasKeyword("May be played")) {
return true;
}
for (final SpellAbility sa : c.getSpellAbility()) {
final Zone restrictZone = sa.getRestrictions().getZone();
if (zone.is(restrictZone)) {
return true;
}
if (sa.isSpell()
&& !zone.is(Zone.Battlefield)
&& (c.hasKeyword("May be played") || (c.hasStartOfKeyword("Flashback") && zone
.is(Zone.Graveyard))) && restrictZone.equals(Zone.Hand)) {
return true;
}
}
return false;
} }
/** /**