from list to set

This commit is contained in:
Anthony Calosa
2024-11-14 06:00:02 +08:00
parent 85913a3d6c
commit 71ecf91bb5
12 changed files with 45 additions and 34 deletions

View File

@@ -28,6 +28,7 @@ import forge.deck.generation.IDeckGenPool;
import forge.item.IPaperCard; import forge.item.IPaperCard;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.util.CollectionSuppliers; import forge.util.CollectionSuppliers;
import forge.util.CollectionUtil;
import forge.util.Lang; import forge.util.Lang;
import forge.util.TextUtil; import forge.util.TextUtil;
import forge.util.lang.LangEnglish; import forge.util.lang.LangEnglish;
@@ -91,13 +92,13 @@ public final class CardDb implements ICardDatabase, IDeckGenPool {
public int artIndex; public int artIndex;
public boolean isFoil; public boolean isFoil;
public String collectorNumber; public String collectorNumber;
public List<String> colorID; public Set<String> colorID;
private CardRequest(String name, String edition, int artIndex, boolean isFoil, String collectorNumber) { private CardRequest(String name, String edition, int artIndex, boolean isFoil, String collectorNumber) {
this(name, edition, artIndex, isFoil, collectorNumber, null); this(name, edition, artIndex, isFoil, collectorNumber, null);
} }
private CardRequest(String name, String edition, int artIndex, boolean isFoil, String collectorNumber, List<String> colorID) { private CardRequest(String name, String edition, int artIndex, boolean isFoil, String collectorNumber, Set<String> colorID) {
cardName = name; cardName = name;
this.edition = edition; this.edition = edition;
this.artIndex = artIndex; this.artIndex = artIndex;
@@ -132,7 +133,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool {
return requestInfo + NameSetSeparator + artIndex; return requestInfo + NameSetSeparator + artIndex;
} }
public static String compose(String cardName, String setCode, int artIndex, List<String> colorID) { public static String compose(String cardName, String setCode, int artIndex, Set<String> colorID) {
String requestInfo = compose(cardName, setCode); String requestInfo = compose(cardName, setCode);
artIndex = Math.max(artIndex, IPaperCard.DEFAULT_ART_INDEX); artIndex = Math.max(artIndex, IPaperCard.DEFAULT_ART_INDEX);
String cid = colorID == null ? "" : NameSetSeparator + String cid = colorID == null ? "" : NameSetSeparator +
@@ -235,7 +236,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool {
int artIndex = artPos > 0 ? Integer.parseInt(info[artPos]) : IPaperCard.NO_ART_INDEX; // default: no art index int artIndex = artPos > 0 ? Integer.parseInt(info[artPos]) : IPaperCard.NO_ART_INDEX; // default: no art index
String collectorNumber = cNrPos > 0 ? info[cNrPos].substring(1, info[cNrPos].length() - 1) : IPaperCard.NO_COLLECTOR_NUMBER; String collectorNumber = cNrPos > 0 ? info[cNrPos].substring(1, info[cNrPos].length() - 1) : IPaperCard.NO_COLLECTOR_NUMBER;
String setCode = setPos > 0 ? info[setPos] : null; String setCode = setPos > 0 ? info[setPos] : null;
List<String> colorID = clrPos > 0 ? Arrays.stream(info[clrPos].substring(1).split(colorIDPrefix)).collect(Collectors.toList()) : null; Set<String> colorID = clrPos > 0 ? Arrays.stream(info[clrPos].substring(1).split(colorIDPrefix)).collect(Collectors.toSet()) : null;
if (setCode != null && setCode.equals(CardEdition.UNKNOWN.getCode())) { // ??? if (setCode != null && setCode.equals(CardEdition.UNKNOWN.getCode())) { // ???
setCode = null; setCode = null;
} }
@@ -597,7 +598,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool {
} }
@Override @Override
public PaperCard getCard(final String cardName, String setCode, int artIndex, List<String> colorID) { public PaperCard getCard(final String cardName, String setCode, int artIndex, Set<String> colorID) {
String reqInfo = CardRequest.compose(cardName, setCode, artIndex, colorID); String reqInfo = CardRequest.compose(cardName, setCode, artIndex, colorID);
CardRequest request = CardRequest.fromString(reqInfo); CardRequest request = CardRequest.fromString(reqInfo);
return tryGetCard(request); return tryGetCard(request);
@@ -663,7 +664,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool {
} }
@Override @Override
public PaperCard getCardFromSet(String cardName, CardEdition edition, int artIndex, String collectorNumber, boolean isFoil, List<String> colorID) { public PaperCard getCardFromSet(String cardName, CardEdition edition, int artIndex, String collectorNumber, boolean isFoil, Set<String> colorID) {
if (edition == null || cardName == null) // preview cards if (edition == null || cardName == null) // preview cards
return null; // No cards will be returned return null; // No cards will be returned
@@ -741,7 +742,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool {
} }
@Override @Override
public PaperCard getCardFromEditions(final String cardInfo, final CardArtPreference artPreference, int artIndex, List<String> colorID) { public PaperCard getCardFromEditions(final String cardInfo, final CardArtPreference artPreference, int artIndex, Set<String> colorID) {
return this.tryToGetCardFromEditions(cardInfo, artPreference, artIndex, null, false, null, colorID); return this.tryToGetCardFromEditions(cardInfo, artPreference, artIndex, null, false, null, colorID);
} }
@@ -823,7 +824,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool {
} }
private PaperCard tryToGetCardFromEditions(String cardInfo, CardArtPreference artPreference, int artIndex, private PaperCard tryToGetCardFromEditions(String cardInfo, CardArtPreference artPreference, int artIndex,
Date releaseDate, boolean releasedBeforeFlag, Predicate<PaperCard> filter, List<String> colorID){ Date releaseDate, boolean releasedBeforeFlag, Predicate<PaperCard> filter, Set<String> colorID){
if (cardInfo == null) if (cardInfo == null)
return null; return null;
final CardRequest cr = CardRequest.fromString(cardInfo); final CardRequest cr = CardRequest.fromString(cardInfo);
@@ -891,7 +892,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool {
if (acceptedEditions.size() > 1) { if (acceptedEditions.size() > 1) {
Collections.sort(acceptedEditions); // CardEdition correctly sort by (release) date Collections.sort(acceptedEditions); // CardEdition correctly sort by (release) date
if (artPref.latestFirst) if (artPref.latestFirst)
Collections.reverse(acceptedEditions); // newest editions first CollectionUtil.reverse(acceptedEditions); // newest editions first
} }
final Iterator<CardEdition> editionIterator = acceptedEditions.iterator(); final Iterator<CardEdition> editionIterator = acceptedEditions.iterator();

View File

@@ -7,6 +7,7 @@ import forge.item.PaperCard;
import java.util.Collection; import java.util.Collection;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Set;
public interface ICardDatabase extends Iterable<PaperCard> { public interface ICardDatabase extends Iterable<PaperCard> {
/** /**
@@ -50,21 +51,21 @@ public interface ICardDatabase extends Iterable<PaperCard> {
// [NEW Methods] Including the card CollectorNumber as criterion for DB lookup // [NEW Methods] Including the card CollectorNumber as criterion for DB lookup
PaperCard getCard(String cardName, String edition, String collectorNumber); PaperCard getCard(String cardName, String edition, String collectorNumber);
PaperCard getCard(String cardName, String edition, int artIndex, String collectorNumber); PaperCard getCard(String cardName, String edition, int artIndex, String collectorNumber);
PaperCard getCard(String cardName, String edition, int artIndex, List<String> colorID); PaperCard getCard(String cardName, String edition, int artIndex, Set<String> colorID);
// 2. Card Lookup from a single Expansion Set // 2. Card Lookup from a single Expansion Set
PaperCard getCardFromSet(String cardName, CardEdition edition, boolean isFoil); // NOT yet used, included for API symmetry PaperCard getCardFromSet(String cardName, CardEdition edition, boolean isFoil); // NOT yet used, included for API symmetry
PaperCard getCardFromSet(String cardName, CardEdition edition, String collectorNumber, boolean isFoil); PaperCard getCardFromSet(String cardName, CardEdition edition, String collectorNumber, boolean isFoil);
PaperCard getCardFromSet(String cardName, CardEdition edition, int artIndex, boolean isFoil); PaperCard getCardFromSet(String cardName, CardEdition edition, int artIndex, boolean isFoil);
PaperCard getCardFromSet(String cardName, CardEdition edition, int artIndex, String collectorNumber, boolean isFoil); PaperCard getCardFromSet(String cardName, CardEdition edition, int artIndex, String collectorNumber, boolean isFoil);
PaperCard getCardFromSet(String cardName, CardEdition edition, int artIndex, String collectorNumber, boolean isFoil, List<String> colorID); PaperCard getCardFromSet(String cardName, CardEdition edition, int artIndex, String collectorNumber, boolean isFoil, Set<String> colorID);
// 3. Card lookup based on CardArtPreference Selection Policy // 3. Card lookup based on CardArtPreference Selection Policy
PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference); PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference);
PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, Predicate<PaperCard> filter); PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, Predicate<PaperCard> filter);
PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, int artIndex); PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, int artIndex);
PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, int artIndex, Predicate<PaperCard> filter); PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, int artIndex, Predicate<PaperCard> filter);
PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, int artIndex, List<String> colorID); PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, int artIndex, Set<String> colorID);
// 4. Specialised Card Lookup on CardArtPreference Selection and Release Date // 4. Specialised Card Lookup on CardArtPreference Selection and Release Date
PaperCard getCardFromEditionsReleasedBefore(String cardName, CardArtPreference artPreference, Date releaseDate); PaperCard getCardFromEditionsReleasedBefore(String cardName, CardArtPreference artPreference, Date releaseDate);

View File

@@ -72,7 +72,7 @@ public class CardPool extends ItemPool<PaperCard> {
public void add(String cardName, String setCode, int artIndex, final int amount) { public void add(String cardName, String setCode, int artIndex, final int amount) {
this.add(cardName, setCode, artIndex, amount, false, null); this.add(cardName, setCode, artIndex, amount, false, null);
} }
public void add(String cardName, String setCode, int artIndex, final int amount, boolean addAny, List<String> colorID) { public void add(String cardName, String setCode, int artIndex, final int amount, boolean addAny, Set<String> colorID) {
Map<String, CardDb> dbs = StaticData.instance().getAvailableDatabases(); Map<String, CardDb> dbs = StaticData.instance().getAvailableDatabases();
PaperCard paperCard = null; PaperCard paperCard = null;
String selectedDbName = ""; String selectedDbName = "";

View File

@@ -234,7 +234,7 @@ public interface IPaperCard extends InventoryItem, Serializable {
String getEdition(); String getEdition();
String getCollectorNumber(); String getCollectorNumber();
String getFunctionalVariant(); String getFunctionalVariant();
List<String> getColorID(); Set<String> getColorID();
int getArtIndex(); int getArtIndex();
boolean isFoil(); boolean isFoil();
boolean isToken(); boolean isToken();

View File

@@ -29,6 +29,8 @@ import org.apache.commons.lang3.StringUtils;
import java.io.IOException; import java.io.IOException;
import java.io.ObjectInputStream; import java.io.ObjectInputStream;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.Set;
/** /**
* A lightweight version of a card that matches real-world cards, to use outside of games (eg. inventory, decks, trade). * A lightweight version of a card that matches real-world cards, to use outside of games (eg. inventory, decks, trade).
@@ -56,7 +58,7 @@ public class PaperCard implements Comparable<IPaperCard>, InventoryItemFromSet,
private final boolean foil; private final boolean foil;
private Boolean hasImage; private Boolean hasImage;
private final boolean noSell; private final boolean noSell;
private List<String> colorID; private Set<String> colorID;
private String sortableName; private String sortableName;
private final String functionalVariant; private final String functionalVariant;
@@ -88,7 +90,7 @@ public class PaperCard implements Comparable<IPaperCard>, InventoryItemFromSet,
} }
@Override @Override
public List<String> getColorID() { public Set<String> getColorID() {
return colorID; return colorID;
} }
@@ -163,7 +165,7 @@ public class PaperCard implements Comparable<IPaperCard>, InventoryItemFromSet,
this.artIndex, this.foil, String.valueOf(collectorNumber), this.artist, this.functionalVariant, false); this.artIndex, this.foil, String.valueOf(collectorNumber), this.artist, this.functionalVariant, false);
return sellable; return sellable;
} }
public PaperCard getSpireVersion(List<String> colors) { public PaperCard getSpireVersion(Set<String> colors) {
return new PaperCard(this.rules, this.edition, this.rarity, return new PaperCard(this.rules, this.edition, this.rarity,
this.artIndex, this.foil, String.valueOf(collectorNumber), this.artist, this.functionalVariant, false, colors); this.artIndex, this.foil, String.valueOf(collectorNumber), this.artist, this.functionalVariant, false, colors);
} }
@@ -205,7 +207,7 @@ public class PaperCard implements Comparable<IPaperCard>, InventoryItemFromSet,
public PaperCard(final CardRules rules0, final String edition0, final CardRarity rarity0, public PaperCard(final CardRules rules0, final String edition0, final CardRarity rarity0,
final int artIndex0, final boolean foil0, final String collectorNumber0, final int artIndex0, final boolean foil0, final String collectorNumber0,
final String artist0, final String functionalVariant, final boolean noSell0, final List<String> spires) { final String artist0, final String functionalVariant, final boolean noSell0, final Set<String> colorID0) {
if (rules0 == null || edition0 == null || rarity0 == null) { if (rules0 == null || edition0 == null || rarity0 == null) {
throw new IllegalArgumentException("Cannot create card without rules, edition or rarity"); throw new IllegalArgumentException("Cannot create card without rules, edition or rarity");
} }
@@ -222,7 +224,7 @@ public class PaperCard implements Comparable<IPaperCard>, InventoryItemFromSet,
sortableName = TextUtil.toSortableName(CardTranslation.getTranslatedName(rules0.getName())); sortableName = TextUtil.toSortableName(CardTranslation.getTranslatedName(rules0.getName()));
this.functionalVariant = functionalVariant != null ? functionalVariant : IPaperCard.NO_FUNCTIONAL_VARIANT; this.functionalVariant = functionalVariant != null ? functionalVariant : IPaperCard.NO_FUNCTIONAL_VARIANT;
noSell = noSell0; noSell = noSell0;
colorID = spires; colorID = colorID0;
} }
public static PaperCard FAKE_CARD = new PaperCard(CardRules.getUnsupportedCardNamed("Fake Card"), "Fake Edition", CardRarity.Common); public static PaperCard FAKE_CARD = new PaperCard(CardRules.getUnsupportedCardNamed("Fake Card"), "Fake Edition", CardRarity.Common);
@@ -249,6 +251,9 @@ public class PaperCard implements Comparable<IPaperCard>, InventoryItemFromSet,
} }
if (!getCollectorNumber().equals(other.getCollectorNumber())) if (!getCollectorNumber().equals(other.getCollectorNumber()))
return false; return false;
// colorID can be NULL
if (getColorID() != other.getColorID())
return false;
return (other.foil == foil) && (other.artIndex == artIndex); return (other.foil == foil) && (other.artIndex == artIndex);
} }
@@ -261,7 +266,7 @@ public class PaperCard implements Comparable<IPaperCard>, InventoryItemFromSet,
public int hashCode() { public int hashCode() {
final int code = (name.hashCode() * 11) + (edition.hashCode() * 59) + final int code = (name.hashCode() * 11) + (edition.hashCode() * 59) +
(artIndex * 2) + (getCollectorNumber().hashCode() * 383); (artIndex * 2) + (getCollectorNumber().hashCode() * 383);
final int id = colorID == null ? 0 : colorID.hashCode(); final int id = Optional.ofNullable(colorID).map(Set::hashCode).orElse(0);
if (foil) { if (foil) {
return code + id + 1; return code + id + 1;
} }

View File

@@ -3,6 +3,7 @@ package forge.item;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Set;
import forge.card.*; import forge.card.*;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@@ -154,7 +155,7 @@ public class PaperToken implements InventoryItemFromSet, IPaperCard {
} }
@Override @Override
public List<String> getColorID() { public Set<String> getColorID() {
return null; return null;
} }

View File

@@ -573,7 +573,7 @@ public class GameAction {
} }
if (c.hasChosenColorSpire()) { if (c.hasChosenColorSpire()) {
copied.setChosenColorID(ImmutableList.copyOf(c.getChosenColorID())); copied.setChosenColorID(ImmutableSet.copyOf(c.getChosenColorID()));
} }
// update state for view // update state for view
@@ -2236,7 +2236,7 @@ public class GameAction {
Localizer.getInstance().getMessage("lblChooseNColors", Lang.getNumeral(2)); Localizer.getInstance().getMessage("lblChooseNColors", Lang.getNumeral(2));
SpellAbility sa = new SpellAbility.EmptySa(ApiType.ChooseColor, c, takesAction); SpellAbility sa = new SpellAbility.EmptySa(ApiType.ChooseColor, c, takesAction);
sa.putParam("AILogic", "MostProminentInComputerDeck"); sa.putParam("AILogic", "MostProminentInComputerDeck");
List<String> chosenColors = takesAction.getController().chooseColors(prompt, sa, 2, 2, colorChoices); Set<String> chosenColors = new HashSet<>(takesAction.getController().chooseColors(prompt, sa, 2, 2, colorChoices));
c.setChosenColorID(chosenColors); c.setChosenColorID(chosenColors);
} }
} }

View File

@@ -293,7 +293,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
private String chosenType2 = ""; private String chosenType2 = "";
private List<String> notedTypes = new ArrayList<>(); private List<String> notedTypes = new ArrayList<>();
private List<String> chosenColors; private List<String> chosenColors;
private List<String> chosenColorID; private Set<String> chosenColorID;
private List<String> chosenName = new ArrayList<>(); private List<String> chosenName = new ArrayList<>();
private Integer chosenNumber; private Integer chosenNumber;
private Player chosenPlayer; private Player chosenPlayer;
@@ -2121,13 +2121,13 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
public boolean hasChosenColor(String s) { public boolean hasChosenColor(String s) {
return chosenColors != null && chosenColors.contains(s); return chosenColors != null && chosenColors.contains(s);
} }
public final List<String> getChosenColorID() { public final Set<String> getChosenColorID() {
if (chosenColorID == null) { if (chosenColorID == null) {
return Lists.newArrayList(); return Sets.newHashSet();
} }
return chosenColorID; return chosenColorID;
} }
public final void setChosenColorID(final List<String> s) { public final void setChosenColorID(final Set<String> s) {
chosenColorID = s; chosenColorID = s;
view.updateChosenColorID(this); view.updateChosenColorID(this);
} }

View File

@@ -433,7 +433,7 @@ public class CardView extends GameEntityView {
void updateChosenColors(Card c) { void updateChosenColors(Card c) {
set(TrackableProperty.ChosenColors, c.getChosenColors()); set(TrackableProperty.ChosenColors, c.getChosenColors());
} }
public List<String> getChosenColorID() { public Set<String> getChosenColorID() {
return get(TrackableProperty.ChosenColorID); return get(TrackableProperty.ChosenColorID);
} }
void updateChosenColorID(Card c) { void updateChosenColorID(Card c) {

View File

@@ -67,7 +67,7 @@ public enum TrackableProperty {
ChosenType2(TrackableTypes.StringType), ChosenType2(TrackableTypes.StringType),
NotedTypes(TrackableTypes.StringListType), NotedTypes(TrackableTypes.StringListType),
ChosenColors(TrackableTypes.StringListType), ChosenColors(TrackableTypes.StringListType),
ChosenColorID(TrackableTypes.StringListType), ChosenColorID(TrackableTypes.StringSetType),
ChosenCards(TrackableTypes.CardViewCollectionType), ChosenCards(TrackableTypes.CardViewCollectionType),
ChosenNumber(TrackableTypes.StringType), ChosenNumber(TrackableTypes.StringType),
StoredRolls(TrackableTypes.StringListType), StoredRolls(TrackableTypes.StringListType),

View File

@@ -20,8 +20,11 @@ package forge.screens.deckeditor.controllers;
import java.awt.Toolkit; import java.awt.Toolkit;
import java.awt.event.InputEvent; import java.awt.event.InputEvent;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set;
import java.util.stream.Collectors;
import javax.swing.JMenu; import javax.swing.JMenu;
import javax.swing.JPopupMenu; import javax.swing.JPopupMenu;
@@ -586,7 +589,7 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
return; return;
GuiUtils.addMenuItem(menu, label, null, () -> { GuiUtils.addMenuItem(menu, label, null, () -> {
List<String> colors = GuiChoose.getChoices(localizer.getMessage("lblChooseNColors", Lang.getNumeral(2)), 2, 2, MagicColor.Constant.ONLY_COLORS); Set<String> colors = new HashSet<>(GuiChoose.getChoices(localizer.getMessage("lblChooseNColors", Lang.getNumeral(2)), 2, 2, MagicColor.Constant.ONLY_COLORS));
// make an updated version // make an updated version
PaperCard updated = existingCard.getSpireVersion(colors); PaperCard updated = existingCard.getSpireVersion(colors);
// remove *quantity* instances of existing card // remove *quantity* instances of existing card

View File

@@ -1845,11 +1845,11 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
if ("Cryptic Spires".equalsIgnoreCase(card.getCardName())) { if ("Cryptic Spires".equalsIgnoreCase(card.getCardName())) {
menu.addItem(new FMenuItem(Forge.getLocalizer().getMessage("lblColorIdentity"), Forge.hdbuttons ? FSkinImage.HDPREFERENCE : FSkinImage.SETTINGS, e -> { menu.addItem(new FMenuItem(Forge.getLocalizer().getMessage("lblColorIdentity"), Forge.hdbuttons ? FSkinImage.HDPREFERENCE : FSkinImage.SETTINGS, e -> {
//sort options so current option is on top and selected by default //sort options so current option is on top and selected by default
List<String> colorChoices = new ArrayList<>(MagicColor.Constant.ONLY_COLORS); Set<String> colorChoices = new HashSet<>(MagicColor.Constant.ONLY_COLORS);
GuiChoose.getChoices(Forge.getLocalizer().getMessage("lblChooseAColor", Lang.getNumeral(2)), 2, 2, colorChoices, new Callback<>() { GuiChoose.getChoices(Forge.getLocalizer().getMessage("lblChooseAColor", Lang.getNumeral(2)), 2, 2, colorChoices, new Callback<>() {
@Override @Override
public void run(List<String> result) { public void run(List<String> result) {
addCard(card.getSpireVersion(result)); addCard(card.getSpireVersion(new HashSet<>(result)));
removeCard(card); removeCard(card);
} }
}); });
@@ -1897,11 +1897,11 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
if ("Cryptic Spires".equalsIgnoreCase(card.getCardName())) { if ("Cryptic Spires".equalsIgnoreCase(card.getCardName())) {
menu.addItem(new FMenuItem(Forge.getLocalizer().getMessage("lblColorIdentity"), Forge.hdbuttons ? FSkinImage.HDPREFERENCE : FSkinImage.SETTINGS, e -> { menu.addItem(new FMenuItem(Forge.getLocalizer().getMessage("lblColorIdentity"), Forge.hdbuttons ? FSkinImage.HDPREFERENCE : FSkinImage.SETTINGS, e -> {
//sort options so current option is on top and selected by default //sort options so current option is on top and selected by default
List<String> colorChoices = new ArrayList<>(MagicColor.Constant.ONLY_COLORS); Set<String> colorChoices = new HashSet<>(MagicColor.Constant.ONLY_COLORS);
GuiChoose.getChoices(Forge.getLocalizer().getMessage("lblChooseAColor", Lang.getNumeral(2)), 2, 2, colorChoices, new Callback<>() { GuiChoose.getChoices(Forge.getLocalizer().getMessage("lblChooseAColor", Lang.getNumeral(2)), 2, 2, colorChoices, new Callback<>() {
@Override @Override
public void run(List<String> result) { public void run(List<String> result) {
addCard(card.getSpireVersion(result)); addCard(card.getSpireVersion(new HashSet<>(result)));
removeCard(card); removeCard(card);
} }
}); });