From 0e39d6a8334532efa4f4fd889c8c41d51377419c Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sun, 26 May 2024 12:56:03 +0400 Subject: [PATCH] images: fixed miss token image in some use cases (if it was created from a card and a set contains multiple images); --- .../plugins/card/utils/CardImageUtils.java | 25 ++++++++----------- Mage/src/main/java/mage/MageObject.java | 7 ++++++ Mage/src/main/java/mage/MageObjectImpl.java | 12 +++++++++ .../BecomesFaceDownCreatureEffect.java | 1 + Mage/src/main/java/mage/cards/Card.java | 7 ------ Mage/src/main/java/mage/cards/CardImpl.java | 14 +---------- .../src/main/java/mage/cards/CardSetInfo.java | 4 +++ .../main/java/mage/cards/mock/MockCard.java | 3 +-- .../java/mage/cards/mock/MockSplitCard.java | 1 - .../mage/game/command/CommandObjectImpl.java | 12 +++++++++ .../main/java/mage/game/command/Emblem.java | 1 + .../main/java/mage/game/command/Plane.java | 1 + .../game/command/emblems/EmblemOfCard.java | 12 +++------ .../game/command/emblems/RadiationEmblem.java | 1 + .../mage/game/permanent/PermanentCard.java | 2 +- .../mage/game/permanent/token/TokenImpl.java | 8 ++++-- .../java/mage/game/stack/StackAbility.java | 10 ++++++++ Mage/src/main/java/mage/util/CardUtil.java | 18 +++++++------ 18 files changed, 82 insertions(+), 57 deletions(-) diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java b/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java index b53360efe0e..8fe62d690de 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java @@ -155,9 +155,15 @@ public final class CardImageUtils { return "ERROR: empty image file name, object type - " + card.getMageObjectType(); } - if (card.getMageObjectType().isUseTokensRepository() - || card.getExpansionSetCode().equals(TokenRepository.XMAGE_TOKENS_SET_CODE)) { - // token images or inner cards like face down + boolean isTokenRepository = card.getMageObjectType().isUseTokensRepository() + || card.getExpansionSetCode().equals(TokenRepository.XMAGE_TOKENS_SET_CODE); + // if token from a card then must use card repository instead + if (isTokenRepository && !card.getCardNumber().isEmpty()) { + isTokenRepository = false; + } + + if (isTokenRepository) { + // images from tokens repository (token + xmage token) CardDownloadData cardData = new CardDownloadData( imageFileName.replace(" Token", ""), card.getExpansionSetCode(), @@ -167,18 +173,7 @@ public final class CardImageUtils { cardData.setToken(true); imageFile = CardImageUtils.buildImagePathToCardOrToken(cardData); } else { - // card images - // workaround to find various art settings first - // TODO: no needs in workaround?! ?! - boolean usesVariousArt = false; - CardInfo cardInfo = CardRepository.instance.findCardWithPreferredSetAndNumber( - card.getName(), - card.getExpansionSetCode(), - card.getCardNumber() - ); - if (cardInfo != null) { - usesVariousArt = cardInfo.usesVariousArt(); - } + // images from cards repository (card + token from cards) CardDownloadData cardData = new CardDownloadData( imageFileName, card.getExpansionSetCode(), diff --git a/Mage/src/main/java/mage/MageObject.java b/Mage/src/main/java/mage/MageObject.java index 376fd4abced..ce337272aaa 100644 --- a/Mage/src/main/java/mage/MageObject.java +++ b/Mage/src/main/java/mage/MageObject.java @@ -34,6 +34,13 @@ public interface MageObject extends MageItem, Serializable, Copyable void setImageNumber(Integer imageNumber); + /** + * Set contains multiple cards with same card name but different images (also used for token from card) + */ + boolean getUsesVariousArt(); + + void setUsesVariousArt(boolean usesVariousArt); + /** * Get image file name * - empty for default name from a card diff --git a/Mage/src/main/java/mage/MageObjectImpl.java b/Mage/src/main/java/mage/MageObjectImpl.java index 4528911e9d3..0a2606d220b 100644 --- a/Mage/src/main/java/mage/MageObjectImpl.java +++ b/Mage/src/main/java/mage/MageObjectImpl.java @@ -36,6 +36,7 @@ public abstract class MageObjectImpl implements MageObject { private String expansionSetCode = ""; private String cardNumber = ""; + private boolean usesVariousArt = false; private String imageFileName = ""; private int imageNumber = 0; @@ -77,6 +78,7 @@ public abstract class MageObjectImpl implements MageObject { frameColor = object.frameColor.copy(); frameStyle = object.frameStyle; expansionSetCode = object.expansionSetCode; + usesVariousArt = object.usesVariousArt; cardNumber = object.cardNumber; imageFileName = object.imageFileName; imageNumber = object.imageNumber; @@ -258,6 +260,16 @@ public abstract class MageObjectImpl implements MageObject { this.expansionSetCode = expansionSetCode; } + @Override + public boolean getUsesVariousArt() { + return usesVariousArt; + } + + @Override + public void setUsesVariousArt(boolean usesVariousArt) { + this.usesVariousArt = usesVariousArt; + } + @Override public String getCardNumber() { return cardNumber; diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesFaceDownCreatureEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesFaceDownCreatureEffect.java index 9cdc4c220f9..eb60dcb5d8a 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesFaceDownCreatureEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesFaceDownCreatureEffect.java @@ -339,6 +339,7 @@ public class BecomesFaceDownCreatureEffect extends ContinuousEffectImpl { TokenInfo faceDownInfo = TokenRepository.instance.findPreferredTokenInfoForXmage(tokenName, object.getId()); if (faceDownInfo != null) { faceDownToken.setExpansionSetCode(faceDownInfo.getSetCode()); + faceDownToken.setUsesVariousArt(false); faceDownToken.setCardNumber("0"); faceDownToken.setImageFileName(faceDownInfo.getName()); faceDownToken.setImageNumber(faceDownInfo.getImageNumber()); diff --git a/Mage/src/main/java/mage/cards/Card.java b/Mage/src/main/java/mage/cards/Card.java index 9df2eee06c5..4febe0b70d7 100644 --- a/Mage/src/main/java/mage/cards/Card.java +++ b/Mage/src/main/java/mage/cards/Card.java @@ -148,13 +148,6 @@ public interface Card extends MageObject, Ownerable { List getMana(); - /** - * Set contains multiple cards with same card name but different images. Used for image path generation. - */ - boolean getUsesVariousArt(); - - void setUsesVariousArt(boolean usesVariousArt); - Counters getCounters(Game game); Counters getCounters(GameState state); diff --git a/Mage/src/main/java/mage/cards/CardImpl.java b/Mage/src/main/java/mage/cards/CardImpl.java index 28617471606..1ee55b8c6fd 100644 --- a/Mage/src/main/java/mage/cards/CardImpl.java +++ b/Mage/src/main/java/mage/cards/CardImpl.java @@ -51,7 +51,6 @@ public abstract class CardImpl extends MageObjectImpl implements Card { protected SpellAbility spellAbility; protected boolean flipCard; protected String flipCardName; - protected boolean usesVariousArt = false; protected boolean morphCard; protected List attachments = new ArrayList<>(); protected boolean extraDeckCard = false; @@ -65,6 +64,7 @@ public abstract class CardImpl extends MageObjectImpl implements Card { this.rarity = setInfo.getRarity(); this.setExpansionSetCode(setInfo.getExpansionSetCode()); + this.setUsesVariousArt(setInfo.getUsesVariousArt()); this.setCardNumber(setInfo.getCardNumber()); this.setImageFileName(""); // use default this.setImageNumber(0); @@ -86,7 +86,6 @@ public abstract class CardImpl extends MageObjectImpl implements Card { CardGraphicInfo graphicInfo = setInfo.getGraphicInfo(); if (graphicInfo != null) { - this.usesVariousArt = graphicInfo.getUsesVariousArt(); if (graphicInfo.getFrameColor() != null) { this.frameColor = graphicInfo.getFrameColor().copy(); } @@ -145,7 +144,6 @@ public abstract class CardImpl extends MageObjectImpl implements Card { spellAbility = null; // will be set on first getSpellAbility call if card has one flipCard = card.flipCard; flipCardName = card.flipCardName; - usesVariousArt = card.usesVariousArt; morphCard = card.morphCard; extraDeckCard = card.extraDeckCard; @@ -724,16 +722,6 @@ public abstract class CardImpl extends MageObjectImpl implements Card { return flipCardName; } - @Override - public boolean getUsesVariousArt() { - return usesVariousArt; - } - - @Override - public void setUsesVariousArt(boolean usesVariousArt) { - this.usesVariousArt = usesVariousArt; - } - @Override public Counters getCounters(Game game) { return getCounters(game.getState()); diff --git a/Mage/src/main/java/mage/cards/CardSetInfo.java b/Mage/src/main/java/mage/cards/CardSetInfo.java index 0bc05b2488f..a816343c9fe 100644 --- a/Mage/src/main/java/mage/cards/CardSetInfo.java +++ b/Mage/src/main/java/mage/cards/CardSetInfo.java @@ -37,6 +37,10 @@ public final class CardSetInfo implements Serializable, Copyable { return this.expansionSetCode; } + public boolean getUsesVariousArt() { + return this.graphicInfo != null && this.graphicInfo.getUsesVariousArt(); + } + public String getCardNumber() { return this.cardNumber; } diff --git a/Mage/src/main/java/mage/cards/mock/MockCard.java b/Mage/src/main/java/mage/cards/mock/MockCard.java index 5ca0affe4e0..d76ad94c0d4 100644 --- a/Mage/src/main/java/mage/cards/mock/MockCard.java +++ b/Mage/src/main/java/mage/cards/mock/MockCard.java @@ -41,6 +41,7 @@ public class MockCard extends CardImpl implements MockableCard { public MockCard(CardInfo card) { super(null, card.getName()); this.setExpansionSetCode(card.getSetCode()); + this.setUsesVariousArt(card.usesVariousArt()); this.setCardNumber(card.getCardNumber()); this.setImageFileName(""); // use default this.setImageNumber(0); @@ -51,8 +52,6 @@ public class MockCard extends CardImpl implements MockableCard { this.subtype = card.getSubTypes(); this.supertype = card.getSupertypes(); - this.usesVariousArt = card.usesVariousArt(); - //this.manaCost = new ManaCostsImpl<>(join(card.getManaCosts(CardInfo.ManaCostSide.ALL))); this.manaCostLeftStr = card.getManaCosts(CardInfo.ManaCostSide.LEFT); this.manaCostRightStr = card.getManaCosts(CardInfo.ManaCostSide.RIGHT); diff --git a/Mage/src/main/java/mage/cards/mock/MockSplitCard.java b/Mage/src/main/java/mage/cards/mock/MockSplitCard.java index cc8d961e2dd..c623c5eb21b 100644 --- a/Mage/src/main/java/mage/cards/mock/MockSplitCard.java +++ b/Mage/src/main/java/mage/cards/mock/MockSplitCard.java @@ -34,7 +34,6 @@ public class MockSplitCard extends SplitCard implements MockableCard { this.frameColor = card.getFrameColor(); this.frameStyle = card.getFrameStyle(); - this.usesVariousArt = card.usesVariousArt(); this.color = card.getColor(); this.flipCard = card.isFlipCard(); diff --git a/Mage/src/main/java/mage/game/command/CommandObjectImpl.java b/Mage/src/main/java/mage/game/command/CommandObjectImpl.java index e796f1ef1d3..a06b6f4e594 100644 --- a/Mage/src/main/java/mage/game/command/CommandObjectImpl.java +++ b/Mage/src/main/java/mage/game/command/CommandObjectImpl.java @@ -14,6 +14,7 @@ public abstract class CommandObjectImpl implements CommandObject { private String name = ""; private String expansionSetCode = ""; + private boolean usesVariousArt = false; private String cardNumber = ""; private String imageFileName = ""; private int imageNumber; @@ -27,6 +28,7 @@ public abstract class CommandObjectImpl implements CommandObject { this.id = object.id; this.name = object.name; this.expansionSetCode = object.expansionSetCode; + this.usesVariousArt = object.usesVariousArt; this.cardNumber = object.cardNumber; this.imageFileName = object.imageFileName; this.imageNumber = object.imageNumber; @@ -47,6 +49,16 @@ public abstract class CommandObjectImpl implements CommandObject { this.expansionSetCode = expansionSetCode; } + @Override + public boolean getUsesVariousArt() { + return usesVariousArt; + } + + @Override + public void setUsesVariousArt(boolean usesVariousArt) { + this.usesVariousArt = usesVariousArt; + } + @Override public String getCardNumber() { return cardNumber; diff --git a/Mage/src/main/java/mage/game/command/Emblem.java b/Mage/src/main/java/mage/game/command/Emblem.java index 88560bf93fb..7cb934200a9 100644 --- a/Mage/src/main/java/mage/game/command/Emblem.java +++ b/Mage/src/main/java/mage/game/command/Emblem.java @@ -68,6 +68,7 @@ public abstract class Emblem extends CommandObjectImpl { ); if (foundInfo != null) { this.setExpansionSetCode(foundInfo.getSetCode()); + this.setUsesVariousArt(false); this.setCardNumber(""); this.setImageFileName(""); // use default this.setImageNumber(foundInfo.getImageNumber()); diff --git a/Mage/src/main/java/mage/game/command/Plane.java b/Mage/src/main/java/mage/game/command/Plane.java index b64b63721dc..9ee4394ebd8 100644 --- a/Mage/src/main/java/mage/game/command/Plane.java +++ b/Mage/src/main/java/mage/game/command/Plane.java @@ -72,6 +72,7 @@ public abstract class Plane extends CommandObjectImpl { TokenInfo foundInfo = TokenRepository.instance.findPreferredTokenInfoForClass(this.getClass().getName(), null); if (foundInfo != null) { this.setExpansionSetCode(foundInfo.getSetCode()); + this.setUsesVariousArt(false); this.setCardNumber(""); this.setImageFileName(""); // use default this.setImageNumber(foundInfo.getImageNumber()); diff --git a/Mage/src/main/java/mage/game/command/emblems/EmblemOfCard.java b/Mage/src/main/java/mage/game/command/emblems/EmblemOfCard.java index efd91aeeaf8..422ddc5af4c 100644 --- a/Mage/src/main/java/mage/game/command/emblems/EmblemOfCard.java +++ b/Mage/src/main/java/mage/game/command/emblems/EmblemOfCard.java @@ -22,8 +22,6 @@ import java.util.stream.Collectors; * mana burn with Yurlok of Scorch Thrash, and anything else players might think of. */ public final class EmblemOfCard extends Emblem { - - private final boolean usesVariousArt; public static Card lookupCard( String cardName, @@ -76,20 +74,20 @@ public final class EmblemOfCard extends Emblem { this.getAbilities().setSourceId(this.getId()); this.setExpansionSetCode(card.getExpansionSetCode()); + this.setUsesVariousArt(card.getUsesVariousArt()); this.setCardNumber(card.getCardNumber()); this.setImageFileName(card.getImageFileName()); this.setImageNumber(card.getImageNumber()); - this.usesVariousArt = card.getUsesVariousArt(); } public EmblemOfCard(Card card) { this(card, Zone.BATTLEFIELD); } - private EmblemOfCard(EmblemOfCard eoc) { + private EmblemOfCard(final EmblemOfCard eoc) { super(eoc); - this.usesVariousArt = eoc.usesVariousArt; } + @Override public EmblemOfCard copy() { return new EmblemOfCard(this); @@ -101,9 +99,5 @@ public final class EmblemOfCard extends Emblem { // super method would try and fail to find the emblem image here // (not sure why that would be setSoureObject's job; we get our image during construction) } - - public boolean getUsesVariousArt() { - return usesVariousArt; - } } diff --git a/Mage/src/main/java/mage/game/command/emblems/RadiationEmblem.java b/Mage/src/main/java/mage/game/command/emblems/RadiationEmblem.java index 85a28f9b6c7..1a04ce61c9a 100644 --- a/Mage/src/main/java/mage/game/command/emblems/RadiationEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/RadiationEmblem.java @@ -40,6 +40,7 @@ public class RadiationEmblem extends Emblem { TokenInfo foundInfo = TokenRepository.instance.findPreferredTokenInfoForXmage(TokenRepository.XMAGE_IMAGE_NAME_RADIATION, null); if (foundInfo != null) { this.setExpansionSetCode(foundInfo.getSetCode()); + this.setUsesVariousArt(false); this.setCardNumber(""); this.setImageFileName(""); // use default this.setImageNumber(foundInfo.getImageNumber()); diff --git a/Mage/src/main/java/mage/game/permanent/PermanentCard.java b/Mage/src/main/java/mage/game/permanent/PermanentCard.java index 1d368d1ecb5..283f67c1c74 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentCard.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentCard.java @@ -145,10 +145,10 @@ public class PermanentCard extends PermanentImpl { this.rarity = card.getRarity(); this.setExpansionSetCode(card.getExpansionSetCode()); + this.setUsesVariousArt(card.getUsesVariousArt()); this.setCardNumber(card.getCardNumber()); this.setImageFileName(card.getImageFileName()); this.setImageNumber(card.getImageNumber()); - this.usesVariousArt = card.getUsesVariousArt(); if (card.getSecondCardFace() != null) { this.secondSideCardClazz = card.getSecondCardFace().getClass(); diff --git a/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java b/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java index f8bf3cacce0..274020d5895 100644 --- a/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java +++ b/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java @@ -160,7 +160,7 @@ public abstract class TokenImpl extends MageObjectImpl implements Token { // - use random set code // - use default set code - // token from a card - must use card image instead (example: Embalm ability) + // token from a card - must use card image instead, no need to choose new image (example: Embalm ability, copy of card, etc) if (!token.getCardNumber().isEmpty()) { return new TokenInfo(TokenType.TOKEN, token.getName(), token.getExpansionSetCode(), 0); } @@ -292,13 +292,17 @@ public abstract class TokenImpl extends MageObjectImpl implements Token { // front side TokenInfo tokenInfo = TokenImpl.generateTokenInfo((TokenImpl) token, game, source == null ? null : source.getSourceId()); token.setExpansionSetCode(tokenInfo.getSetCode()); - //token.setCardNumber(""); // if token from a card then don't change a card number token.setImageNumber(tokenInfo.getImageNumber()); + // if token from a card then keep card number and var art info + //token.setCardNumber(""); + //token.setUsesVariousArt(false); if (token.getBackFace() != null) { // back side tokenInfo = TokenImpl.generateTokenInfo((TokenImpl) token.getBackFace(), game, source == null ? null : source.getSourceId()); token.getBackFace().setExpansionSetCode(tokenInfo.getSetCode()); token.getBackFace().setImageNumber(tokenInfo.getImageNumber()); + //token.setCardNumber(""); + //token.setUsesVariousArt(false); } List needTokens = new ArrayList<>(); diff --git a/Mage/src/main/java/mage/game/stack/StackAbility.java b/Mage/src/main/java/mage/game/stack/StackAbility.java index c26cb5307ae..64273d665b0 100644 --- a/Mage/src/main/java/mage/game/stack/StackAbility.java +++ b/Mage/src/main/java/mage/game/stack/StackAbility.java @@ -137,6 +137,16 @@ public class StackAbility extends StackObjectImpl implements Ability { throw new IllegalStateException("Wrong code usage: you can't change set code for the stack ability"); } + @Override + public boolean getUsesVariousArt() { + return false; + } + + @Override + public void setUsesVariousArt(boolean usesVariousArt) { + throw new IllegalStateException("Wrong code usage: you can't change usesVariousArt for the stack ability"); + } + @Override public String getCardNumber() { return ""; diff --git a/Mage/src/main/java/mage/util/CardUtil.java b/Mage/src/main/java/mage/util/CardUtil.java index f978f420ef5..8054ef4d4e9 100644 --- a/Mage/src/main/java/mage/util/CardUtil.java +++ b/Mage/src/main/java/mage/util/CardUtil.java @@ -2173,19 +2173,17 @@ public final class CardUtil { String needImageFileName; int needImageNumber; boolean needUsesVariousArt = false; - if (copyFromObject instanceof Card) { - needUsesVariousArt = ((Card) copyFromObject).getUsesVariousArt(); - } needSetCode = copyFromObject.getExpansionSetCode(); needCardNumber = copyFromObject.getCardNumber(); needImageFileName = copyFromObject.getImageFileName(); needImageNumber = copyFromObject.getImageNumber(); + needUsesVariousArt = copyFromObject.getUsesVariousArt(); if (targetObject instanceof Permanent) { copySetAndCardNumber((Permanent) targetObject, needSetCode, needCardNumber, needImageFileName, needImageNumber, needUsesVariousArt); } else if (targetObject instanceof Token) { - copySetAndCardNumber((Token) targetObject, needSetCode, needCardNumber, needImageFileName, needImageNumber); + copySetAndCardNumber((Token) targetObject, needSetCode, needCardNumber, needImageFileName, needImageNumber, needUsesVariousArt); } else if (targetObject instanceof Card) { copySetAndCardNumber((Card) targetObject, needSetCode, needCardNumber, needImageFileName, needImageNumber, needUsesVariousArt); } else { @@ -2197,28 +2195,34 @@ public final class CardUtil { if (targetPermanent instanceof PermanentCard || targetPermanent instanceof PermanentToken) { targetPermanent.setExpansionSetCode(newSetCode); + targetPermanent.setUsesVariousArt(usesVariousArt); targetPermanent.setCardNumber(newCardNumber); targetPermanent.setImageFileName(newImageFileName); targetPermanent.setImageNumber(newImageNumber); - targetPermanent.setUsesVariousArt(usesVariousArt); } else { throw new IllegalArgumentException("Wrong code usage: un-supported target permanent type: " + targetPermanent.getClass().getSimpleName()); } } - private static void copySetAndCardNumber(Token targetToken, String newSetCode, String newCardNumber, String newImageFileName, Integer newImageNumber) { + private static void copySetAndCardNumber(Token targetToken, String newSetCode, String newCardNumber, String newImageFileName, Integer newImageNumber, boolean newUsesVariousArt) { targetToken.setExpansionSetCode(newSetCode); targetToken.setCardNumber(newCardNumber); targetToken.setImageFileName(newImageFileName); targetToken.setImageNumber(newImageNumber); + + // runtime check + if (newUsesVariousArt && newCardNumber.isEmpty()) { + throw new IllegalArgumentException("Wrong code usage: usesVariousArt can be used for token from card only"); + } + targetToken.setUsesVariousArt(newUsesVariousArt); } private static void copySetAndCardNumber(Card targetCard, String newSetCode, String newCardNumber, String newImageFileName, Integer newImageNumber, boolean usesVariousArt) { targetCard.setExpansionSetCode(newSetCode); + targetCard.setUsesVariousArt(usesVariousArt); targetCard.setCardNumber(newCardNumber); targetCard.setImageFileName(newImageFileName); targetCard.setImageNumber(newImageNumber); - targetCard.setUsesVariousArt(usesVariousArt); } /**