images: fixed miss token image in some use cases (if it was created from a card and a set contains multiple images);

This commit is contained in:
Oleg Agafonov 2024-05-26 12:56:03 +04:00
parent 8e2ff2db0f
commit 0e39d6a833
18 changed files with 82 additions and 57 deletions

View file

@ -155,9 +155,15 @@ public final class CardImageUtils {
return "ERROR: empty image file name, object type - " + card.getMageObjectType(); return "ERROR: empty image file name, object type - " + card.getMageObjectType();
} }
if (card.getMageObjectType().isUseTokensRepository() boolean isTokenRepository = card.getMageObjectType().isUseTokensRepository()
|| card.getExpansionSetCode().equals(TokenRepository.XMAGE_TOKENS_SET_CODE)) { || card.getExpansionSetCode().equals(TokenRepository.XMAGE_TOKENS_SET_CODE);
// token images or inner cards like face down // 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( CardDownloadData cardData = new CardDownloadData(
imageFileName.replace(" Token", ""), imageFileName.replace(" Token", ""),
card.getExpansionSetCode(), card.getExpansionSetCode(),
@ -167,18 +173,7 @@ public final class CardImageUtils {
cardData.setToken(true); cardData.setToken(true);
imageFile = CardImageUtils.buildImagePathToCardOrToken(cardData); imageFile = CardImageUtils.buildImagePathToCardOrToken(cardData);
} else { } else {
// card images // images from cards repository (card + token from cards)
// 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();
}
CardDownloadData cardData = new CardDownloadData( CardDownloadData cardData = new CardDownloadData(
imageFileName, imageFileName,
card.getExpansionSetCode(), card.getExpansionSetCode(),

View file

@ -34,6 +34,13 @@ public interface MageObject extends MageItem, Serializable, Copyable<MageObject>
void setImageNumber(Integer imageNumber); 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 * Get image file name
* - empty for default name from a card * - empty for default name from a card

View file

@ -36,6 +36,7 @@ public abstract class MageObjectImpl implements MageObject {
private String expansionSetCode = ""; private String expansionSetCode = "";
private String cardNumber = ""; private String cardNumber = "";
private boolean usesVariousArt = false;
private String imageFileName = ""; private String imageFileName = "";
private int imageNumber = 0; private int imageNumber = 0;
@ -77,6 +78,7 @@ public abstract class MageObjectImpl implements MageObject {
frameColor = object.frameColor.copy(); frameColor = object.frameColor.copy();
frameStyle = object.frameStyle; frameStyle = object.frameStyle;
expansionSetCode = object.expansionSetCode; expansionSetCode = object.expansionSetCode;
usesVariousArt = object.usesVariousArt;
cardNumber = object.cardNumber; cardNumber = object.cardNumber;
imageFileName = object.imageFileName; imageFileName = object.imageFileName;
imageNumber = object.imageNumber; imageNumber = object.imageNumber;
@ -258,6 +260,16 @@ public abstract class MageObjectImpl implements MageObject {
this.expansionSetCode = expansionSetCode; this.expansionSetCode = expansionSetCode;
} }
@Override
public boolean getUsesVariousArt() {
return usesVariousArt;
}
@Override
public void setUsesVariousArt(boolean usesVariousArt) {
this.usesVariousArt = usesVariousArt;
}
@Override @Override
public String getCardNumber() { public String getCardNumber() {
return cardNumber; return cardNumber;

View file

@ -339,6 +339,7 @@ public class BecomesFaceDownCreatureEffect extends ContinuousEffectImpl {
TokenInfo faceDownInfo = TokenRepository.instance.findPreferredTokenInfoForXmage(tokenName, object.getId()); TokenInfo faceDownInfo = TokenRepository.instance.findPreferredTokenInfoForXmage(tokenName, object.getId());
if (faceDownInfo != null) { if (faceDownInfo != null) {
faceDownToken.setExpansionSetCode(faceDownInfo.getSetCode()); faceDownToken.setExpansionSetCode(faceDownInfo.getSetCode());
faceDownToken.setUsesVariousArt(false);
faceDownToken.setCardNumber("0"); faceDownToken.setCardNumber("0");
faceDownToken.setImageFileName(faceDownInfo.getName()); faceDownToken.setImageFileName(faceDownInfo.getName());
faceDownToken.setImageNumber(faceDownInfo.getImageNumber()); faceDownToken.setImageNumber(faceDownInfo.getImageNumber());

View file

@ -148,13 +148,6 @@ public interface Card extends MageObject, Ownerable {
List<Mana> getMana(); List<Mana> 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(Game game);
Counters getCounters(GameState state); Counters getCounters(GameState state);

View file

@ -51,7 +51,6 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
protected SpellAbility spellAbility; protected SpellAbility spellAbility;
protected boolean flipCard; protected boolean flipCard;
protected String flipCardName; protected String flipCardName;
protected boolean usesVariousArt = false;
protected boolean morphCard; protected boolean morphCard;
protected List<UUID> attachments = new ArrayList<>(); protected List<UUID> attachments = new ArrayList<>();
protected boolean extraDeckCard = false; protected boolean extraDeckCard = false;
@ -65,6 +64,7 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
this.rarity = setInfo.getRarity(); this.rarity = setInfo.getRarity();
this.setExpansionSetCode(setInfo.getExpansionSetCode()); this.setExpansionSetCode(setInfo.getExpansionSetCode());
this.setUsesVariousArt(setInfo.getUsesVariousArt());
this.setCardNumber(setInfo.getCardNumber()); this.setCardNumber(setInfo.getCardNumber());
this.setImageFileName(""); // use default this.setImageFileName(""); // use default
this.setImageNumber(0); this.setImageNumber(0);
@ -86,7 +86,6 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
CardGraphicInfo graphicInfo = setInfo.getGraphicInfo(); CardGraphicInfo graphicInfo = setInfo.getGraphicInfo();
if (graphicInfo != null) { if (graphicInfo != null) {
this.usesVariousArt = graphicInfo.getUsesVariousArt();
if (graphicInfo.getFrameColor() != null) { if (graphicInfo.getFrameColor() != null) {
this.frameColor = graphicInfo.getFrameColor().copy(); 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 spellAbility = null; // will be set on first getSpellAbility call if card has one
flipCard = card.flipCard; flipCard = card.flipCard;
flipCardName = card.flipCardName; flipCardName = card.flipCardName;
usesVariousArt = card.usesVariousArt;
morphCard = card.morphCard; morphCard = card.morphCard;
extraDeckCard = card.extraDeckCard; extraDeckCard = card.extraDeckCard;
@ -724,16 +722,6 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
return flipCardName; return flipCardName;
} }
@Override
public boolean getUsesVariousArt() {
return usesVariousArt;
}
@Override
public void setUsesVariousArt(boolean usesVariousArt) {
this.usesVariousArt = usesVariousArt;
}
@Override @Override
public Counters getCounters(Game game) { public Counters getCounters(Game game) {
return getCounters(game.getState()); return getCounters(game.getState());

View file

@ -37,6 +37,10 @@ public final class CardSetInfo implements Serializable, Copyable<CardSetInfo> {
return this.expansionSetCode; return this.expansionSetCode;
} }
public boolean getUsesVariousArt() {
return this.graphicInfo != null && this.graphicInfo.getUsesVariousArt();
}
public String getCardNumber() { public String getCardNumber() {
return this.cardNumber; return this.cardNumber;
} }

View file

@ -41,6 +41,7 @@ public class MockCard extends CardImpl implements MockableCard {
public MockCard(CardInfo card) { public MockCard(CardInfo card) {
super(null, card.getName()); super(null, card.getName());
this.setExpansionSetCode(card.getSetCode()); this.setExpansionSetCode(card.getSetCode());
this.setUsesVariousArt(card.usesVariousArt());
this.setCardNumber(card.getCardNumber()); this.setCardNumber(card.getCardNumber());
this.setImageFileName(""); // use default this.setImageFileName(""); // use default
this.setImageNumber(0); this.setImageNumber(0);
@ -51,8 +52,6 @@ public class MockCard extends CardImpl implements MockableCard {
this.subtype = card.getSubTypes(); this.subtype = card.getSubTypes();
this.supertype = card.getSupertypes(); this.supertype = card.getSupertypes();
this.usesVariousArt = card.usesVariousArt();
//this.manaCost = new ManaCostsImpl<>(join(card.getManaCosts(CardInfo.ManaCostSide.ALL))); //this.manaCost = new ManaCostsImpl<>(join(card.getManaCosts(CardInfo.ManaCostSide.ALL)));
this.manaCostLeftStr = card.getManaCosts(CardInfo.ManaCostSide.LEFT); this.manaCostLeftStr = card.getManaCosts(CardInfo.ManaCostSide.LEFT);
this.manaCostRightStr = card.getManaCosts(CardInfo.ManaCostSide.RIGHT); this.manaCostRightStr = card.getManaCosts(CardInfo.ManaCostSide.RIGHT);

View file

@ -34,7 +34,6 @@ public class MockSplitCard extends SplitCard implements MockableCard {
this.frameColor = card.getFrameColor(); this.frameColor = card.getFrameColor();
this.frameStyle = card.getFrameStyle(); this.frameStyle = card.getFrameStyle();
this.usesVariousArt = card.usesVariousArt();
this.color = card.getColor(); this.color = card.getColor();
this.flipCard = card.isFlipCard(); this.flipCard = card.isFlipCard();

View file

@ -14,6 +14,7 @@ public abstract class CommandObjectImpl implements CommandObject {
private String name = ""; private String name = "";
private String expansionSetCode = ""; private String expansionSetCode = "";
private boolean usesVariousArt = false;
private String cardNumber = ""; private String cardNumber = "";
private String imageFileName = ""; private String imageFileName = "";
private int imageNumber; private int imageNumber;
@ -27,6 +28,7 @@ public abstract class CommandObjectImpl implements CommandObject {
this.id = object.id; this.id = object.id;
this.name = object.name; this.name = object.name;
this.expansionSetCode = object.expansionSetCode; this.expansionSetCode = object.expansionSetCode;
this.usesVariousArt = object.usesVariousArt;
this.cardNumber = object.cardNumber; this.cardNumber = object.cardNumber;
this.imageFileName = object.imageFileName; this.imageFileName = object.imageFileName;
this.imageNumber = object.imageNumber; this.imageNumber = object.imageNumber;
@ -47,6 +49,16 @@ public abstract class CommandObjectImpl implements CommandObject {
this.expansionSetCode = expansionSetCode; this.expansionSetCode = expansionSetCode;
} }
@Override
public boolean getUsesVariousArt() {
return usesVariousArt;
}
@Override
public void setUsesVariousArt(boolean usesVariousArt) {
this.usesVariousArt = usesVariousArt;
}
@Override @Override
public String getCardNumber() { public String getCardNumber() {
return cardNumber; return cardNumber;

View file

@ -68,6 +68,7 @@ public abstract class Emblem extends CommandObjectImpl {
); );
if (foundInfo != null) { if (foundInfo != null) {
this.setExpansionSetCode(foundInfo.getSetCode()); this.setExpansionSetCode(foundInfo.getSetCode());
this.setUsesVariousArt(false);
this.setCardNumber(""); this.setCardNumber("");
this.setImageFileName(""); // use default this.setImageFileName(""); // use default
this.setImageNumber(foundInfo.getImageNumber()); this.setImageNumber(foundInfo.getImageNumber());

View file

@ -72,6 +72,7 @@ public abstract class Plane extends CommandObjectImpl {
TokenInfo foundInfo = TokenRepository.instance.findPreferredTokenInfoForClass(this.getClass().getName(), null); TokenInfo foundInfo = TokenRepository.instance.findPreferredTokenInfoForClass(this.getClass().getName(), null);
if (foundInfo != null) { if (foundInfo != null) {
this.setExpansionSetCode(foundInfo.getSetCode()); this.setExpansionSetCode(foundInfo.getSetCode());
this.setUsesVariousArt(false);
this.setCardNumber(""); this.setCardNumber("");
this.setImageFileName(""); // use default this.setImageFileName(""); // use default
this.setImageNumber(foundInfo.getImageNumber()); this.setImageNumber(foundInfo.getImageNumber());

View file

@ -22,8 +22,6 @@ import java.util.stream.Collectors;
* mana burn with Yurlok of Scorch Thrash, and anything else players might think of. * mana burn with Yurlok of Scorch Thrash, and anything else players might think of.
*/ */
public final class EmblemOfCard extends Emblem { public final class EmblemOfCard extends Emblem {
private final boolean usesVariousArt;
public static Card lookupCard( public static Card lookupCard(
String cardName, String cardName,
@ -76,20 +74,20 @@ public final class EmblemOfCard extends Emblem {
this.getAbilities().setSourceId(this.getId()); this.getAbilities().setSourceId(this.getId());
this.setExpansionSetCode(card.getExpansionSetCode()); this.setExpansionSetCode(card.getExpansionSetCode());
this.setUsesVariousArt(card.getUsesVariousArt());
this.setCardNumber(card.getCardNumber()); this.setCardNumber(card.getCardNumber());
this.setImageFileName(card.getImageFileName()); this.setImageFileName(card.getImageFileName());
this.setImageNumber(card.getImageNumber()); this.setImageNumber(card.getImageNumber());
this.usesVariousArt = card.getUsesVariousArt();
} }
public EmblemOfCard(Card card) { public EmblemOfCard(Card card) {
this(card, Zone.BATTLEFIELD); this(card, Zone.BATTLEFIELD);
} }
private EmblemOfCard(EmblemOfCard eoc) { private EmblemOfCard(final EmblemOfCard eoc) {
super(eoc); super(eoc);
this.usesVariousArt = eoc.usesVariousArt;
} }
@Override @Override
public EmblemOfCard copy() { public EmblemOfCard copy() {
return new EmblemOfCard(this); 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 // 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) // (not sure why that would be setSoureObject's job; we get our image during construction)
} }
public boolean getUsesVariousArt() {
return usesVariousArt;
}
} }

View file

@ -40,6 +40,7 @@ public class RadiationEmblem extends Emblem {
TokenInfo foundInfo = TokenRepository.instance.findPreferredTokenInfoForXmage(TokenRepository.XMAGE_IMAGE_NAME_RADIATION, null); TokenInfo foundInfo = TokenRepository.instance.findPreferredTokenInfoForXmage(TokenRepository.XMAGE_IMAGE_NAME_RADIATION, null);
if (foundInfo != null) { if (foundInfo != null) {
this.setExpansionSetCode(foundInfo.getSetCode()); this.setExpansionSetCode(foundInfo.getSetCode());
this.setUsesVariousArt(false);
this.setCardNumber(""); this.setCardNumber("");
this.setImageFileName(""); // use default this.setImageFileName(""); // use default
this.setImageNumber(foundInfo.getImageNumber()); this.setImageNumber(foundInfo.getImageNumber());

View file

@ -145,10 +145,10 @@ public class PermanentCard extends PermanentImpl {
this.rarity = card.getRarity(); this.rarity = card.getRarity();
this.setExpansionSetCode(card.getExpansionSetCode()); this.setExpansionSetCode(card.getExpansionSetCode());
this.setUsesVariousArt(card.getUsesVariousArt());
this.setCardNumber(card.getCardNumber()); this.setCardNumber(card.getCardNumber());
this.setImageFileName(card.getImageFileName()); this.setImageFileName(card.getImageFileName());
this.setImageNumber(card.getImageNumber()); this.setImageNumber(card.getImageNumber());
this.usesVariousArt = card.getUsesVariousArt();
if (card.getSecondCardFace() != null) { if (card.getSecondCardFace() != null) {
this.secondSideCardClazz = card.getSecondCardFace().getClass(); this.secondSideCardClazz = card.getSecondCardFace().getClass();

View file

@ -160,7 +160,7 @@ public abstract class TokenImpl extends MageObjectImpl implements Token {
// - use random set code // - use random set code
// - use default 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()) { if (!token.getCardNumber().isEmpty()) {
return new TokenInfo(TokenType.TOKEN, token.getName(), token.getExpansionSetCode(), 0); return new TokenInfo(TokenType.TOKEN, token.getName(), token.getExpansionSetCode(), 0);
} }
@ -292,13 +292,17 @@ public abstract class TokenImpl extends MageObjectImpl implements Token {
// front side // front side
TokenInfo tokenInfo = TokenImpl.generateTokenInfo((TokenImpl) token, game, source == null ? null : source.getSourceId()); TokenInfo tokenInfo = TokenImpl.generateTokenInfo((TokenImpl) token, game, source == null ? null : source.getSourceId());
token.setExpansionSetCode(tokenInfo.getSetCode()); token.setExpansionSetCode(tokenInfo.getSetCode());
//token.setCardNumber(""); // if token from a card then don't change a card number
token.setImageNumber(tokenInfo.getImageNumber()); 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) { if (token.getBackFace() != null) {
// back side // back side
tokenInfo = TokenImpl.generateTokenInfo((TokenImpl) token.getBackFace(), game, source == null ? null : source.getSourceId()); tokenInfo = TokenImpl.generateTokenInfo((TokenImpl) token.getBackFace(), game, source == null ? null : source.getSourceId());
token.getBackFace().setExpansionSetCode(tokenInfo.getSetCode()); token.getBackFace().setExpansionSetCode(tokenInfo.getSetCode());
token.getBackFace().setImageNumber(tokenInfo.getImageNumber()); token.getBackFace().setImageNumber(tokenInfo.getImageNumber());
//token.setCardNumber("");
//token.setUsesVariousArt(false);
} }
List<Permanent> needTokens = new ArrayList<>(); List<Permanent> needTokens = new ArrayList<>();

View file

@ -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"); 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 @Override
public String getCardNumber() { public String getCardNumber() {
return ""; return "";

View file

@ -2173,19 +2173,17 @@ public final class CardUtil {
String needImageFileName; String needImageFileName;
int needImageNumber; int needImageNumber;
boolean needUsesVariousArt = false; boolean needUsesVariousArt = false;
if (copyFromObject instanceof Card) {
needUsesVariousArt = ((Card) copyFromObject).getUsesVariousArt();
}
needSetCode = copyFromObject.getExpansionSetCode(); needSetCode = copyFromObject.getExpansionSetCode();
needCardNumber = copyFromObject.getCardNumber(); needCardNumber = copyFromObject.getCardNumber();
needImageFileName = copyFromObject.getImageFileName(); needImageFileName = copyFromObject.getImageFileName();
needImageNumber = copyFromObject.getImageNumber(); needImageNumber = copyFromObject.getImageNumber();
needUsesVariousArt = copyFromObject.getUsesVariousArt();
if (targetObject instanceof Permanent) { if (targetObject instanceof Permanent) {
copySetAndCardNumber((Permanent) targetObject, needSetCode, needCardNumber, needImageFileName, needImageNumber, needUsesVariousArt); copySetAndCardNumber((Permanent) targetObject, needSetCode, needCardNumber, needImageFileName, needImageNumber, needUsesVariousArt);
} else if (targetObject instanceof Token) { } 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) { } else if (targetObject instanceof Card) {
copySetAndCardNumber((Card) targetObject, needSetCode, needCardNumber, needImageFileName, needImageNumber, needUsesVariousArt); copySetAndCardNumber((Card) targetObject, needSetCode, needCardNumber, needImageFileName, needImageNumber, needUsesVariousArt);
} else { } else {
@ -2197,28 +2195,34 @@ public final class CardUtil {
if (targetPermanent instanceof PermanentCard if (targetPermanent instanceof PermanentCard
|| targetPermanent instanceof PermanentToken) { || targetPermanent instanceof PermanentToken) {
targetPermanent.setExpansionSetCode(newSetCode); targetPermanent.setExpansionSetCode(newSetCode);
targetPermanent.setUsesVariousArt(usesVariousArt);
targetPermanent.setCardNumber(newCardNumber); targetPermanent.setCardNumber(newCardNumber);
targetPermanent.setImageFileName(newImageFileName); targetPermanent.setImageFileName(newImageFileName);
targetPermanent.setImageNumber(newImageNumber); targetPermanent.setImageNumber(newImageNumber);
targetPermanent.setUsesVariousArt(usesVariousArt);
} else { } else {
throw new IllegalArgumentException("Wrong code usage: un-supported target permanent type: " + targetPermanent.getClass().getSimpleName()); 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.setExpansionSetCode(newSetCode);
targetToken.setCardNumber(newCardNumber); targetToken.setCardNumber(newCardNumber);
targetToken.setImageFileName(newImageFileName); targetToken.setImageFileName(newImageFileName);
targetToken.setImageNumber(newImageNumber); 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) { private static void copySetAndCardNumber(Card targetCard, String newSetCode, String newCardNumber, String newImageFileName, Integer newImageNumber, boolean usesVariousArt) {
targetCard.setExpansionSetCode(newSetCode); targetCard.setExpansionSetCode(newSetCode);
targetCard.setUsesVariousArt(usesVariousArt);
targetCard.setCardNumber(newCardNumber); targetCard.setCardNumber(newCardNumber);
targetCard.setImageFileName(newImageFileName); targetCard.setImageFileName(newImageFileName);
targetCard.setImageNumber(newImageNumber); targetCard.setImageNumber(newImageNumber);
targetCard.setUsesVariousArt(usesVariousArt);
} }
/** /**