only remove duplicate cards from library

master
melvin 2013-09-12 17:31:53 +08:00
parent bcae6af1cf
commit f90188540d
1 changed files with 8 additions and 7 deletions

View File

@ -101,34 +101,35 @@ abstract class MagicTargetFilterImpl implements MagicTargetFilter<MagicTarget> {
abstract class MagicCardFilterImpl implements MagicTargetFilter<MagicCard> {
public List<MagicCard> filter(final MagicGame game, final MagicPlayer player, final MagicTargetHint targetHint) {
final List<MagicCard> targets = new ArrayList<MagicCard>();
final Set<Long> added = new HashSet<Long>();
// Cards in graveyard
if (acceptType(MagicTargetType.Graveyard)) {
add(game, player, player.getGraveyard(), targets, added);
add(game, player, player.getGraveyard(), targets, false);
}
// Cards in opponent's graveyard
if (acceptType(MagicTargetType.OpponentsGraveyard)) {
add(game, player, player.getOpponent().getGraveyard(), targets, added);
add(game, player, player.getOpponent().getGraveyard(), targets, false);
}
// Cards in hand
if (acceptType(MagicTargetType.Hand)) {
add(game, player, player.getHand(), targets, added);
add(game, player, player.getHand(), targets, false);
}
// Cards in library
if (acceptType(MagicTargetType.Library)) {
add(game, player, player.getLibrary(), targets, added);
// only consider unique cards, possible as cards in library will not be counted
add(game, player, player.getLibrary(), targets, true);
}
return targets;
}
private void add(final MagicGame game, final MagicPlayer player, final MagicCardList cards, final List<MagicCard> targets, final Set<Long> added) {
private void add(final MagicGame game, final MagicPlayer player, final MagicCardList cards, final List<MagicCard> targets, final boolean unique) {
final Set<Long> added = new HashSet<Long>();
for (final MagicCard card : cards) {
if (accept(game,player,card) && added.contains(card.getStateId()) == false) {
if (accept(game,player,card) && (unique == false || added.contains(card.getStateId()) == false)) {
targets.add(card);
added.add(card.getStateId());
}