From 71ecf91bb5a74d27df41b7716b7f2daa19e00c58 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 14 Nov 2024 06:00:02 +0800 Subject: [PATCH] from list to set --- .../src/main/java/forge/card/CardDb.java | 19 ++++++++++--------- .../main/java/forge/card/ICardDatabase.java | 7 ++++--- .../src/main/java/forge/deck/CardPool.java | 2 +- .../src/main/java/forge/item/IPaperCard.java | 2 +- .../src/main/java/forge/item/PaperCard.java | 17 +++++++++++------ .../src/main/java/forge/item/PaperToken.java | 3 ++- .../src/main/java/forge/game/GameAction.java | 4 ++-- .../src/main/java/forge/game/card/Card.java | 8 ++++---- .../main/java/forge/game/card/CardView.java | 2 +- .../forge/trackable/TrackableProperty.java | 2 +- .../deckeditor/controllers/ACEditorBase.java | 5 ++++- .../src/forge/deck/FDeckEditor.java | 8 ++++---- 12 files changed, 45 insertions(+), 34 deletions(-) diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index e9e1e1890c3..4dcd013be60 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -28,6 +28,7 @@ import forge.deck.generation.IDeckGenPool; import forge.item.IPaperCard; import forge.item.PaperCard; import forge.util.CollectionSuppliers; +import forge.util.CollectionUtil; import forge.util.Lang; import forge.util.TextUtil; import forge.util.lang.LangEnglish; @@ -91,13 +92,13 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { public int artIndex; public boolean isFoil; public String collectorNumber; - public List colorID; + public Set colorID; private CardRequest(String name, String edition, int artIndex, boolean isFoil, String collectorNumber) { this(name, edition, artIndex, isFoil, collectorNumber, null); } - private CardRequest(String name, String edition, int artIndex, boolean isFoil, String collectorNumber, List colorID) { + private CardRequest(String name, String edition, int artIndex, boolean isFoil, String collectorNumber, Set colorID) { cardName = name; this.edition = edition; this.artIndex = artIndex; @@ -132,7 +133,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { return requestInfo + NameSetSeparator + artIndex; } - public static String compose(String cardName, String setCode, int artIndex, List colorID) { + public static String compose(String cardName, String setCode, int artIndex, Set colorID) { String requestInfo = compose(cardName, setCode); artIndex = Math.max(artIndex, IPaperCard.DEFAULT_ART_INDEX); 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 String collectorNumber = cNrPos > 0 ? info[cNrPos].substring(1, info[cNrPos].length() - 1) : IPaperCard.NO_COLLECTOR_NUMBER; String setCode = setPos > 0 ? info[setPos] : null; - List colorID = clrPos > 0 ? Arrays.stream(info[clrPos].substring(1).split(colorIDPrefix)).collect(Collectors.toList()) : null; + Set colorID = clrPos > 0 ? Arrays.stream(info[clrPos].substring(1).split(colorIDPrefix)).collect(Collectors.toSet()) : null; if (setCode != null && setCode.equals(CardEdition.UNKNOWN.getCode())) { // ??? setCode = null; } @@ -597,7 +598,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { } @Override - public PaperCard getCard(final String cardName, String setCode, int artIndex, List colorID) { + public PaperCard getCard(final String cardName, String setCode, int artIndex, Set colorID) { String reqInfo = CardRequest.compose(cardName, setCode, artIndex, colorID); CardRequest request = CardRequest.fromString(reqInfo); return tryGetCard(request); @@ -663,7 +664,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { } @Override - public PaperCard getCardFromSet(String cardName, CardEdition edition, int artIndex, String collectorNumber, boolean isFoil, List colorID) { + public PaperCard getCardFromSet(String cardName, CardEdition edition, int artIndex, String collectorNumber, boolean isFoil, Set colorID) { if (edition == null || cardName == null) // preview cards return null; // No cards will be returned @@ -741,7 +742,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { } @Override - public PaperCard getCardFromEditions(final String cardInfo, final CardArtPreference artPreference, int artIndex, List colorID) { + public PaperCard getCardFromEditions(final String cardInfo, final CardArtPreference artPreference, int artIndex, Set 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, - Date releaseDate, boolean releasedBeforeFlag, Predicate filter, List colorID){ + Date releaseDate, boolean releasedBeforeFlag, Predicate filter, Set colorID){ if (cardInfo == null) return null; final CardRequest cr = CardRequest.fromString(cardInfo); @@ -891,7 +892,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { if (acceptedEditions.size() > 1) { Collections.sort(acceptedEditions); // CardEdition correctly sort by (release) date if (artPref.latestFirst) - Collections.reverse(acceptedEditions); // newest editions first + CollectionUtil.reverse(acceptedEditions); // newest editions first } final Iterator editionIterator = acceptedEditions.iterator(); diff --git a/forge-core/src/main/java/forge/card/ICardDatabase.java b/forge-core/src/main/java/forge/card/ICardDatabase.java index a8165dff000..15761b234fa 100644 --- a/forge-core/src/main/java/forge/card/ICardDatabase.java +++ b/forge-core/src/main/java/forge/card/ICardDatabase.java @@ -7,6 +7,7 @@ import forge.item.PaperCard; import java.util.Collection; import java.util.Date; import java.util.List; +import java.util.Set; public interface ICardDatabase extends Iterable { /** @@ -50,21 +51,21 @@ public interface ICardDatabase extends Iterable { // [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, int artIndex, String collectorNumber); - PaperCard getCard(String cardName, String edition, int artIndex, List colorID); + PaperCard getCard(String cardName, String edition, int artIndex, Set colorID); // 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, String collectorNumber, 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, List colorID); + PaperCard getCardFromSet(String cardName, CardEdition edition, int artIndex, String collectorNumber, boolean isFoil, Set colorID); // 3. Card lookup based on CardArtPreference Selection Policy PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference); PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, Predicate filter); PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, int artIndex); PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, int artIndex, Predicate filter); - PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, int artIndex, List colorID); + PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, int artIndex, Set colorID); // 4. Specialised Card Lookup on CardArtPreference Selection and Release Date PaperCard getCardFromEditionsReleasedBefore(String cardName, CardArtPreference artPreference, Date releaseDate); diff --git a/forge-core/src/main/java/forge/deck/CardPool.java b/forge-core/src/main/java/forge/deck/CardPool.java index 6696253b2b5..5b9d3d2c98a 100644 --- a/forge-core/src/main/java/forge/deck/CardPool.java +++ b/forge-core/src/main/java/forge/deck/CardPool.java @@ -72,7 +72,7 @@ public class CardPool extends ItemPool { public void add(String cardName, String setCode, int artIndex, final int amount) { this.add(cardName, setCode, artIndex, amount, false, null); } - public void add(String cardName, String setCode, int artIndex, final int amount, boolean addAny, List colorID) { + public void add(String cardName, String setCode, int artIndex, final int amount, boolean addAny, Set colorID) { Map dbs = StaticData.instance().getAvailableDatabases(); PaperCard paperCard = null; String selectedDbName = ""; diff --git a/forge-core/src/main/java/forge/item/IPaperCard.java b/forge-core/src/main/java/forge/item/IPaperCard.java index b9694e083d2..51cf00fe92f 100644 --- a/forge-core/src/main/java/forge/item/IPaperCard.java +++ b/forge-core/src/main/java/forge/item/IPaperCard.java @@ -234,7 +234,7 @@ public interface IPaperCard extends InventoryItem, Serializable { String getEdition(); String getCollectorNumber(); String getFunctionalVariant(); - List getColorID(); + Set getColorID(); int getArtIndex(); boolean isFoil(); boolean isToken(); diff --git a/forge-core/src/main/java/forge/item/PaperCard.java b/forge-core/src/main/java/forge/item/PaperCard.java index 2da629bdc02..17cdaab38ac 100644 --- a/forge-core/src/main/java/forge/item/PaperCard.java +++ b/forge-core/src/main/java/forge/item/PaperCard.java @@ -29,6 +29,8 @@ import org.apache.commons.lang3.StringUtils; import java.io.IOException; import java.io.ObjectInputStream; 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). @@ -56,7 +58,7 @@ public class PaperCard implements Comparable, InventoryItemFromSet, private final boolean foil; private Boolean hasImage; private final boolean noSell; - private List colorID; + private Set colorID; private String sortableName; private final String functionalVariant; @@ -88,7 +90,7 @@ public class PaperCard implements Comparable, InventoryItemFromSet, } @Override - public List getColorID() { + public Set getColorID() { return colorID; } @@ -163,7 +165,7 @@ public class PaperCard implements Comparable, InventoryItemFromSet, this.artIndex, this.foil, String.valueOf(collectorNumber), this.artist, this.functionalVariant, false); return sellable; } - public PaperCard getSpireVersion(List colors) { + public PaperCard getSpireVersion(Set colors) { return new PaperCard(this.rules, this.edition, this.rarity, this.artIndex, this.foil, String.valueOf(collectorNumber), this.artist, this.functionalVariant, false, colors); } @@ -205,7 +207,7 @@ public class PaperCard implements Comparable, InventoryItemFromSet, public PaperCard(final CardRules rules0, final String edition0, final CardRarity rarity0, final int artIndex0, final boolean foil0, final String collectorNumber0, - final String artist0, final String functionalVariant, final boolean noSell0, final List spires) { + final String artist0, final String functionalVariant, final boolean noSell0, final Set colorID0) { if (rules0 == null || edition0 == null || rarity0 == null) { throw new IllegalArgumentException("Cannot create card without rules, edition or rarity"); } @@ -222,7 +224,7 @@ public class PaperCard implements Comparable, InventoryItemFromSet, sortableName = TextUtil.toSortableName(CardTranslation.getTranslatedName(rules0.getName())); this.functionalVariant = functionalVariant != null ? functionalVariant : IPaperCard.NO_FUNCTIONAL_VARIANT; noSell = noSell0; - colorID = spires; + colorID = colorID0; } public static PaperCard FAKE_CARD = new PaperCard(CardRules.getUnsupportedCardNamed("Fake Card"), "Fake Edition", CardRarity.Common); @@ -249,6 +251,9 @@ public class PaperCard implements Comparable, InventoryItemFromSet, } if (!getCollectorNumber().equals(other.getCollectorNumber())) return false; + // colorID can be NULL + if (getColorID() != other.getColorID()) + return false; return (other.foil == foil) && (other.artIndex == artIndex); } @@ -261,7 +266,7 @@ public class PaperCard implements Comparable, InventoryItemFromSet, public int hashCode() { final int code = (name.hashCode() * 11) + (edition.hashCode() * 59) + (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) { return code + id + 1; } diff --git a/forge-core/src/main/java/forge/item/PaperToken.java b/forge-core/src/main/java/forge/item/PaperToken.java index b4a2411897e..cbabd12bfa9 100644 --- a/forge-core/src/main/java/forge/item/PaperToken.java +++ b/forge-core/src/main/java/forge/item/PaperToken.java @@ -3,6 +3,7 @@ package forge.item; import java.util.ArrayList; import java.util.List; import java.util.Locale; +import java.util.Set; import forge.card.*; import org.apache.commons.lang3.StringUtils; @@ -154,7 +155,7 @@ public class PaperToken implements InventoryItemFromSet, IPaperCard { } @Override - public List getColorID() { + public Set getColorID() { return null; } diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index acab924969a..d9e52576309 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -573,7 +573,7 @@ public class GameAction { } if (c.hasChosenColorSpire()) { - copied.setChosenColorID(ImmutableList.copyOf(c.getChosenColorID())); + copied.setChosenColorID(ImmutableSet.copyOf(c.getChosenColorID())); } // update state for view @@ -2236,7 +2236,7 @@ public class GameAction { Localizer.getInstance().getMessage("lblChooseNColors", Lang.getNumeral(2)); SpellAbility sa = new SpellAbility.EmptySa(ApiType.ChooseColor, c, takesAction); sa.putParam("AILogic", "MostProminentInComputerDeck"); - List chosenColors = takesAction.getController().chooseColors(prompt, sa, 2, 2, colorChoices); + Set chosenColors = new HashSet<>(takesAction.getController().chooseColors(prompt, sa, 2, 2, colorChoices)); c.setChosenColorID(chosenColors); } } diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 45616ce4850..2d00f281ea6 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -293,7 +293,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars, ITr private String chosenType2 = ""; private List notedTypes = new ArrayList<>(); private List chosenColors; - private List chosenColorID; + private Set chosenColorID; private List chosenName = new ArrayList<>(); private Integer chosenNumber; private Player chosenPlayer; @@ -2121,13 +2121,13 @@ public class Card extends GameEntity implements Comparable, IHasSVars, ITr public boolean hasChosenColor(String s) { return chosenColors != null && chosenColors.contains(s); } - public final List getChosenColorID() { + public final Set getChosenColorID() { if (chosenColorID == null) { - return Lists.newArrayList(); + return Sets.newHashSet(); } return chosenColorID; } - public final void setChosenColorID(final List s) { + public final void setChosenColorID(final Set s) { chosenColorID = s; view.updateChosenColorID(this); } diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index 8553614719d..5ce321d5fac 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -433,7 +433,7 @@ public class CardView extends GameEntityView { void updateChosenColors(Card c) { set(TrackableProperty.ChosenColors, c.getChosenColors()); } - public List getChosenColorID() { + public Set getChosenColorID() { return get(TrackableProperty.ChosenColorID); } void updateChosenColorID(Card c) { diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index a02db4eee41..9ce53471afb 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -67,7 +67,7 @@ public enum TrackableProperty { ChosenType2(TrackableTypes.StringType), NotedTypes(TrackableTypes.StringListType), ChosenColors(TrackableTypes.StringListType), - ChosenColorID(TrackableTypes.StringListType), + ChosenColorID(TrackableTypes.StringSetType), ChosenCards(TrackableTypes.CardViewCollectionType), ChosenNumber(TrackableTypes.StringType), StoredRolls(TrackableTypes.StringListType), diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java index 4069cb2f3a8..5fc72473d1c 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java @@ -20,8 +20,11 @@ package forge.screens.deckeditor.controllers; import java.awt.Toolkit; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; +import java.util.HashSet; import java.util.List; import java.util.Map.Entry; +import java.util.Set; +import java.util.stream.Collectors; import javax.swing.JMenu; import javax.swing.JPopupMenu; @@ -586,7 +589,7 @@ public abstract class ACEditorBase { - List colors = GuiChoose.getChoices(localizer.getMessage("lblChooseNColors", Lang.getNumeral(2)), 2, 2, MagicColor.Constant.ONLY_COLORS); + Set colors = new HashSet<>(GuiChoose.getChoices(localizer.getMessage("lblChooseNColors", Lang.getNumeral(2)), 2, 2, MagicColor.Constant.ONLY_COLORS)); // make an updated version PaperCard updated = existingCard.getSpireVersion(colors); // remove *quantity* instances of existing card diff --git a/forge-gui-mobile/src/forge/deck/FDeckEditor.java b/forge-gui-mobile/src/forge/deck/FDeckEditor.java index 020c706925a..1b4c58df7b9 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckEditor.java +++ b/forge-gui-mobile/src/forge/deck/FDeckEditor.java @@ -1845,11 +1845,11 @@ public class FDeckEditor extends TabPageScreen { if ("Cryptic Spires".equalsIgnoreCase(card.getCardName())) { 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 - List colorChoices = new ArrayList<>(MagicColor.Constant.ONLY_COLORS); + Set colorChoices = new HashSet<>(MagicColor.Constant.ONLY_COLORS); GuiChoose.getChoices(Forge.getLocalizer().getMessage("lblChooseAColor", Lang.getNumeral(2)), 2, 2, colorChoices, new Callback<>() { @Override public void run(List result) { - addCard(card.getSpireVersion(result)); + addCard(card.getSpireVersion(new HashSet<>(result))); removeCard(card); } }); @@ -1897,11 +1897,11 @@ public class FDeckEditor extends TabPageScreen { if ("Cryptic Spires".equalsIgnoreCase(card.getCardName())) { 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 - List colorChoices = new ArrayList<>(MagicColor.Constant.ONLY_COLORS); + Set colorChoices = new HashSet<>(MagicColor.Constant.ONLY_COLORS); GuiChoose.getChoices(Forge.getLocalizer().getMessage("lblChooseAColor", Lang.getNumeral(2)), 2, 2, colorChoices, new Callback<>() { @Override public void run(List result) { - addCard(card.getSpireVersion(result)); + addCard(card.getSpireVersion(new HashSet<>(result))); removeCard(card); } });