- change terminology from filename to image key

- make icons use the image cache
- display the avatar icon for the player when assigning damage from creatures with trample
This commit is contained in:
myk
2013-03-13 17:01:34 +00:00
parent c54cc4dfe6
commit 6e21d10345
34 changed files with 146 additions and 246 deletions

View File

@@ -251,9 +251,6 @@ public class Card extends GameEntity implements Comparable<Card> {
this.characteristicsMap.put(CardCharacteristicName.FaceDown, CardUtil.getFaceDownCharacteristic()); this.characteristicsMap.put(CardCharacteristicName.FaceDown, CardUtil.getFaceDownCharacteristic());
} }
/**
* TODO: Write javadoc for this method.
*/
public void refreshUniqueNumber() { public void refreshUniqueNumber() {
this.setUniqueNumber(Card.nextUniqueNumber++); this.setUniqueNumber(Card.nextUniqueNumber++);
} }
@@ -8514,27 +8511,12 @@ public class Card extends GameEntity implements Comparable<Card> {
return CardDb.instance().getCard(this.getName()).getEdition(); return CardDb.instance().getCard(this.getName()).getEdition();
} }
/** public final void setImageKey(final String iFN) {
* <p> this.getCharacteristics().setImageKey(iFN);
* setImageFilename.
* </p>
*
* @param iFN
* a {@link java.lang.String} object.
*/
public final void setImageFilename(final String iFN) {
this.getCharacteristics().setImageFilename(iFN);
} }
/** public final String getImageKey() {
* <p> return this.getCharacteristics().getImageKey();
* getImageFilename.
* </p>
*
* @return a {@link java.lang.String} object.
*/
public final String getImageFilename() {
return this.getCharacteristics().getImageFilename();
} }
/** /**

View File

@@ -202,7 +202,7 @@ public final class CardUtil {
ret.setName(""); ret.setName("");
ret.setType(types); ret.setType(types);
ret.setImageFilename(NewConstants.CACHE_MORPH_IMAGE_FILE); ret.setImageKey(NewConstants.CACHE_MORPH_IMAGE_FILE);
return ret; return ret;
} }

View File

@@ -20,11 +20,15 @@ package forge;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import javax.swing.ImageIcon;
import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader.InvalidCacheLoadException; import com.google.common.cache.CacheLoader.InvalidCacheLoadException;
import com.google.common.cache.LoadingCache; import com.google.common.cache.LoadingCache;
import com.mortennobel.imagescaling.ResampleOp; import com.mortennobel.imagescaling.ResampleOp;
import forge.game.player.IHasIcon;
import forge.gui.toolbox.FSkin;
import forge.item.InventoryItem; import forge.item.InventoryItem;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.properties.NewConstants; import forge.properties.NewConstants;
@@ -46,6 +50,7 @@ import forge.properties.NewConstants;
public class ImageCache { public class ImageCache {
// short prefixes to save memory // short prefixes to save memory
public static final String TOKEN_PREFIX = "t:"; public static final String TOKEN_PREFIX = "t:";
public static final String ICON_PREFIX = "i:";
public static final String BOOSTER_PREFIX = "b:"; public static final String BOOSTER_PREFIX = "b:";
public static final String FATPACK_PREFIX = "f:"; public static final String FATPACK_PREFIX = "f:";
public static final String PRECON_PREFIX = "p:"; public static final String PRECON_PREFIX = "p:";
@@ -53,22 +58,42 @@ public class ImageCache {
static private final LoadingCache<String, BufferedImage> CACHE = CacheBuilder.newBuilder().softValues().build(new ImageLoader()); static private final LoadingCache<String, BufferedImage> CACHE = CacheBuilder.newBuilder().softValues().build(new ImageLoader());
public static BufferedImage getImage(final Card card, final int width, final int height) { /**
* retrieve an image from the cache. returns null if the image is not found in the cache
* and cannot be loaded from disk. pass -1 for width and/or height to avoid resizing in that dimension.
*/
public static BufferedImage getImage(Card card, int width, int height) {
final String key; final String key;
if (!card.canBeShownTo(Singletons.getControl().getPlayer()) || card.isFaceDown()) { if (!card.canBeShownTo(Singletons.getControl().getPlayer()) || card.isFaceDown()) {
key = TOKEN_PREFIX + NewConstants.CACHE_MORPH_IMAGE_FILE; key = TOKEN_PREFIX + NewConstants.CACHE_MORPH_IMAGE_FILE;
} else { } else {
key = card.getImageFilename(); key = card.getImageKey();
} }
return scaleImage(key, width, height); return scaleImage(key, width, height);
} }
public static BufferedImage getImage(final InventoryItem ii, final int width, final int height) { /**
return scaleImage(ii.getImageFilename(), width, height); * retrieve an image from the cache. returns null if the image is not found in the cache
* and cannot be loaded from disk. pass -1 for width and/or height to avoid resizing in that dimension.
*/
public static BufferedImage getImage(InventoryItem ii, int width, int height) {
return scaleImage(ii.getImageKey(), width, height);
}
/**
* retrieve an icon from the cache. returns the current skin's ICO_UNKNOWN if the icon image is not found
* in the cache and cannot be loaded from disk.
*/
public static ImageIcon getIcon(IHasIcon ihi) {
BufferedImage i = scaleImage(ihi.getIconImageKey(), -1, -1);
if (null == i) {
return FSkin.getIcon(FSkin.InterfaceIcons.ICO_UNKNOWN);
}
return new ImageIcon(i);
} }
private static BufferedImage scaleImage(String key, final int width, final int height) { private static BufferedImage scaleImage(String key, final int width, final int height) {
if (3 > width || 3 > height) { if ((3 > width && -1 != width) || (3 > height && -1 != height)) {
// picture too small; return a blank // picture too small; return a blank
return null; return null;
} }
@@ -84,11 +109,13 @@ public class ImageCache {
boolean mayEnlarge = Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_SCALE_LARGER); boolean mayEnlarge = Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_SCALE_LARGER);
BufferedImage original = getImage(key); BufferedImage original = getImage(key);
if ( null == original ) if (null == original) {
return null; return null;
}
double scale = Math.min((double) width / original.getWidth(), (double) height / original.getHeight()); double scale = Math.min(
// here would be the place to limit the scaling option in menu ? -1 == width ? 1 : (double)width / original.getWidth(),
-1 == height? 1 : (double)height / original.getHeight());
if ((scale > 1) && !mayEnlarge) { if ((scale > 1) && !mayEnlarge) {
scale = 1; scale = 1;
} }
@@ -104,6 +131,7 @@ public class ImageCache {
result = resampler.filter(original, null); result = resampler.filter(original, null);
CACHE.put(resizedKey, result); CACHE.put(resizedKey, result);
} }
return result; return result;
} }

View File

@@ -6,6 +6,8 @@ import java.io.IOException;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import org.apache.commons.lang3.StringUtils;
import com.google.common.cache.CacheLoader; import com.google.common.cache.CacheLoader;
import forge.error.BugReporter; import forge.error.BugReporter;
@@ -18,11 +20,18 @@ final class ImageLoader extends CacheLoader<String, BufferedImage> {
@Override @Override
public BufferedImage load(String key) { public BufferedImage load(String key) {
if (StringUtils.isEmpty(key)) {
return null;
}
final String path; final String path;
final String filename; final String filename;
if (key.startsWith(ImageCache.TOKEN_PREFIX)) { if (key.startsWith(ImageCache.TOKEN_PREFIX)) {
filename = key.substring(ImageCache.TOKEN_PREFIX.length()); filename = key.substring(ImageCache.TOKEN_PREFIX.length());
path = NewConstants.CACHE_TOKEN_PICS_DIR; path = NewConstants.CACHE_TOKEN_PICS_DIR;
} else if (key.startsWith(ImageCache.ICON_PREFIX)) {
filename = key.substring(ImageCache.ICON_PREFIX.length());
path = NewConstants.CACHE_ICON_PICS_DIR;
} else if (key.startsWith(ImageCache.BOOSTER_PREFIX)) { } else if (key.startsWith(ImageCache.BOOSTER_PREFIX)) {
filename = key.substring(ImageCache.BOOSTER_PREFIX.length()); filename = key.substring(ImageCache.BOOSTER_PREFIX.length());
path = NewConstants.CACHE_BOOSTER_PICS_DIR; path = NewConstants.CACHE_BOOSTER_PICS_DIR;

View File

@@ -50,7 +50,7 @@ public class CardCharacteristics {
private ArrayList<ReplacementEffect> replacementEffects = new ArrayList<ReplacementEffect>(); private ArrayList<ReplacementEffect> replacementEffects = new ArrayList<ReplacementEffect>();
private ArrayList<StaticAbility> staticAbilities = new ArrayList<StaticAbility>(); private ArrayList<StaticAbility> staticAbilities = new ArrayList<StaticAbility>();
private ArrayList<String> staticAbilityStrings = new ArrayList<String>(); private ArrayList<String> staticAbilityStrings = new ArrayList<String>();
private String imageFilename = ""; private String imageKey = "";
private Map<String, String> sVars = new TreeMap<String, String>(); private Map<String, String> sVars = new TreeMap<String, String>();
private CardRarity rarity = CardRarity.Unknown; private CardRarity rarity = CardRarity.Unknown;
@@ -279,8 +279,8 @@ public class CardCharacteristics {
* *
* @return the imageFilename * @return the imageFilename
*/ */
public final String getImageFilename() { public final String getImageKey() {
return this.imageFilename; return this.imageKey;
} }
/** /**
@@ -289,8 +289,8 @@ public class CardCharacteristics {
* @param imageFilename0 * @param imageFilename0
* the imageFilename to set * the imageFilename to set
*/ */
public final void setImageFilename(final String imageFilename0) { public final void setImageKey(final String imageFilename0) {
this.imageFilename = imageFilename0; this.imageKey = imageFilename0;
} }
/** /**
@@ -410,7 +410,7 @@ public class CardCharacteristics {
// ArrayList<String> staticAbilityStrings : list of String objects so use copy constructor // ArrayList<String> staticAbilityStrings : list of String objects so use copy constructor
this.staticAbilityStrings = new ArrayList<String>(source.getStaticAbilityStrings()); this.staticAbilityStrings = new ArrayList<String>(source.getStaticAbilityStrings());
// String imageFilename = copy reference // String imageFilename = copy reference
this.imageFilename = source.getImageFilename(); this.imageKey = source.getImageKey();
this.rarity = source.rarity; this.rarity = source.rarity;
this.curSetCode = source.curSetCode; this.curSetCode = source.curSetCode;
// Map<String, String> sVars // Map<String, String> sVars

View File

@@ -86,7 +86,7 @@ public class CloneEffect extends SpellAbilityEffect {
tgtCard = cloneTargets.get(0); tgtCard = cloneTargets.get(0);
} }
String imageFileName = host.getImageFilename(); String imageFileName = host.getImageKey();
boolean keepName = sa.hasParam("KeepName"); boolean keepName = sa.hasParam("KeepName");
String originalName = tgtCard.getName(); String originalName = tgtCard.getName();
@@ -152,7 +152,7 @@ public class CloneEffect extends SpellAbilityEffect {
} }
tgtCard.setFlipCard(true); tgtCard.setFlipCard(true);
//keep the Clone card image for the cloned card //keep the Clone card image for the cloned card
tgtCard.setImageFilename(imageFileName); tgtCard.setImageKey(imageFileName);
if (!tgtCard.isFlipped()) { if (!tgtCard.isFlipped()) {
tgtCard.setState(CardCharacteristicName.Original); tgtCard.setState(CardCharacteristicName.Original);
@@ -171,7 +171,7 @@ public class CloneEffect extends SpellAbilityEffect {
tgtCard.clearImprinted(); tgtCard.clearImprinted();
//keep the Clone card image for the cloned card //keep the Clone card image for the cloned card
tgtCard.setImageFilename(imageFileName); tgtCard.setImageKey(imageFileName);
// check if clone is now an Aura that needs to be attached // check if clone is now an Aura that needs to be attached
if (tgtCard.isAura()) { if (tgtCard.isAura()) {

View File

@@ -94,7 +94,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
copy = CardFactory.copyStats(c); copy = CardFactory.copyStats(c);
copy.setName(c.getName()); copy.setName(c.getName());
copy.setImageFilename(c.getImageFilename()); copy.setImageKey(c.getImageKey());
copy.setOwner(controller); copy.setOwner(controller);
copy.addController(controller); copy.addController(controller);
@@ -126,7 +126,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
if (c.isFlipCard()) { // Cloned Flips CAN flip. if (c.isFlipCard()) { // Cloned Flips CAN flip.
copy.setState(CardCharacteristicName.Original); copy.setState(CardCharacteristicName.Original);
c.setState(CardCharacteristicName.Original); c.setState(CardCharacteristicName.Original);
copy.setImageFilename(c.getImageFilename()); copy.setImageKey(c.getImageKey());
if (!c.isInAlternateState()) { if (!c.isInAlternateState()) {
copy.setState(CardCharacteristicName.Flipped); copy.setState(CardCharacteristicName.Flipped);
} }

View File

@@ -104,7 +104,7 @@ public class EffectEffect extends SpellAbilityEffect {
// nuked // nuked
eff.addController(controller); eff.addController(controller);
eff.setOwner(controller); eff.setOwner(controller);
eff.setImageFilename(sa.hasParam("Image") ? sa.getParam("Image") : hostCard.getImageFilename()); eff.setImageKey(sa.hasParam("Image") ? sa.getParam("Image") : hostCard.getImageKey());
eff.setColor(hostCard.getColor()); eff.setColor(hostCard.getColor());
eff.setImmutable(true); eff.setImmutable(true);
eff.setEffectSource(hostCard); eff.setEffectSource(hostCard);

View File

@@ -224,27 +224,27 @@ public class CardFactory {
c.setCurSetCode(cp.getEdition()); c.setCurSetCode(cp.getEdition());
c.setRarity(cp.getRarity()); c.setRarity(cp.getRarity());
String originalPicture = cp.getImageFilename(); String originalPicture = cp.getImageKey();
//System.out.println(c.getName() + " -> " + originalPicture); //System.out.println(c.getName() + " -> " + originalPicture);
c.setImageFilename(originalPicture); c.setImageKey(originalPicture);
c.setToken(cp.isToken()); c.setToken(cp.isToken());
if (c.hasAlternateState()) { if (c.hasAlternateState()) {
if (c.isFlipCard()) { if (c.isFlipCard()) {
c.setState(CardCharacteristicName.Flipped); c.setState(CardCharacteristicName.Flipped);
c.setImageFilename(originalPicture); // should assign a 180 degrees rotated picture here? c.setImageKey(originalPicture); // should assign a 180 degrees rotated picture here?
} }
else if (c.isDoubleFaced() && cp instanceof CardPrinted) { else if (c.isDoubleFaced() && cp instanceof CardPrinted) {
c.setState(CardCharacteristicName.Transformed); c.setState(CardCharacteristicName.Transformed);
c.setImageFilename(((CardPrinted)cp).getImageFilename(true)); c.setImageKey(((CardPrinted)cp).getImageKey(true));
} }
else if (c.getRules().getSplitType() == CardSplitType.Split) { else if (c.getRules().getSplitType() == CardSplitType.Split) {
c.setState(CardCharacteristicName.LeftSplit); c.setState(CardCharacteristicName.LeftSplit);
c.setImageFilename(originalPicture); c.setImageKey(originalPicture);
c.setCurSetCode(cp.getEdition()); c.setCurSetCode(cp.getEdition());
c.setRarity(cp.getRarity()); c.setRarity(cp.getRarity());
c.setState(CardCharacteristicName.RightSplit); c.setState(CardCharacteristicName.RightSplit);
c.setImageFilename(originalPicture); c.setImageKey(originalPicture);
} }
c.setCurSetCode(cp.getEdition()); c.setCurSetCode(cp.getEdition());
@@ -456,7 +456,7 @@ public class CardFactory {
to.setSVars(from.getSVars()); to.setSVars(from.getSVars());
to.setIntrinsicAbilities(from.getIntrinsicAbilities()); to.setIntrinsicAbilities(from.getIntrinsicAbilities());
to.setImageFilename(from.getImageFilename()); to.setImageKey(from.getImageKey());
to.setTriggers(from.getTriggers()); to.setTriggers(from.getTriggers());
to.setReplacementEffects(from.getReplacementEffects()); to.setReplacementEffects(from.getReplacementEffects());
to.setStaticAbilityStrings(from.getStaticAbilityStrings()); to.setStaticAbilityStrings(from.getStaticAbilityStrings());

View File

@@ -2448,7 +2448,7 @@ public class CardFactoryUtil {
final List<Card> list = new ArrayList<Card>(); final List<Card> list = new ArrayList<Card>();
final Card c = new Card(); final Card c = new Card();
c.setName(name); c.setName(name);
c.setImageFilename(imageName); c.setImageKey(imageName);
// TODO - most tokens mana cost is 0, this needs to be fixed // TODO - most tokens mana cost is 0, this needs to be fixed
// c.setManaCost(manaCost); // c.setManaCost(manaCost);
@@ -2509,7 +2509,7 @@ public class CardFactoryUtil {
final List<String> kal = thisToken.getIntrinsicKeyword(); final List<String> kal = thisToken.getIntrinsicKeyword();
final String[] tokenKeywords = new String[kal.size()]; final String[] tokenKeywords = new String[kal.size()];
kal.toArray(tokenKeywords); kal.toArray(tokenKeywords);
final List<Card> tokens = CardFactoryUtil.makeToken(thisToken.getName(), thisToken.getImageFilename(), final List<Card> tokens = CardFactoryUtil.makeToken(thisToken.getName(), thisToken.getImageKey(),
thisToken.getController(), thisToken.getManaCost().toString(), tokenTypes, thisToken.getBaseAttack(), thisToken.getController(), thisToken.getManaCost().toString(), tokenTypes, thisToken.getBaseAttack(),
thisToken.getBaseDefense(), tokenKeywords); thisToken.getBaseDefense(), tokenKeywords);

View File

@@ -60,7 +60,7 @@ public class GameNew {
if (preferences.getPrefBoolean(FPref.UI_RANDOM_CARD_ART)) { if (preferences.getPrefBoolean(FPref.UI_RANDOM_CARD_ART)) {
final int cntVariants = cardPrinted.getRules().getEditionInfo(cardPrinted.getEdition()).getCopiesCount(); final int cntVariants = cardPrinted.getRules().getEditionInfo(cardPrinted.getEdition()).getCopiesCount();
if (cntVariants > 1) { if (cntVariants > 1) {
card.setImageFilename(cardPrinted.getImageFilename(false, generator.nextInt(cntVariants), true)); card.setImageKey(cardPrinted.getImageKey(false, generator.nextInt(cntVariants), true));
} }
} }

View File

@@ -0,0 +1,6 @@
package forge.game.player;
public interface IHasIcon {
String getIconImageKey();
void setIconImageKey(String iconImageKey);
}

View File

@@ -6,18 +6,15 @@ package forge.game.player;
* May store player's assets here. * May store player's assets here.
* *
*/ */
public class LobbyPlayer { public class LobbyPlayer implements IHasIcon {
protected final PlayerType type; protected final PlayerType type;
public final PlayerType getType() { public final PlayerType getType() {
return type; return type;
} }
protected final String name; protected final String name;
// string with picture is more important than avatar index protected String imageKey;
protected String picture;
private int avatarIndex = -1; private int avatarIndex = -1;
public LobbyPlayer(PlayerType type, String name) { public LobbyPlayer(PlayerType type, String name) {
@@ -26,18 +23,16 @@ public class LobbyPlayer {
this.name = name; this.name = name;
} }
public final String getPicture() { @Override
return picture; public final String getIconImageKey() {
return imageKey;
} }
public final void setPicture(String picture) { @Override
this.picture = picture; public final void setIconImageKey(String imageKey) {
this.imageKey = imageKey;
} }
/**
* TODO: Write javadoc for this method.
* @return
*/
public String getName() { public String getName() {
return name; return name;
} }

View File

@@ -296,7 +296,7 @@ public class MigrationSourceAnalyzer {
int numPics = urls.split("\\\\").length; int numPics = urls.split("\\\\").length;
for (int artIdx = 0; numPics > artIdx; ++artIdx) { for (int artIdx = 0; numPics > artIdx; ++artIdx) {
String filename = c.getImageFilename(backFace, artIdx, false) + ".jpg"; String filename = c.getImageKey(backFace, artIdx, false) + ".jpg";
_defaultPicNames.add(filename); _defaultPicNames.add(filename);
String oldFilenameBase = _oldCleanString(filename.replace(".full.jpg", "")); String oldFilenameBase = _oldCleanString(filename.replace(".full.jpg", ""));
@@ -360,9 +360,9 @@ public class MigrationSourceAnalyzer {
private static void _addSetCards(Set<String> cardFileNames, Iterable<CardPrinted> library, Predicate<CardPrinted> filter) { private static void _addSetCards(Set<String> cardFileNames, Iterable<CardPrinted> library, Predicate<CardPrinted> filter) {
for (CardPrinted c : Iterables.filter(library, filter)) { for (CardPrinted c : Iterables.filter(library, filter)) {
boolean hasBackFace = null != c.getRules().getPictureOtherSideUrl(); boolean hasBackFace = null != c.getRules().getPictureOtherSideUrl();
cardFileNames.add(c.getImageFilename(false, c.getArtIndex(), true) + ".jpg"); cardFileNames.add(c.getImageKey(false, c.getArtIndex(), true) + ".jpg");
if (hasBackFace) { if (hasBackFace) {
cardFileNames.add(c.getImageFilename(true, c.getArtIndex(), true) + ".jpg"); cardFileNames.add(c.getImageKey(true, c.getArtIndex(), true) + ".jpg");
} }
} }
} }

View File

@@ -71,7 +71,7 @@ public class GuiDownloadPicturesLQ extends GuiDownloader {
for (String url : urls.split("\\\\")) { for (String url : urls.split("\\\\")) {
++artIdx; ++artIdx;
String filename = c.getImageFilename(backFace, artIdx, false); String filename = c.getImageKey(backFace, artIdx, false);
if (filenames.contains(filename)) { if (filenames.contains(filename)) {
continue; continue;
} }

View File

@@ -45,9 +45,9 @@ public class GuiDownloadSetPicturesLQ extends GuiDownloader {
continue; continue;
} }
addDLObject(c.getImageUrlPath(false), c.getImageFilename(), downloads); addDLObject(c.getImageUrlPath(false), c.getImageKey(), downloads);
String backFaceImage = c.getImageFilename(true); String backFaceImage = c.getImageKey(true);
if (backFaceImage != null) { if (backFaceImage != null) {
addDLObject(c.getImageUrlPath(true), backFaceImage, downloads); addDLObject(c.getImageUrlPath(true), backFaceImage, downloads);
} }

View File

@@ -7,19 +7,17 @@ import java.awt.Graphics;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.Image; import java.awt.Image;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.File;
import javax.swing.ImageIcon;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JRadioButton; import javax.swing.JRadioButton;
import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import forge.ImageCache;
import forge.gui.toolbox.FRadioButton; import forge.gui.toolbox.FRadioButton;
import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FTextArea; import forge.gui.toolbox.FTextArea;
import forge.properties.NewConstants;
import forge.quest.QuestEvent; import forge.quest.QuestEvent;
/** /**
@@ -52,16 +50,7 @@ class PnlEvent extends JPanel {
public PnlEvent(final QuestEvent e0) { public PnlEvent(final QuestEvent e0) {
super(); super();
this.event = e0; this.event = e0;
img = ImageCache.getIcon(e0).getImage();
// Icon
final File file = new File(NewConstants.CACHE_ICON_PICS_DIR, event.getIconFilename());
if (!file.exists()) {
img = FSkin.getIcon(FSkin.InterfaceIcons.ICO_UNKNOWN).getImage();
}
else {
img = (new ImageIcon(file.toString())).getImage();
}
wSrc = img.getWidth(null); wSrc = img.getWidth(null);
hSrc = img.getHeight(null); hSrc = img.getHeight(null);
@@ -103,8 +92,6 @@ class PnlEvent extends JPanel {
@Override @Override
public void paintComponent(final Graphics g) { public void paintComponent(final Graphics g) {
// super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create(); Graphics2D g2d = (Graphics2D) g.create();
g2d.setPaint(new GradientPaint(0, 0, clr3, getWidth(), 0, clr2)); g2d.setPaint(new GradientPaint(0, 0, clr3, getWidth(), 0, clr2));
g2d.fillRect(0, 0, getWidth(), getHeight()); g2d.fillRect(0, 0, getWidth(), getHeight());

View File

@@ -419,7 +419,7 @@ public class SSubmenuQuestUtil {
msh.addPlayer(Singletons.getControl().getLobby().getQuestPlayer(), humanStart); msh.addPlayer(Singletons.getControl().getLobby().getQuestPlayer(), humanStart);
LobbyPlayer aiPlayer = Singletons.getControl().getLobby().findLocalPlayer(PlayerType.COMPUTER, event.getOpponent() == null ? event.getTitle() : event.getOpponent()); LobbyPlayer aiPlayer = Singletons.getControl().getLobby().findLocalPlayer(PlayerType.COMPUTER, event.getOpponent() == null ? event.getTitle() : event.getOpponent());
aiPlayer.setPicture(event.getIconFilename()); aiPlayer.setIconImageKey(event.getIconImageKey());
msh.addPlayer(aiPlayer, aiStart); msh.addPlayer(aiPlayer, aiStart);
Singletons.getModel().getMatch().initMatch(GameType.Quest, msh.getPlayerMap()); Singletons.getModel().getMatch().initMatch(GameType.Quest, msh.getPlayerMap());

View File

@@ -17,8 +17,6 @@
*/ */
package forge.gui.match; package forge.gui.match;
import java.awt.Image;
import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@@ -28,8 +26,10 @@ import javax.swing.ImageIcon;
import forge.Card; import forge.Card;
import forge.GameEntity; import forge.GameEntity;
import forge.ImageCache;
import forge.Singletons; import forge.Singletons;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.gui.framework.EDocID; import forge.gui.framework.EDocID;
import forge.gui.match.controllers.CDetail; import forge.gui.match.controllers.CDetail;
@@ -42,7 +42,6 @@ import forge.gui.match.nonsingleton.VHand;
import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin;
import forge.item.InventoryItem; import forge.item.InventoryItem;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.properties.NewConstants;
/** /**
* Constructs instance of match UI controller, used as a single point of * Constructs instance of match UI controller, used as a single point of
@@ -53,25 +52,21 @@ import forge.properties.NewConstants;
* <br><br><i>(C at beginning of class name denotes a control class.)</i> * <br><br><i>(C at beginning of class name denotes a control class.)</i>
*/ */
public enum CMatchUI { public enum CMatchUI {
/** */
SINGLETON_INSTANCE; SINGLETON_INSTANCE;
private Image getPlayerAvatar(final Player p, final int defaultIndex) { private ImageIcon getPlayerAvatar(final Player p, final int defaultIndex) {
String strAvatarIcon = p.getLobbyPlayer().getPicture(); LobbyPlayer lp = p.getLobbyPlayer();
if (strAvatarIcon != null) { ImageIcon ret = ImageCache.getIcon(lp);
final File f = new File(NewConstants.CACHE_ICON_PICS_DIR, strAvatarIcon); if (null == ret) {
if (f.exists()) { int iAvatar = lp.getAvatarIndex();
return new ImageIcon(f.getPath()).getImage(); return new ImageIcon(FSkin.getAvatars().get(iAvatar >= 0 ? iAvatar : defaultIndex));
} }
} return ret;
int iAvatar = p.getLobbyPlayer().getAvatarIndex();
return FSkin.getAvatars().get(iAvatar >= 0 ? iAvatar : defaultIndex);
} }
private void setAvatar(final VField view, final Image img) { private void setAvatar(VField view, ImageIcon img) {
view.getLblAvatar().setIcon(img);
view.getLblAvatar().setIcon(new ImageIcon(img));
view.getLblAvatar().getResizeTimer().start(); view.getLblAvatar().getResizeTimer().start();
} }
@@ -95,7 +90,7 @@ public enum CMatchUI {
VCommand humanCommand = new VCommand(EDocID.COMMAND_0, localPlayer); VCommand humanCommand = new VCommand(EDocID.COMMAND_0, localPlayer);
fields.add(0, humanField); fields.add(0, humanField);
commands.add(0, humanCommand); commands.add(0, humanCommand);
setAvatar(humanField, FSkin.getAvatars().get(Integer.parseInt(indices[0]))); setAvatar(humanField, new ImageIcon(FSkin.getAvatars().get(Integer.parseInt(indices[0]))));
humanField.getLayoutControl().initialize(); humanField.getLayoutControl().initialize();
humanCommand.getLayoutControl().initialize(); humanCommand.getLayoutControl().initialize();
@@ -107,7 +102,7 @@ public enum CMatchUI {
// A field must be initialized after it's instantiated, to update player info. // A field must be initialized after it's instantiated, to update player info.
// No player, no init. // No player, no init.
VField f = new VField(EDocID.valueOf("FIELD_" + i), p, localPlayer); VField f = new VField(EDocID.valueOf("FIELD_" + i), p, localPlayer);
setAvatar(f, getPlayerAvatar(p, Integer.parseInt(indices[i % 2]))); setAvatar(f, getPlayerAvatar(p, Integer.parseInt(indices[1])));
f.getLayoutControl().initialize(); f.getLayoutControl().initialize();
fields.add(f); fields.add(f);
VCommand c = new VCommand(EDocID.valueOf("COMMAND_" + i), p); VCommand c = new VCommand(EDocID.valueOf("COMMAND_" + i), p);

View File

@@ -189,7 +189,12 @@ public class VAssignDamage {
Card fakeCard; Card fakeCard;
if (defender instanceof Card) if (defender instanceof Card)
fakeCard = (Card)defender; fakeCard = (Card)defender;
else { else if (defender instanceof Player) {
fakeCard = new Card();
fakeCard.setName(this.defender.getName());
Player p = (Player)defender;
fakeCard.setImageKey(p.getLobbyPlayer().getIconImageKey());
} else {
fakeCard = new Card(); fakeCard = new Card();
fakeCard.setName(this.defender.getName()); fakeCard.setName(this.defender.getName());
} }

View File

@@ -39,7 +39,7 @@ public class BoosterPack extends OpenablePack {
} }
@Override @Override
public final String getImageFilename() { public final String getImageKey() {
return ImageCache.BOOSTER_PREFIX + this.contents.getEdition(); return ImageCache.BOOSTER_PREFIX + this.contents.getEdition();
} }

View File

@@ -139,15 +139,15 @@ public final class CardPrinted implements Comparable<IPaperCard>, InventoryItemF
} }
@Override @Override
public String getImageFilename() { public String getImageKey() {
return getImageLocator(getImageName(), getArtIndex(), true, false); return getImageLocator(getImageName(), getArtIndex(), true, false);
} }
public String getImageFilename(boolean backFace) { public String getImageKey(boolean backFace) {
return getImageFilename(backFace, getArtIndex(), true); return getImageKey(backFace, getArtIndex(), true);
} }
public String getImageFilename(boolean backFace, int artIdx, boolean includeSet) { public String getImageKey(boolean backFace, int artIdx, boolean includeSet) {
final String nameToUse; final String nameToUse;
if (backFace) { if (backFace) {
if (null == card.getOtherPart()) { if (null == card.getOtherPart()) {

View File

@@ -61,7 +61,7 @@ public class CardToken implements InventoryItemFromSet, IPaperCard {
@Override public CardRarity getRarity() { return CardRarity.Common; } // They don't have rarity though! @Override public CardRarity getRarity() { return CardRarity.Common; } // They don't have rarity though!
@Override public String getImageFilename() { return imageFileName; } @Override public String getImageKey() { return imageFileName; }
@Override public String getItemType() { return "Token"; } @Override public String getItemType() { return "Token"; }
@Override public Card getMatchingForgeCard() { return toForgeCard(null); } // hope this won't be queried too frequently, so no cache @Override public Card getMatchingForgeCard() { return toForgeCard(null); } // hope this won't be queried too frequently, so no cache

View File

@@ -52,7 +52,7 @@ public class FatPack extends OpenablePack {
} }
@Override @Override
public final String getImageFilename() { public final String getImageKey() {
return ImageCache.FATPACK_PREFIX + this.contents.getEdition(); return ImageCache.FATPACK_PREFIX + this.contents.getEdition();
} }

View File

@@ -155,7 +155,7 @@ public interface IPaperCard {
public abstract boolean isToken(); public abstract boolean isToken();
public abstract CardRules getRules(); public abstract CardRules getRules();
public abstract CardRarity getRarity(); public abstract CardRarity getRarity();
public abstract String getImageFilename(); public abstract String getImageKey();
public abstract String getItemType(); public abstract String getItemType();

View File

@@ -35,7 +35,7 @@ public interface InventoryItem {
* *
* @return the image filename * @return the image filename
*/ */
String getImageFilename(); String getImageKey();
/** /**
* Return type as a string. * Return type as a string.

View File

@@ -59,7 +59,7 @@ public class PreconDeck implements InventoryItemFromSet {
* @see forge.item.InventoryItemFromSet#getImageFilename() * @see forge.item.InventoryItemFromSet#getImageFilename()
*/ */
@Override @Override
public String getImageFilename() { public String getImageKey() {
return ImageCache.PRECON_PREFIX + imageFilename; return ImageCache.PRECON_PREFIX + imageFilename;
} }

View File

@@ -43,7 +43,7 @@ public class TournamentPack extends OpenablePack {
} }
@Override @Override
public final String getImageFilename() { public final String getImageKey() {
return ImageCache.TOURNAMENTPACK_PREFIX + contents.getEdition(); return ImageCache.TOURNAMENTPACK_PREFIX + contents.getEdition();
} }

View File

@@ -22,6 +22,7 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import forge.deck.Deck; import forge.deck.Deck;
import forge.game.player.IHasIcon;
import forge.item.InventoryItem; import forge.item.InventoryItem;
/** /**
@@ -32,177 +33,74 @@ import forge.item.InventoryItem;
* MODEL - A basic event instance in Quest mode. Can be extended for use in * MODEL - A basic event instance in Quest mode. Can be extended for use in
* unique event types: battles, quests, and others. * unique event types: battles, quests, and others.
*/ */
public abstract class QuestEvent { public abstract class QuestEvent implements IHasIcon {
// Default vals if none provided in the event file. // Default vals if none provided in the event file.
/** The event deck. */
private Deck eventDeck = null; private Deck eventDeck = null;
/** The title. */
private String title = "Mystery Event"; private String title = "Mystery Event";
/** The description. */
private String description = ""; private String description = "";
/** The difficulty. */
private String difficulty = "Medium"; private String difficulty = "Medium";
private String imageKey = "";
/** Filename of the icon for this event. */
private String iconFilename = "unknown";
/** The name. */
private String name = "Noname"; private String name = "Noname";
/** The card reward. */
private String cardReward = null; private String cardReward = null;
/** The card reward list. */
private List<InventoryItem> cardRewardList = null; private List<InventoryItem> cardRewardList = null;
/**
* <p>
* getTitle.
* </p>
*
* @return a {@link java.lang.String}.
*/
public final String getTitle() { public final String getTitle() {
return this.title; return this.title;
} }
/** /**
* <p>
* getOpponent.
* Returns null for standard quest events, may return something different for challenges. * Returns null for standard quest events, may return something different for challenges.
* </p>
*
* @return a {@link java.lang.String}.
*/ */
public String getOpponent() { public String getOpponent() {
return null; return null;
} }
/**
* <p>
* getDifficulty.
* </p>
*
* @return a {@link java.lang.String}.
*/
public final String getDifficulty() { public final String getDifficulty() {
return this.difficulty; return this.difficulty;
} }
/**
* <p>
* getDescription.
* </p>
*
* @return a {@link java.lang.String}.
*/
public final String getDescription() { public final String getDescription() {
return this.description; return this.description;
} }
/**
* <p>
* getEventDeck.
* </p>
*
* @return {@link forge.deck.Deck}
*/
public final Deck getEventDeck() { public final Deck getEventDeck() {
return this.eventDeck; return this.eventDeck;
} }
/** @Override
* <p> public final String getIconImageKey() {
* getIconFilename. return this.imageKey;
* </p>
*
* @return a {@link java.lang.String}.
*/
public final String getIconFilename() {
return this.iconFilename;
} }
/**
* <p>
* getName.
* </p>
*
* @return a {@link java.lang.String}.
*/
public final String getName() { public final String getName() {
return this.name; return this.name;
} }
/**
* Sets the name.
*
* @param name0
* the name to set
*/
public void setName(final String name0) { public void setName(final String name0) {
this.name = name0; this.name = name0;
} }
/**
* Sets the title.
*
* @param title0
* the title to set
*/
public void setTitle(final String title0) { public void setTitle(final String title0) {
this.title = title0; this.title = title0;
} }
/**
* Sets the difficulty.
*
* @param difficulty0
* the difficulty to set
*/
public void setDifficulty(final String difficulty0) { public void setDifficulty(final String difficulty0) {
this.difficulty = difficulty0; this.difficulty = difficulty0;
} }
/**
* Sets the description.
*
* @param description0
* the description to set
*/
public void setDescription(final String description0) { public void setDescription(final String description0) {
this.description = description0; this.description = description0;
} }
/**
* Sets the event deck.
*
* @param eventDeck0
* the eventDeck to set
*/
public void setEventDeck(final Deck eventDeck0) { public void setEventDeck(final Deck eventDeck0) {
this.eventDeck = eventDeck0; this.eventDeck = eventDeck0;
} }
/** @Override
* Sets the icon filename. public void setIconImageKey(final String s0) {
* this.imageKey = s0;
* @param s0
* filename of the icon to set
*/
public void setIconFilename(final String s0) {
this.iconFilename = s0;
} }
/**
* <p>
* getCardRewardList.
* </p>
*
* @return the card reward list
*/
public final List<InventoryItem> getCardRewardList() { public final List<InventoryItem> getCardRewardList() {
if (cardReward == null) { if (cardReward == null) {
return null; return null;
@@ -213,12 +111,6 @@ public abstract class QuestEvent {
return this.cardRewardList; return this.cardRewardList;
} }
/**
* Sets the card reward.
*
* @param cardReward0
* the cardReward to set
*/
public void setCardReward(final String cardReward0) { public void setCardReward(final String cardReward0) {
this.cardReward = cardReward0; this.cardReward = cardReward0;
} }

View File

@@ -28,6 +28,7 @@ import java.util.Random;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import forge.ImageCache;
import forge.Singletons; import forge.Singletons;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.io.DeckSerializer; import forge.deck.io.DeckSerializer;
@@ -396,7 +397,7 @@ public class QuestEventManager {
} else if (key.equalsIgnoreCase("Description")) { } else if (key.equalsIgnoreCase("Description")) {
qe.setDescription(value); qe.setDescription(value);
} else if (key.equalsIgnoreCase("Icon")) { } else if (key.equalsIgnoreCase("Icon")) {
qe.setIconFilename(value); qe.setIconImageKey(ImageCache.ICON_PREFIX + value);
} else if (key.equalsIgnoreCase("Card Reward")) { } else if (key.equalsIgnoreCase("Card Reward")) {
qe.setCardReward(value); qe.setCardReward(value);
} }

View File

@@ -175,7 +175,7 @@ public class QuestRewardCardChooser implements InventoryItem {
* @return an empty string * @return an empty string
*/ */
@Override @Override
public String getImageFilename() { public String getImageKey() {
return ""; return "";
} }

View File

@@ -41,7 +41,7 @@ public class QuestRewardCardDuplicate implements IQuestRewardCard {
* @return an empty string * @return an empty string
*/ */
@Override @Override
public String getImageFilename() { public String getImageKey() {
return ""; return "";
} }

View File

@@ -151,7 +151,7 @@ public class QuestRewardCardFiltered implements IQuestRewardCard {
* @return an empty string * @return an empty string
*/ */
@Override @Override
public String getImageFilename() { public String getImageKey() {
return ""; return "";
} }

View File

@@ -315,8 +315,8 @@ public class CardPanel extends JPanel implements CardContainer {
// + White borders for Core sets Unlimited - 9th + // + White borders for Core sets Unlimited - 9th +
final int cornerSize = Math.max(4, Math.round(this.cardWidth * CardPanel.ROUNDED_CORNER_SIZE)); final int cornerSize = Math.max(4, Math.round(this.cardWidth * CardPanel.ROUNDED_CORNER_SIZE));
if (this.getGameCard() != null && this.getGameCard().getImageFilename() != null if (this.getGameCard() != null && this.getGameCard().getImageKey() != null
&& !this.getGameCard().getImageFilename().equals("none") && !this.getGameCard().getName().equals("Morph")) { && !this.getGameCard().getImageKey().equals("none") && !this.getGameCard().getName().equals("Morph")) {
CardEdition ed = Singletons.getModel().getEditions().get(this.getGameCard().getCurSetCode()); CardEdition ed = Singletons.getModel().getEditions().get(this.getGameCard().getCurSetCode());
if (ed != null && ed.isWhiteBorder()) { if (ed != null && ed.isWhiteBorder()) {