mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 20:28:00 +00:00
fix Adventure RewardActor crash
- additional check for ImageUtil
This commit is contained in:
@@ -18,14 +18,45 @@ public class ImageUtil {
|
||||
if (imageKey == null || imageKey.length() < 2) {
|
||||
return null;
|
||||
}
|
||||
if (imageKey.startsWith(ImageKeys.CARD_PREFIX))
|
||||
key = imageKey.substring(ImageKeys.CARD_PREFIX.length());
|
||||
else if (imageKey.startsWith(ImageKeys.TOKEN_PREFIX))
|
||||
key = imageKey.substring(ImageKeys.TOKEN_PREFIX.length());
|
||||
else if (imageKey.startsWith(ImageKeys.ICON_PREFIX))
|
||||
key = imageKey.substring(ImageKeys.ICON_PREFIX.length());
|
||||
else if (imageKey.startsWith(ImageKeys.BOOSTER_PREFIX))
|
||||
key = imageKey.substring(ImageKeys.BOOSTER_PREFIX.length());
|
||||
else if (imageKey.startsWith(ImageKeys.FATPACK_PREFIX))
|
||||
key = imageKey.substring(ImageKeys.FATPACK_PREFIX.length());
|
||||
else if (imageKey.startsWith(ImageKeys.BOOSTERBOX_PREFIX))
|
||||
key = imageKey.substring(ImageKeys.BOOSTERBOX_PREFIX.length());
|
||||
else if (imageKey.startsWith(ImageKeys.PRECON_PREFIX))
|
||||
key = imageKey.substring(ImageKeys.PRECON_PREFIX.length());
|
||||
else if (imageKey.startsWith(ImageKeys.TOURNAMENTPACK_PREFIX))
|
||||
key = imageKey.substring(ImageKeys.TOURNAMENTPACK_PREFIX.length());
|
||||
else if (imageKey.startsWith(ImageKeys.ADVENTURECARD_PREFIX))
|
||||
key = imageKey.substring(ImageKeys.ADVENTURECARD_PREFIX.length());
|
||||
else if (imageKey.contains(".full")) {//no prefix found, construct a valid key if imageKey is art imagekey.
|
||||
key = transformKey(imageKey);
|
||||
} else //try anyway...
|
||||
key = imageKey;
|
||||
|
||||
key = imageKey.substring(2);
|
||||
PaperCard cp = StaticData.instance().getCommonCards().getCard(key);
|
||||
if (cp == null) {
|
||||
cp = StaticData.instance().getVariantCards().getCard(key);
|
||||
}
|
||||
return cp;
|
||||
}
|
||||
public static String transformKey(String imageKey) {
|
||||
String key;
|
||||
String edition= imageKey.substring(0, imageKey.indexOf("/"));
|
||||
String artIndex = imageKey.substring(imageKey.indexOf("/")+1, imageKey.indexOf(".")).replaceAll("[^0-9]", "");
|
||||
String name = artIndex.isEmpty() ? imageKey.substring(imageKey.indexOf("/")+1, imageKey.indexOf(".")) : imageKey.substring(imageKey.indexOf("/")+1, imageKey.indexOf(artIndex));
|
||||
key = name + "|" + edition;
|
||||
if (!artIndex.isEmpty())
|
||||
key += "|" + artIndex;
|
||||
return key;
|
||||
}
|
||||
|
||||
public static String getImageRelativePath(PaperCard cp, String face, boolean includeSet, boolean isDownloadUrl) {
|
||||
final String nameToUse = cp == null ? null : getNameToUse(cp, face);
|
||||
|
||||
@@ -61,7 +61,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
|
||||
final int preview_h = 680;
|
||||
|
||||
static TextureRegion backTexture;
|
||||
Texture image, T;
|
||||
Texture image, T, Talt;
|
||||
Graphics graphics;
|
||||
Texture generatedTooltip = null; //Storage for a generated tooltip. To dispose of on exit.
|
||||
boolean needsToBeDisposed;
|
||||
@@ -102,6 +102,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
|
||||
|
||||
@Override
|
||||
public void onImageFetched() {
|
||||
ImageCache.clear();
|
||||
String imageKey = reward.getCard().getImageKey(false);
|
||||
PaperCard card = ImageUtil.getPaperCardFromImageKey(imageKey);
|
||||
imageKey = card.getCardImageKey();
|
||||
@@ -216,10 +217,15 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
|
||||
}
|
||||
} else if (!ImageCache.imageKeyFileExists(reward.getCard().getImageKey(false))) {
|
||||
//Cannot find an image file, set up a rendered card until (if) a file is downloaded.
|
||||
T = renderPlaceholder(getGraphics(), reward.getCard()); //Now we can render the card.
|
||||
T = renderPlaceholder(new Graphics(), reward.getCard(), false); //Now we can render the card.
|
||||
setCardImage(T);
|
||||
loaded = false;
|
||||
fetcher.fetchImage(reward.getCard().getImageKey(false), this);
|
||||
if (reward.getCard().hasBackFace()) {
|
||||
if (!ImageCache.imageKeyFileExists(reward.getCard().getImageKey(true))) {
|
||||
fetcher.fetchImage(reward.getCard().getImageKey(true), this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -325,17 +331,16 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
|
||||
if (!reward.getCard().hasBackFace())
|
||||
return;
|
||||
Texture alt = ImageCache.getImage(reward.getCard().getImageKey(true), false);
|
||||
PaperCard altCard = ImageUtil.getPaperCardFromImageKey(reward.getCard().getCardAltImageKey());
|
||||
if (GuiBase.isAndroid() || Forge.hasGamepad()) {
|
||||
if (alternate) {
|
||||
if (alt != null) {
|
||||
holdTooltip.tooltip_actor.clear();
|
||||
holdTooltip.tooltip_actor.add(new RewardImage(processDrawable(alt)));
|
||||
} else {
|
||||
if (T == null)
|
||||
T = renderPlaceholder(getGraphics(), altCard);
|
||||
if (Talt == null)
|
||||
Talt = renderPlaceholder(new Graphics(), reward.getCard(), true);
|
||||
holdTooltip.tooltip_actor.clear();
|
||||
holdTooltip.tooltip_actor.add(new RewardImage(processDrawable(T)));
|
||||
holdTooltip.tooltip_actor.add(new RewardImage(processDrawable(Talt)));
|
||||
}
|
||||
} else {
|
||||
if (toolTipImage != null) {
|
||||
@@ -349,9 +354,9 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
|
||||
if (alt != null) {
|
||||
tooltip.setActor(new RewardImage(processDrawable(alt)));
|
||||
} else {
|
||||
if (T == null)
|
||||
T = renderPlaceholder(getGraphics(), altCard);
|
||||
tooltip.setActor(new RewardImage(processDrawable(T)));
|
||||
if (Talt == null)
|
||||
Talt = renderPlaceholder(new Graphics(), reward.getCard(), true);
|
||||
tooltip.setActor(new RewardImage(processDrawable(Talt)));
|
||||
}
|
||||
} else {
|
||||
if (toolTipImage != null)
|
||||
@@ -441,7 +446,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
|
||||
}
|
||||
}
|
||||
|
||||
private Texture renderPlaceholder(Graphics g, PaperCard card) { //Use CardImageRenderer to output a Texture.
|
||||
private Texture renderPlaceholder(Graphics g, PaperCard card, boolean alternate) { //Use CardImageRenderer to output a Texture.
|
||||
if (renderedCount++ == 0) {
|
||||
//The first time we find a card that has no art, render one out of view to fully initialize CardImageRenderer.
|
||||
g.begin(preview_w, preview_h);
|
||||
@@ -456,7 +461,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
|
||||
g.begin(preview_w, preview_h);
|
||||
g.setProjectionMatrix(m);
|
||||
g.startClip();
|
||||
CardImageRenderer.drawCardImage(g, CardView.getCardForUi(card), false, 0, 0, preview_w, preview_h, CardRenderer.CardStackPosition.Top, Forge.allowCardBG, true);
|
||||
CardImageRenderer.drawCardImage(g, CardView.getCardForUi(card), alternate, 0, 0, preview_w, preview_h, CardRenderer.CardStackPosition.Top, Forge.allowCardBG, true);
|
||||
g.end();
|
||||
g.endClip();
|
||||
//Rendering ends here. Create a new Pixmap to Texture with mipmaps, otherwise will render as full black.
|
||||
@@ -623,7 +628,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
|
||||
drawCard(batch, image, x, width);
|
||||
} else if (!loaded) {
|
||||
if (T == null)
|
||||
T = renderPlaceholder(getGraphics(), reward.getCard());
|
||||
T = renderPlaceholder(getGraphics(), reward.getCard(), false);
|
||||
drawCard(batch, T, x, width);
|
||||
}
|
||||
} else if (image != null) {
|
||||
@@ -816,6 +821,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
|
||||
shown = false;
|
||||
}
|
||||
}
|
||||
|
||||
class RewardImage extends Image {
|
||||
public RewardImage(TextureRegionDrawable processDrawable) {
|
||||
setDrawable(processDrawable);
|
||||
|
||||
@@ -44,7 +44,7 @@ public class VAvatar extends FDisplayObject {
|
||||
avatarAnimation = new AvatarAnimation();
|
||||
}
|
||||
private class AvatarAnimation extends ForgeAnimation {
|
||||
private static final float DURATION = 0.6f;
|
||||
private static final float DURATION = 1.2f;
|
||||
private float progress = 0;
|
||||
Texture splatter = FSkin.splatter;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user