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();
}
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(),

View file

@ -34,6 +34,13 @@ public interface MageObject extends MageItem, Serializable, Copyable<MageObject>
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

View file

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

View file

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

View file

@ -148,13 +148,6 @@ public interface Card extends MageObject, Ownerable {
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(GameState state);

View file

@ -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<UUID> 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());

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -23,8 +23,6 @@ import java.util.stream.Collectors;
*/
public final class EmblemOfCard extends Emblem {
private final boolean usesVariousArt;
public static Card lookupCard(
String cardName,
String cardNumber,
@ -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;
}
}

View file

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

View file

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

View file

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

View file

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