GUI: Card Viewer - added support of xmage inner images like morph, blessing, etc (look in XMAGE set, related to #11622);

This commit is contained in:
Oleg Agafonov 2024-01-31 03:49:25 +04:00
parent f5a43d9115
commit 38c71cfeed
7 changed files with 81 additions and 17 deletions

View file

@ -92,7 +92,7 @@ public class DeckGeneratorDialog {
c.weightx = 0.80; c.weightx = 0.80;
mainPanel.add(setPanel, c); mainPanel.add(setPanel, c);
cbSets = new JComboBox<>(ConstructedFormats.getTypes()); cbSets = new JComboBox<>(ConstructedFormats.getTypes(false).toArray());
cbSets.setSelectedIndex(0); cbSets.setSelectedIndex(0);
cbSets.setAlignmentX(0.0F); cbSets.setAlignmentX(0.0F);
setPanel.add(cbSets); setPanel.add(cbSets);

View file

@ -76,7 +76,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
// prepare search dialog with checkboxes // prepare search dialog with checkboxes
listCodeSelected = new CheckBoxList(); listCodeSelected = new CheckBoxList();
List<String> checkboxes = new ArrayList<>(); List<String> checkboxes = new ArrayList<>();
for (String item : ConstructedFormats.getTypes()) { for (String item : ConstructedFormats.getTypes(false)) {
if (!item.equals(ConstructedFormats.ALL_SETS)) { if (!item.equals(ConstructedFormats.ALL_SETS)) {
checkboxes.add(item); checkboxes.add(item);
} }
@ -540,7 +540,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
} }
private void reloadSetsCombobox() { private void reloadSetsCombobox() {
DefaultComboBoxModel model = new DefaultComboBoxModel<>(ConstructedFormats.getTypes()); DefaultComboBoxModel model = new DefaultComboBoxModel<>(ConstructedFormats.getTypes(false).toArray());
cbExpansionSet.setModel(model); cbExpansionSet.setModel(model);
} }

View file

@ -44,7 +44,7 @@ public final class CollectionViewerPanel extends JPanel {
} }
private void reloadFormatCombobox() { private void reloadFormatCombobox() {
DefaultComboBoxModel model = new DefaultComboBoxModel<>(ConstructedFormats.getTypes()); DefaultComboBoxModel model = new DefaultComboBoxModel<>(ConstructedFormats.getTypes(true).toArray());
formats.setModel(model); formats.setModel(model);
formats.setSelectedItem(ConstructedFormats.getDefault()); formats.setSelectedItem(ConstructedFormats.getDefault());
} }

View file

@ -26,6 +26,7 @@ import mage.cards.RateCard;
import mage.game.permanent.PermanentToken; import mage.game.permanent.PermanentToken;
import mage.game.permanent.token.Token; import mage.game.permanent.token.Token;
import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.TokenImpl;
import mage.game.permanent.token.custom.XmageToken;
import mage.view.*; import mage.view.*;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import org.mage.card.arcane.ManaSymbols; import org.mage.card.arcane.ManaSymbols;
@ -230,13 +231,22 @@ public class MageBook extends JComponent {
public List<Object> loadTokens() { public List<Object> loadTokens() {
List<Object> res = new ArrayList<>(); List<Object> res = new ArrayList<>();
// tokens // tokens (official and xmage's inner)
List<TokenInfo> allTokens = TokenRepository.instance.getByType(TokenType.TOKEN) List<TokenInfo> allTokens = new ArrayList<>(TokenRepository.instance.getByType(TokenType.TOKEN));
.stream() allTokens.addAll(TokenRepository.instance.getByType(TokenType.XMAGE));
.filter(token -> token.getSetCode().equals(currentSet)) allTokens.removeIf(token -> !token.getSetCode().equals(currentSet));
.collect(Collectors.toList());
allTokens.forEach(token -> { 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) { if (newToken != null) {
newToken.setExpansionSetCode(currentSet); newToken.setExpansionSetCode(currentSet);
newToken.setImageNumber(token.getImageNumber()); newToken.setImageNumber(token.getImageNumber());
@ -456,15 +466,22 @@ public class MageBook extends JComponent {
private void updateCardStats(String setCode, boolean isCardsShow) { private void updateCardStats(String setCode, boolean isCardsShow) {
// sets do not have total cards number, it's a workaround // 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); ExpansionSet set = Sets.findSet(setCode);
if (set != null) { if (set == null) {
setCaption.setText(set.getCode() + " - " + set.getName());
} else {
setCaption.setText("ERROR"); setCaption.setText("ERROR");
setInfo.setText("ERROR"); setInfo.setText("ERROR");
return; return;
} }
setCaption.setText(set.getCode() + " - " + set.getName());
if (!isCardsShow) { if (!isCardsShow) {
// tokens or emblems, stats not need // tokens or emblems, stats not need
setInfo.setText(""); setInfo.setText("");

View file

@ -3,6 +3,7 @@ package mage.client.util.sets;
import mage.cards.repository.ExpansionInfo; import mage.cards.repository.ExpansionInfo;
import mage.cards.repository.ExpansionRepository; import mage.cards.repository.ExpansionRepository;
import mage.cards.repository.RepositoryEvent; import mage.cards.repository.RepositoryEvent;
import mage.cards.repository.TokenRepository;
import mage.constants.SetType; import mage.constants.SetType;
import mage.deck.Standard; import mage.deck.Standard;
import mage.game.events.Listener; import mage.game.events.Listener;
@ -27,6 +28,7 @@ public final class ConstructedFormats {
public static final String HISTORIC = "- Historic"; public static final String HISTORIC = "- Historic";
public static final String JOKE = "- Joke Sets"; public static final String JOKE = "- Joke Sets";
public static final String CUSTOM = "- Custom"; 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(); public static final Standard STANDARD_CARDS = new Standard();
// Attention -Month is 0 Based so Feb = 1 for example. // // Attention -Month is 0 Based so Feb = 1 for example. //
@ -62,8 +64,15 @@ public final class ConstructedFormats {
private 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<String> getTypes(boolean includeInnerSets) {
List<String> res = new ArrayList<>(formats);
if (!includeInnerSets) {
res.removeIf(s -> s.equals(XMAGE_SETS));
}
return res;
} }
public static String getDefault() { public static String getDefault() {
@ -95,6 +104,7 @@ public final class ConstructedFormats {
underlyingSetCodesPerFormat.put(HISTORIC, new ArrayList<>()); underlyingSetCodesPerFormat.put(HISTORIC, new ArrayList<>());
underlyingSetCodesPerFormat.put(JOKE, new ArrayList<>()); underlyingSetCodesPerFormat.put(JOKE, new ArrayList<>());
underlyingSetCodesPerFormat.put(CUSTOM, new ArrayList<>()); underlyingSetCodesPerFormat.put(CUSTOM, new ArrayList<>());
underlyingSetCodesPerFormat.put(XMAGE_SETS, new ArrayList<>());
final Map<String, ExpansionInfo> expansionInfo = new HashMap<>(); final Map<String, ExpansionInfo> expansionInfo = new HashMap<>();
formats.clear(); // prevent NPE on sorting if this is not the first try formats.clear(); // prevent NPE on sorting if this is not the first try
@ -104,6 +114,9 @@ public final class ConstructedFormats {
return; return;
} }
// inner sets
underlyingSetCodesPerFormat.get(XMAGE_SETS).add(TokenRepository.XMAGE_TOKENS_SET_CODE);
// build formats list for deck validators // build formats list for deck validators
for (ExpansionInfo set : ExpansionRepository.instance.getAll()) { for (ExpansionInfo set : ExpansionRepository.instance.getAll()) {
expansionInfo.put(set.getName(), set); expansionInfo.put(set.getName(), set);
@ -266,6 +279,7 @@ public final class ConstructedFormats {
}); });
if (!formats.isEmpty()) { if (!formats.isEmpty()) {
formats.add(0, XMAGE_SETS);
formats.add(0, CUSTOM); formats.add(0, CUSTOM);
formats.add(0, JOKE); formats.add(0, JOKE);
formats.add(0, HISTORIC); formats.add(0, HISTORIC);

View file

@ -38,6 +38,7 @@ import mage.game.draft.DraftCube;
import mage.game.permanent.token.Token; import mage.game.permanent.token.Token;
import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.TokenImpl;
import mage.game.permanent.token.custom.CreatureToken; import mage.game.permanent.token.custom.CreatureToken;
import mage.game.permanent.token.custom.XmageToken;
import mage.sets.TherosBeyondDeath; import mage.sets.TherosBeyondDeath;
import mage.target.targetpointer.TargetPointer; import mage.target.targetpointer.TargetPointer;
import mage.util.CardUtil; import mage.util.CardUtil;
@ -1315,7 +1316,7 @@ public class VerifyCardDataTest {
// - fix error in token's constructor // - fix error in token's constructor
errorsList.add("Error: token must have default constructor with zero params: " + tokenClass.getName()); errorsList.add("Error: token must have default constructor with zero params: " + tokenClass.getName());
} else if (tokDataNamesIndex.getOrDefault(token.getName().replace(" Token", ""), "").isEmpty()) { } else if (tokDataNamesIndex.getOrDefault(token.getName().replace(" Token", ""), "").isEmpty()) {
if (token instanceof CreatureToken) { if (token instanceof CreatureToken || token instanceof XmageToken) {
// ignore custom token builders // ignore custom token builders
continue; continue;
} }
@ -1340,7 +1341,8 @@ public class VerifyCardDataTest {
// CHECK: tokens must have Token word in the name // CHECK: tokens must have Token word in the name
if (token.getDescription().startsWith(token.getName() + ", ") if (token.getDescription().startsWith(token.getName() + ", ")
|| token.getDescription().contains("named " + token.getName()) || token.getDescription().contains("named " + token.getName())
|| (token instanceof CreatureToken)) { || (token instanceof CreatureToken)
|| (token instanceof XmageToken)) {
// ignore some names: // ignore some names:
// - Boo, a legendary 1/1 red Hamster creature token with trample and haste // - Boo, a legendary 1/1 red Hamster creature token with trample and haste
// - 1/1 green Insect creature token with flying named Butterfly // - 1/1 green Insect creature token with flying named Butterfly

View file

@ -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);
}
}