From bde2c72cf73765a7da5212beb9fb4a7f805a8082 Mon Sep 17 00:00:00 2001 From: drdev Date: Wed, 17 Sep 2014 02:24:35 +0000 Subject: [PATCH] Support custom achievement images --- .../home/settings/VSubmenuAchievements.java | 10 ++++- .../java/forge/achievement/Achievement.java | 39 +++++++++++++++++++ .../achievement/AchievementCollection.java | 5 ++- .../java/forge/properties/ForgeConstants.java | 4 +- 4 files changed, 54 insertions(+), 4 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java index dabd530d29c..f3d615537ba 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java @@ -231,7 +231,15 @@ public enum VSubmenuAchievements implements IVSubmenu { plateY += dy; x = startX; } - if (achievement.earnedGold()) { + SkinImage customImage = (SkinImage)achievement.getCustomImage(); + if (customImage != null) { + Dimension customImageSize = customImage.getSizeForPaint(g2d); + FSkin.drawImage(g2d, customImage, + x + (w - customImageSize.width) / 2, + y + h - customImageSize.height + 8, //TODO: Remove when gap below images removed + customImageSize.width, customImageSize.height); + } + else if (achievement.earnedGold()) { FSkin.drawImage(g2d, imgGoldTrophy, x, y, w, h); } else if (achievement.earnedSilver()) { diff --git a/forge-gui/src/main/java/forge/achievement/Achievement.java b/forge-gui/src/main/java/forge/achievement/Achievement.java index e427c99e014..033c845a22c 100644 --- a/forge-gui/src/main/java/forge/achievement/Achievement.java +++ b/forge-gui/src/main/java/forge/achievement/Achievement.java @@ -2,16 +2,22 @@ package forge.achievement; import org.w3c.dom.Element; +import forge.GuiBase; import forge.assets.FSkinProp; +import forge.assets.ISkinImage; import forge.game.Game; import forge.game.player.Player; import forge.interfaces.IGuiBase; +import forge.properties.ForgeConstants; +import forge.util.FileUtil; import forge.util.gui.SOptionPane; public abstract class Achievement { private final String displayName, bronzeDesc, silverDesc, goldDesc; private final int bronzeThreshold, silverThreshold, goldThreshold; private final boolean checkGreaterThan; + private String imagePrefix; + private ISkinImage customImage; protected int best, current; public Achievement(String displayName0, @@ -62,6 +68,37 @@ public abstract class Achievement { return best <= bronzeThreshold; } + public void setImagePrefix(String imagePrefix0) { + imagePrefix = imagePrefix0; + } + + public ISkinImage getCustomImage() { + return customImage; + } + + private void updateCustomImage() { + int suffix; + if (earnedGold()) { + suffix = 3; + } + else if (earnedSilver()) { + suffix = 2; + } + else if (earnedBronze()) { + suffix = 1; + } + else { + customImage = null; + return; + } + String filename = ForgeConstants.CACHE_ACHIEVEMENT_PICS_DIR + imagePrefix + "_" + suffix + ".png"; + if (FileUtil.doesFileExist(filename)) { + customImage = GuiBase.getInterface().getUnskinnedIcon(filename); + return; + } + customImage = null; + } + protected abstract int evaluate(Player player, Game game); protected Player getSingleOpponent(Player player) { @@ -113,6 +150,7 @@ public abstract class Achievement { } } if (type != null) { + updateCustomImage(); SOptionPane.showMessageDialog(gui, "You've earned a " + type + " trophy!\n\n" + displayName + " - " + desc, "Achievement Earned", image); } @@ -130,6 +168,7 @@ public abstract class Achievement { public void loadFromXml(Element el) { best = getIntAttribute(el, "best"); current = getIntAttribute(el, "current"); + updateCustomImage(); } private int getIntAttribute(Element el, String name) { diff --git a/forge-gui/src/main/java/forge/achievement/AchievementCollection.java b/forge-gui/src/main/java/forge/achievement/AchievementCollection.java index a51a35c280d..2ec38b68229 100644 --- a/forge-gui/src/main/java/forge/achievement/AchievementCollection.java +++ b/forge-gui/src/main/java/forge/achievement/AchievementCollection.java @@ -68,8 +68,9 @@ public abstract class AchievementCollection implements Iterable { protected abstract void buildTopShelf(); protected abstract void buildBottomShelf(); - protected void add(String name, Achievement achievement) { - achievements.put(name, achievement); + protected void add(String key, Achievement achievement) { + achievement.setImagePrefix(key.toLowerCase()); + achievements.put(key, achievement); } public void updateAll(IGuiBase gui, Player player) { diff --git a/forge-gui/src/main/java/forge/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/properties/ForgeConstants.java index 63c85a5ed64..cfd6d4c13a7 100644 --- a/forge-gui/src/main/java/forge/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/properties/ForgeConstants.java @@ -121,7 +121,8 @@ public final class ForgeConstants { CACHE_BOOSTERBOX_PICS_DIR = PICS_DIR + "boosterboxes/"; CACHE_PRECON_PICS_DIR = PICS_DIR + "precons/"; CACHE_TOURNAMENTPACK_PICS_DIR = PICS_DIR + "tournamentpacks/"; - QUEST_CARD_PRICE_FILE = DB_DIR + "all-prices.txt";; + CACHE_ACHIEVEMENT_PICS_DIR = PICS_DIR + "achievements/"; + QUEST_CARD_PRICE_FILE = DB_DIR + "all-prices.txt"; PROFILE_DIRS = new String[] { USER_DIR, @@ -256,6 +257,7 @@ public final class ForgeConstants { public static String CACHE_BOOSTERBOX_PICS_DIR; public static String CACHE_PRECON_PICS_DIR; public static String CACHE_TOURNAMENTPACK_PICS_DIR; + public static String CACHE_ACHIEVEMENT_PICS_DIR; public static String QUEST_CARD_PRICE_FILE; public static String[] PROFILE_DIRS;