From 38c71cfeedd38c8d51956316cd1109eb99686774 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Wed, 31 Jan 2024 03:49:25 +0400 Subject: [PATCH] GUI: Card Viewer - added support of xmage inner images like morph, blessing, etc (look in XMAGE set, related to #11622); --- .../deck/generator/DeckGeneratorDialog.java | 2 +- .../mage/client/deckeditor/CardSelector.java | 4 +-- .../viewer/CollectionViewerPanel.java | 2 +- .../collection/viewer/MageBook.java | 35 ++++++++++++++----- .../client/util/sets/ConstructedFormats.java | 18 ++++++++-- .../java/mage/verify/VerifyCardDataTest.java | 6 ++-- .../permanent/token/custom/XmageToken.java | 31 ++++++++++++++++ 7 files changed, 81 insertions(+), 17 deletions(-) create mode 100644 Mage/src/main/java/mage/game/permanent/token/custom/XmageToken.java diff --git a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGeneratorDialog.java b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGeneratorDialog.java index 11778ac2697..4f27cc4f1a2 100644 --- a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGeneratorDialog.java +++ b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGeneratorDialog.java @@ -92,7 +92,7 @@ public class DeckGeneratorDialog { c.weightx = 0.80; mainPanel.add(setPanel, c); - cbSets = new JComboBox<>(ConstructedFormats.getTypes()); + cbSets = new JComboBox<>(ConstructedFormats.getTypes(false).toArray()); cbSets.setSelectedIndex(0); cbSets.setAlignmentX(0.0F); setPanel.add(cbSets); diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java index 4f820a1fedd..fe1b569879b 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java @@ -76,7 +76,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene // prepare search dialog with checkboxes listCodeSelected = new CheckBoxList(); List checkboxes = new ArrayList<>(); - for (String item : ConstructedFormats.getTypes()) { + for (String item : ConstructedFormats.getTypes(false)) { if (!item.equals(ConstructedFormats.ALL_SETS)) { checkboxes.add(item); } @@ -540,7 +540,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene } private void reloadSetsCombobox() { - DefaultComboBoxModel model = new DefaultComboBoxModel<>(ConstructedFormats.getTypes()); + DefaultComboBoxModel model = new DefaultComboBoxModel<>(ConstructedFormats.getTypes(false).toArray()); cbExpansionSet.setModel(model); } diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/CollectionViewerPanel.java b/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/CollectionViewerPanel.java index 07706b5d756..9f2bfb8e0c9 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/CollectionViewerPanel.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/CollectionViewerPanel.java @@ -44,7 +44,7 @@ public final class CollectionViewerPanel extends JPanel { } private void reloadFormatCombobox() { - DefaultComboBoxModel model = new DefaultComboBoxModel<>(ConstructedFormats.getTypes()); + DefaultComboBoxModel model = new DefaultComboBoxModel<>(ConstructedFormats.getTypes(true).toArray()); formats.setModel(model); formats.setSelectedItem(ConstructedFormats.getDefault()); } diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java b/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java index b23c735486a..cdf68fb97b1 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java @@ -26,6 +26,7 @@ import mage.cards.RateCard; import mage.game.permanent.PermanentToken; import mage.game.permanent.token.Token; import mage.game.permanent.token.TokenImpl; +import mage.game.permanent.token.custom.XmageToken; import mage.view.*; import org.apache.log4j.Logger; import org.mage.card.arcane.ManaSymbols; @@ -230,13 +231,22 @@ public class MageBook extends JComponent { public List loadTokens() { List res = new ArrayList<>(); - // tokens - List allTokens = TokenRepository.instance.getByType(TokenType.TOKEN) - .stream() - .filter(token -> token.getSetCode().equals(currentSet)) - .collect(Collectors.toList()); + // tokens (official and xmage's inner) + List allTokens = new ArrayList<>(TokenRepository.instance.getByType(TokenType.TOKEN)); + allTokens.addAll(TokenRepository.instance.getByType(TokenType.XMAGE)); + allTokens.removeIf(token -> !token.getSetCode().equals(currentSet)); allTokens.forEach(token -> { - TokenImpl newToken = TokenImpl.createTokenByClassName(token.getFullClassFileName()); + TokenImpl newToken; + switch (token.getTokenType()) { + case XMAGE: + newToken = new XmageToken(token.getName()); + break; + + case TOKEN: + default: + newToken = TokenImpl.createTokenByClassName(token.getFullClassFileName()); + break; + } if (newToken != null) { newToken.setExpansionSetCode(currentSet); newToken.setImageNumber(token.getImageNumber()); @@ -456,15 +466,22 @@ public class MageBook extends JComponent { private void updateCardStats(String setCode, boolean isCardsShow) { // sets do not have total cards number, it's a workaround + // inner set + if (setCode.equals(TokenRepository.XMAGE_TOKENS_SET_CODE)) { + setCaption.setText("Inner Xmage images"); + setInfo.setText(""); + return; + }; + + // normal set ExpansionSet set = Sets.findSet(setCode); - if (set != null) { - setCaption.setText(set.getCode() + " - " + set.getName()); - } else { + if (set == null) { setCaption.setText("ERROR"); setInfo.setText("ERROR"); return; } + setCaption.setText(set.getCode() + " - " + set.getName()); if (!isCardsShow) { // tokens or emblems, stats not need setInfo.setText(""); diff --git a/Mage.Client/src/main/java/mage/client/util/sets/ConstructedFormats.java b/Mage.Client/src/main/java/mage/client/util/sets/ConstructedFormats.java index 3898135dc6e..db958f3148f 100644 --- a/Mage.Client/src/main/java/mage/client/util/sets/ConstructedFormats.java +++ b/Mage.Client/src/main/java/mage/client/util/sets/ConstructedFormats.java @@ -3,6 +3,7 @@ package mage.client.util.sets; import mage.cards.repository.ExpansionInfo; import mage.cards.repository.ExpansionRepository; import mage.cards.repository.RepositoryEvent; +import mage.cards.repository.TokenRepository; import mage.constants.SetType; import mage.deck.Standard; import mage.game.events.Listener; @@ -27,6 +28,7 @@ public final class ConstructedFormats { public static final String HISTORIC = "- Historic"; public static final String JOKE = "- Joke Sets"; public static final String CUSTOM = "- Custom"; + public static final String XMAGE_SETS = "- XMAGE"; // inner sets like XMAGE (special tokens) public static final Standard STANDARD_CARDS = new Standard(); // Attention -Month is 0 Based so Feb = 1 for example. // @@ -62,8 +64,15 @@ public final class ConstructedFormats { private ConstructedFormats() { } - public static String[] getTypes() { - return formats.toArray(new String[0]); + /** + * @param includeInnerSets add XMAGE set with inner cards/tokens like morph + */ + public static List getTypes(boolean includeInnerSets) { + List res = new ArrayList<>(formats); + if (!includeInnerSets) { + res.removeIf(s -> s.equals(XMAGE_SETS)); + } + return res; } public static String getDefault() { @@ -95,6 +104,7 @@ public final class ConstructedFormats { underlyingSetCodesPerFormat.put(HISTORIC, new ArrayList<>()); underlyingSetCodesPerFormat.put(JOKE, new ArrayList<>()); underlyingSetCodesPerFormat.put(CUSTOM, new ArrayList<>()); + underlyingSetCodesPerFormat.put(XMAGE_SETS, new ArrayList<>()); final Map expansionInfo = new HashMap<>(); formats.clear(); // prevent NPE on sorting if this is not the first try @@ -104,6 +114,9 @@ public final class ConstructedFormats { return; } + // inner sets + underlyingSetCodesPerFormat.get(XMAGE_SETS).add(TokenRepository.XMAGE_TOKENS_SET_CODE); + // build formats list for deck validators for (ExpansionInfo set : ExpansionRepository.instance.getAll()) { expansionInfo.put(set.getName(), set); @@ -266,6 +279,7 @@ public final class ConstructedFormats { }); if (!formats.isEmpty()) { + formats.add(0, XMAGE_SETS); formats.add(0, CUSTOM); formats.add(0, JOKE); formats.add(0, HISTORIC); diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index 8e3f79ab4bc..aed4188e87b 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -38,6 +38,7 @@ import mage.game.draft.DraftCube; import mage.game.permanent.token.Token; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.custom.CreatureToken; +import mage.game.permanent.token.custom.XmageToken; import mage.sets.TherosBeyondDeath; import mage.target.targetpointer.TargetPointer; import mage.util.CardUtil; @@ -1315,7 +1316,7 @@ public class VerifyCardDataTest { // - fix error in token's constructor errorsList.add("Error: token must have default constructor with zero params: " + tokenClass.getName()); } else if (tokDataNamesIndex.getOrDefault(token.getName().replace(" Token", ""), "").isEmpty()) { - if (token instanceof CreatureToken) { + if (token instanceof CreatureToken || token instanceof XmageToken) { // ignore custom token builders continue; } @@ -1340,7 +1341,8 @@ public class VerifyCardDataTest { // CHECK: tokens must have Token word in the name if (token.getDescription().startsWith(token.getName() + ", ") || token.getDescription().contains("named " + token.getName()) - || (token instanceof CreatureToken)) { + || (token instanceof CreatureToken) + || (token instanceof XmageToken)) { // ignore some names: // - Boo, a legendary 1/1 red Hamster creature token with trample and haste // - 1/1 green Insect creature token with flying named Butterfly diff --git a/Mage/src/main/java/mage/game/permanent/token/custom/XmageToken.java b/Mage/src/main/java/mage/game/permanent/token/custom/XmageToken.java new file mode 100644 index 00000000000..3c3e11149c4 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/custom/XmageToken.java @@ -0,0 +1,31 @@ +package mage.game.permanent.token.custom; + +import mage.abilities.Ability; +import mage.cards.FrameStyle; +import mage.game.permanent.token.TokenImpl; + +/** + * GUI: inner xmage token object to show custom images (information tokens like morph, blessing, etc) + * + * @author JayDi85 + */ +public final class XmageToken extends TokenImpl { + + public XmageToken(String name) { + super(name, ""); + this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC; // use full art for better visual in card viewer + } + + public XmageToken withAbility(Ability ability) { + this.addAbility(ability); + return this; + } + + private XmageToken(final XmageToken token) { + super(token); + } + + public XmageToken copy() { + return new XmageToken(this); + } +}