Fix crash when saving quest decks

This commit is contained in:
drdev
2015-11-10 23:59:43 +00:00
parent 022041a2f6
commit d89dc0d439
8 changed files with 124 additions and 62 deletions

1
.gitattributes vendored
View File

@@ -18092,6 +18092,7 @@ forge-gui/src/main/java/forge/deck/DeckgenUtil.java -text
forge-gui/src/main/java/forge/deck/NetDeckCategory.java -text forge-gui/src/main/java/forge/deck/NetDeckCategory.java -text
forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java -text forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java -text
forge-gui/src/main/java/forge/deck/io/DeckPreferences.java -text forge-gui/src/main/java/forge/deck/io/DeckPreferences.java -text
forge-gui/src/main/java/forge/deck/io/DeckRecords.java -text
forge-gui/src/main/java/forge/download/GuiDownloadAchievementImages.java -text forge-gui/src/main/java/forge/download/GuiDownloadAchievementImages.java -text
forge-gui/src/main/java/forge/download/GuiDownloadPicturesLQ.java -text forge-gui/src/main/java/forge/download/GuiDownloadPicturesLQ.java -text
forge-gui/src/main/java/forge/download/GuiDownloadPrices.java -text forge-gui/src/main/java/forge/download/GuiDownloadPrices.java -text

View File

@@ -6,7 +6,7 @@
<packaging.type>jar</packaging.type> <packaging.type>jar</packaging.type>
<build.min.memory>-Xms128m</build.min.memory> <build.min.memory>-Xms128m</build.min.memory>
<build.max.memory>-Xmx1024m</build.max.memory> <build.max.memory>-Xmx1024m</build.max.memory>
<alpha-version>1.5.47.001</alpha-version> <alpha-version>1.5.48.002</alpha-version>
<sign.keystore>keystore</sign.keystore> <sign.keystore>keystore</sign.keystore>
<sign.alias>alias</sign.alias> <sign.alias>alias</sign.alias>
<sign.storepass>storepass</sign.storepass> <sign.storepass>storepass</sign.storepass>

View File

@@ -22,7 +22,7 @@ import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import forge.deck.DeckBase; import forge.deck.DeckBase;
import forge.properties.ForgeConstants; import forge.deck.DeckProxy;
import forge.screens.deckeditor.menus.DeckFileMenu; import forge.screens.deckeditor.menus.DeckFileMenu;
import forge.screens.deckeditor.views.VCurrentDeck; import forge.screens.deckeditor.views.VCurrentDeck;
import forge.screens.home.sanctioned.VSubmenuConstructed; import forge.screens.home.sanctioned.VSubmenuConstructed;
@@ -193,13 +193,7 @@ public class DeckController<T extends DeckBase> {
// copy to new instance before adding to current folder so further changes are auto-saved // copy to new instance before adding to current folder so further changes are auto-saved
currentFolder.add((T) model.copyTo(model.getName())); currentFolder.add((T) model.copyTo(model.getName()));
try { model.setDirectory(DeckProxy.getDeckDirectory(currentFolder));
model.setDirectory(currentFolder.getFullPath().substring(ForgeConstants.DECK_BASE_DIR.length()));
} catch (Exception exception) {
// Set directory failed?
// TEMPORARILY Adding to fix quest mode saving
}
modelInStorage = true; modelInStorage = true;
setSaved(true); setSaved(true);

View File

@@ -39,7 +39,7 @@ import forge.util.FileUtil;
import forge.util.Utils; import forge.util.Utils;
public class Forge implements ApplicationListener { public class Forge implements ApplicationListener {
public static final String CURRENT_VERSION = "1.5.47.001"; public static final String CURRENT_VERSION = "1.5.48.002";
private static final ApplicationListener app = new Forge(); private static final ApplicationListener app = new Forge();
private static Clipboard clipboard; private static Clipboard clipboard;

View File

@@ -28,7 +28,6 @@ import forge.menu.FMenuItem;
import forge.menu.FPopupMenu; import forge.menu.FPopupMenu;
import forge.model.FModel; import forge.model.FModel;
import forge.planarconquest.ConquestUtil; import forge.planarconquest.ConquestUtil;
import forge.properties.ForgeConstants;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.quest.data.QuestPreferences.QPref; import forge.quest.data.QuestPreferences.QPref;
import forge.screens.FScreen; import forge.screens.FScreen;
@@ -1444,7 +1443,7 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
// copy to new instance before adding to current folder so further changes are auto-saved // copy to new instance before adding to current folder so further changes are auto-saved
currentFolder.add((T) model.copyTo(model.getName())); currentFolder.add((T) model.copyTo(model.getName()));
model.setDirectory(currentFolder.getFullPath().substring(ForgeConstants.DECK_BASE_DIR.length())); model.setDirectory(DeckProxy.getDeckDirectory(currentFolder));
modelInStorage = true; modelInStorage = true;
setSaved(true); setSaved(true);

View File

@@ -27,6 +27,7 @@ import forge.item.InventoryItem;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.item.PreconDeck; import forge.item.PreconDeck;
import forge.model.FModel; import forge.model.FModel;
import forge.properties.ForgeConstants;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.quest.QuestController; import forge.quest.QuestController;
import forge.quest.QuestEvent; import forge.quest.QuestEvent;
@@ -129,6 +130,15 @@ public class DeckProxy implements InventoryItem {
return path + "/" + name; return path + "/" + name;
} }
public static String getDeckDirectory(final IStorage<?> currentFolder) {
String directory = currentFolder.getFullPath();
if (directory.startsWith(ForgeConstants.DECK_BASE_DIR)) {
//trim deck base directory from start of directory path
directory = directory.substring(ForgeConstants.DECK_BASE_DIR.length());
}
return directory;
}
public void invalidateCache() { public void invalidateCache() {
color = null; color = null;
colorIdentity = null; colorIdentity = null;

View File

@@ -0,0 +1,56 @@
package forge.deck.io;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import forge.LobbyPlayer;
import forge.ai.LobbyPlayerAi;
import forge.game.GameOutcome;
import forge.game.Match;
import forge.game.player.RegisteredPlayer;
public class DeckRecords {
private static final Map<String, DeckRecords> recordLookup = new HashMap<String, DeckRecords>();
public static void recordMatchOutcome(Match match) {
for (RegisteredPlayer p1 : match.getPlayers()) {
for (RegisteredPlayer p2 : match.getPlayers()) {
if (p1 != p2) {
}
}
}
}
private final List<DeckMatch> matches = new ArrayList<DeckMatch>();
public void addMatch(Match match, LobbyPlayer player) {
matches.add(new DeckMatch(match, player));
}
private static class DeckMatch {
private final long timestamp;
private final boolean isAi;
private final int results;
private DeckMatch(Match match, LobbyPlayer player) {
timestamp = new Date().getTime();
isAi = (player instanceof LobbyPlayerAi);
int results0 = 0;
int bit = 1;
for (GameOutcome outcome : match.getOutcomes()) {
if (outcome.isWinner(player)) {
results0 += bit;
}
else if (outcome.isDraw()) {
}
bit *= 2;
}
results = results0;
}
}
}

View File

@@ -19,16 +19,18 @@ package forge.properties;
import forge.GuiBase; import forge.GuiBase;
import java.io.File;
import java.util.Collections; import java.util.Collections;
import java.util.Map; import java.util.Map;
public final class ForgeConstants { public final class ForgeConstants {
public static final String PATH_SEPARATOR = File.separator;
public static final String ASSETS_DIR = GuiBase.getInterface().getAssetsDir(); public static final String ASSETS_DIR = GuiBase.getInterface().getAssetsDir();
public static final String PROFILE_FILE = ASSETS_DIR + "forge.profile.properties"; public static final String PROFILE_FILE = ASSETS_DIR + "forge.profile.properties";
public static final String PROFILE_TEMPLATE_FILE = PROFILE_FILE + ".example"; public static final String PROFILE_TEMPLATE_FILE = PROFILE_FILE + ".example";
public static final String RES_DIR = ASSETS_DIR + "res/"; public static final String RES_DIR = ASSETS_DIR + "res" + PATH_SEPARATOR;
public static final String LISTS_DIR = RES_DIR + "lists/"; public static final String LISTS_DIR = RES_DIR + "lists" + PATH_SEPARATOR;
public static final String KEYWORD_LIST_FILE = LISTS_DIR + "NonStackingKWList.txt"; public static final String KEYWORD_LIST_FILE = LISTS_DIR + "NonStackingKWList.txt";
public static final String TYPE_LIST_FILE = LISTS_DIR + "TypeLists.txt"; public static final String TYPE_LIST_FILE = LISTS_DIR + "TypeLists.txt";
public static final String IMAGE_LIST_TOKENS_FILE = LISTS_DIR + "token-images.txt"; public static final String IMAGE_LIST_TOKENS_FILE = LISTS_DIR + "token-images.txt";
@@ -48,31 +50,31 @@ public final class ForgeConstants {
public static final String README_FILE = ASSETS_DIR + "README.txt"; public static final String README_FILE = ASSETS_DIR + "README.txt";
public static final String HOWTO_FILE = RES_DIR + "howto.txt"; public static final String HOWTO_FILE = RES_DIR + "howto.txt";
public static final String DRAFT_DIR = RES_DIR + "draft/"; public static final String DRAFT_DIR = RES_DIR + "draft" + PATH_SEPARATOR;
public static final String DRAFT_RANKINGS_FILE = DRAFT_DIR + "rankings.txt"; public static final String DRAFT_RANKINGS_FILE = DRAFT_DIR + "rankings.txt";
public static final String SEALED_DIR = RES_DIR + "sealed/"; public static final String SEALED_DIR = RES_DIR + "sealed" + PATH_SEPARATOR;
public static final String CARD_DATA_DIR = RES_DIR + "cardsfolder/"; public static final String CARD_DATA_DIR = RES_DIR + "cardsfolder" + PATH_SEPARATOR;
public static final String EDITIONS_DIR = RES_DIR + "editions/"; public static final String EDITIONS_DIR = RES_DIR + "editions" + PATH_SEPARATOR;
public static final String BLOCK_DATA_DIR = RES_DIR + "blockdata/"; public static final String BLOCK_DATA_DIR = RES_DIR + "blockdata" + PATH_SEPARATOR;
public static final String DECK_CUBE_DIR = RES_DIR + "cube/"; public static final String DECK_CUBE_DIR = RES_DIR + "cube" + PATH_SEPARATOR;
public static final String AI_PROFILE_DIR = RES_DIR + "ai/"; public static final String AI_PROFILE_DIR = RES_DIR + "ai" + PATH_SEPARATOR;
public static final String SOUND_DIR = RES_DIR + "sound/"; public static final String SOUND_DIR = RES_DIR + "sound" + PATH_SEPARATOR;
public static final String MUSIC_DIR = RES_DIR + "music/"; public static final String MUSIC_DIR = RES_DIR + "music" + PATH_SEPARATOR;
public static final String LANG_DIR = RES_DIR + "languages/"; public static final String LANG_DIR = RES_DIR + "languages" + PATH_SEPARATOR;
public static final String EFFECTS_DIR = RES_DIR + "effects/"; public static final String EFFECTS_DIR = RES_DIR + "effects" + PATH_SEPARATOR;
private static final String QUEST_DIR = RES_DIR + "quest/"; private static final String QUEST_DIR = RES_DIR + "quest" + PATH_SEPARATOR;
public static final String QUEST_WORLD_DIR = QUEST_DIR + "world/"; public static final String QUEST_WORLD_DIR = QUEST_DIR + "world" + PATH_SEPARATOR;
public static final String QUEST_PRECON_DIR = QUEST_DIR + "precons/"; public static final String QUEST_PRECON_DIR = QUEST_DIR + "precons" + PATH_SEPARATOR;
public static final String PRICES_BOOSTER_FILE = QUEST_DIR + "booster-prices.txt"; public static final String PRICES_BOOSTER_FILE = QUEST_DIR + "booster-prices.txt";
public static final String BAZAAR_DIR = QUEST_DIR + "bazaar/"; public static final String BAZAAR_DIR = QUEST_DIR + "bazaar" + PATH_SEPARATOR;
public static final String BAZAAR_INDEX_FILE = BAZAAR_DIR + "index.xml"; public static final String BAZAAR_INDEX_FILE = BAZAAR_DIR + "index.xml";
public static final String DEFAULT_DUELS_DIR = QUEST_DIR + "duels"; public static final String DEFAULT_DUELS_DIR = QUEST_DIR + "duels";
public static final String DEFAULT_CHALLENGES_DIR = QUEST_DIR + "challenges"; public static final String DEFAULT_CHALLENGES_DIR = QUEST_DIR + "challenges";
public static final String THEMES_DIR = QUEST_DIR + "themes"; public static final String THEMES_DIR = QUEST_DIR + "themes";
public static final String SKINS_DIR = RES_DIR + "skins/"; public static final String SKINS_DIR = RES_DIR + "skins" + PATH_SEPARATOR;
public static final String DEFAULT_SKINS_DIR = SKINS_DIR + "default/"; public static final String DEFAULT_SKINS_DIR = SKINS_DIR + "default" + PATH_SEPARATOR;
//don't associate these skin files with a directory since skin directory will be determined later //don't associate these skin files with a directory since skin directory will be determined later
public static final String SPRITE_ICONS_FILE = "sprite_icons.png"; public static final String SPRITE_ICONS_FILE = "sprite_icons.png";
public static final String SPRITE_FOILS_FILE = "sprite_foils.png"; public static final String SPRITE_FOILS_FILE = "sprite_foils.png";
@@ -102,24 +104,24 @@ public final class ForgeConstants {
} }
// data that is only in the profile dirs // data that is only in the profile dirs
public static final String USER_QUEST_DIR = USER_DIR + "quest/"; public static final String USER_QUEST_DIR = USER_DIR + "quest" + PATH_SEPARATOR;
public static final String USER_CONQUEST_DIR = USER_DIR + "conquest/"; public static final String USER_CONQUEST_DIR = USER_DIR + "conquest" + PATH_SEPARATOR;
public static final String USER_PREFS_DIR = USER_DIR + "preferences/"; public static final String USER_PREFS_DIR = USER_DIR + "preferences" + PATH_SEPARATOR;
public static final String USER_GAMES_DIR = USER_DIR + "games/"; public static final String USER_GAMES_DIR = USER_DIR + "games" + PATH_SEPARATOR;
public static final String LOG_FILE = USER_DIR + "forge.log"; public static final String LOG_FILE = USER_DIR + "forge.log";
public static final String DECK_BASE_DIR = USER_DIR + "decks/"; public static final String DECK_BASE_DIR = USER_DIR + "decks" + PATH_SEPARATOR;
public static final String ACHIEVEMENTS_DIR = USER_DIR + "achievements/"; public static final String ACHIEVEMENTS_DIR = USER_DIR + "achievements" + PATH_SEPARATOR;
public static final String DECK_CONSTRUCTED_DIR = DECK_BASE_DIR + "constructed/"; public static final String DECK_CONSTRUCTED_DIR = DECK_BASE_DIR + "constructed" + PATH_SEPARATOR;
public static final String DECK_DRAFT_DIR = DECK_BASE_DIR + "draft/"; public static final String DECK_DRAFT_DIR = DECK_BASE_DIR + "draft" + PATH_SEPARATOR;
public static final String DECK_WINSTON_DIR = DECK_BASE_DIR + "winston/"; public static final String DECK_WINSTON_DIR = DECK_BASE_DIR + "winston" + PATH_SEPARATOR;
public static final String DECK_SEALED_DIR = DECK_BASE_DIR + "sealed/"; public static final String DECK_SEALED_DIR = DECK_BASE_DIR + "sealed" + PATH_SEPARATOR;
public static final String DECK_SCHEME_DIR = DECK_BASE_DIR + "scheme/"; public static final String DECK_SCHEME_DIR = DECK_BASE_DIR + "scheme" + PATH_SEPARATOR;
public static final String DECK_PLANE_DIR = DECK_BASE_DIR + "planar/"; public static final String DECK_PLANE_DIR = DECK_BASE_DIR + "planar" + PATH_SEPARATOR;
public static final String DECK_COMMANDER_DIR = DECK_BASE_DIR + "commander/"; public static final String DECK_COMMANDER_DIR = DECK_BASE_DIR + "commander" + PATH_SEPARATOR;
public static final String DECK_TINY_LEADERS_DIR = DECK_BASE_DIR + "tiny_leaders/"; public static final String DECK_TINY_LEADERS_DIR = DECK_BASE_DIR + "tiny_leaders" + PATH_SEPARATOR;
public static final String DECK_NET_DIR = DECK_BASE_DIR + "net/"; public static final String DECK_NET_DIR = DECK_BASE_DIR + "net" + PATH_SEPARATOR;
public static final String QUEST_SAVE_DIR = USER_QUEST_DIR + "saves/"; public static final String QUEST_SAVE_DIR = USER_QUEST_DIR + "saves" + PATH_SEPARATOR;
public static final String CONQUEST_SAVE_DIR = USER_CONQUEST_DIR + "saves/"; public static final String CONQUEST_SAVE_DIR = USER_CONQUEST_DIR + "saves" + PATH_SEPARATOR;
public static final String MAIN_PREFS_FILE = USER_PREFS_DIR + "forge.preferences"; public static final String MAIN_PREFS_FILE = USER_PREFS_DIR + "forge.preferences";
public static final String CARD_PREFS_FILE = USER_PREFS_DIR + "card.preferences"; public static final String CARD_PREFS_FILE = USER_PREFS_DIR + "card.preferences";
public static final String DECK_PREFS_FILE = USER_PREFS_DIR + "deck.preferences"; public static final String DECK_PREFS_FILE = USER_PREFS_DIR + "deck.preferences";
@@ -128,27 +130,27 @@ public final class ForgeConstants {
public static final String ITEM_VIEW_PREFS_FILE = USER_PREFS_DIR + "item_view.preferences"; public static final String ITEM_VIEW_PREFS_FILE = USER_PREFS_DIR + "item_view.preferences";
// data that has defaults in the program dir but overrides/additions in the user dir // data that has defaults in the program dir but overrides/additions in the user dir
private static final String _DEFAULTS_DIR = RES_DIR + "defaults/"; private static final String _DEFAULTS_DIR = RES_DIR + "defaults" + PATH_SEPARATOR;
public static final String NO_CARD_FILE = _DEFAULTS_DIR + "no_card.jpg"; public static final String NO_CARD_FILE = _DEFAULTS_DIR + "no_card.jpg";
public static final FileLocation WINDOW_LAYOUT_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "window.xml"); public static final FileLocation WINDOW_LAYOUT_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "window.xml");
public static final FileLocation MATCH_LAYOUT_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "match.xml"); public static final FileLocation MATCH_LAYOUT_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "match.xml");
public static final FileLocation WORKSHOP_LAYOUT_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "workshop.xml"); public static final FileLocation WORKSHOP_LAYOUT_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "workshop.xml");
public static final FileLocation EDITOR_LAYOUT_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "editor.xml"); public static final FileLocation EDITOR_LAYOUT_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "editor.xml");
public static final FileLocation GAUNTLET_DIR = new FileLocation(_DEFAULTS_DIR, USER_DIR, "gauntlet/"); public static final FileLocation GAUNTLET_DIR = new FileLocation(_DEFAULTS_DIR, USER_DIR, "gauntlet" + PATH_SEPARATOR);
// data that is only in the cached dir // data that is only in the cached dir
private static final String PICS_DIR = CACHE_DIR + "pics/"; private static final String PICS_DIR = CACHE_DIR + "pics" + PATH_SEPARATOR;
public static final String DB_DIR = CACHE_DIR + "db/"; public static final String DB_DIR = CACHE_DIR + "db" + PATH_SEPARATOR;
public static final String FONTS_DIR = CACHE_DIR + "fonts/"; public static final String FONTS_DIR = CACHE_DIR + "fonts" + PATH_SEPARATOR;
public static final String CACHE_TOKEN_PICS_DIR = PICS_DIR + "tokens/"; public static final String CACHE_TOKEN_PICS_DIR = PICS_DIR + "tokens" + PATH_SEPARATOR;
public static final String CACHE_ICON_PICS_DIR = PICS_DIR + "icons/"; public static final String CACHE_ICON_PICS_DIR = PICS_DIR + "icons" + PATH_SEPARATOR;
public static final String CACHE_SYMBOLS_DIR = PICS_DIR + "symbols/"; public static final String CACHE_SYMBOLS_DIR = PICS_DIR + "symbols" + PATH_SEPARATOR;
public static final String CACHE_BOOSTER_PICS_DIR = PICS_DIR + "boosters/"; public static final String CACHE_BOOSTER_PICS_DIR = PICS_DIR + "boosters" + PATH_SEPARATOR;
public static final String CACHE_FATPACK_PICS_DIR = PICS_DIR + "fatpacks/"; public static final String CACHE_FATPACK_PICS_DIR = PICS_DIR + "fatpacks" + PATH_SEPARATOR;
public static final String CACHE_BOOSTERBOX_PICS_DIR = PICS_DIR + "boosterboxes/"; public static final String CACHE_BOOSTERBOX_PICS_DIR = PICS_DIR + "boosterboxes" + PATH_SEPARATOR;
public static final String CACHE_PRECON_PICS_DIR = PICS_DIR + "precons/"; public static final String CACHE_PRECON_PICS_DIR = PICS_DIR + "precons" + PATH_SEPARATOR;
public static final String CACHE_TOURNAMENTPACK_PICS_DIR = PICS_DIR + "tournamentpacks/"; public static final String CACHE_TOURNAMENTPACK_PICS_DIR = PICS_DIR + "tournamentpacks" + PATH_SEPARATOR;
public static final String CACHE_ACHIEVEMENTS_DIR = PICS_DIR + "achievements/"; public static final String CACHE_ACHIEVEMENTS_DIR = PICS_DIR + "achievements" + PATH_SEPARATOR;
public static final String QUEST_CARD_PRICE_FILE = DB_DIR + "all-prices.txt"; public static final String QUEST_CARD_PRICE_FILE = DB_DIR + "all-prices.txt";
public static final String[] PROFILE_DIRS = { public static final String[] PROFILE_DIRS = {