diff --git a/.gitattributes b/.gitattributes index 19167f18c15..8c0bbb8c213 100644 --- a/.gitattributes +++ b/.gitattributes @@ -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/RandomDeckGenerator.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/GuiDownloadPicturesLQ.java -text forge-gui/src/main/java/forge/download/GuiDownloadPrices.java -text diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index d835d57ab49..e961bc5e5d7 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -6,7 +6,7 @@ jar -Xms128m -Xmx1024m - 1.5.47.001 + 1.5.48.002 keystore alias storepass diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java index 6ae078655b7..0e9cb9ea969 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java @@ -22,7 +22,7 @@ import org.apache.commons.lang3.StringUtils; import com.google.common.base.Supplier; import forge.deck.DeckBase; -import forge.properties.ForgeConstants; +import forge.deck.DeckProxy; import forge.screens.deckeditor.menus.DeckFileMenu; import forge.screens.deckeditor.views.VCurrentDeck; import forge.screens.home.sanctioned.VSubmenuConstructed; @@ -193,13 +193,7 @@ public class DeckController { // copy to new instance before adding to current folder so further changes are auto-saved currentFolder.add((T) model.copyTo(model.getName())); - try { - model.setDirectory(currentFolder.getFullPath().substring(ForgeConstants.DECK_BASE_DIR.length())); - } catch (Exception exception) { - // Set directory failed? - // TEMPORARILY Adding to fix quest mode saving - - } + model.setDirectory(DeckProxy.getDeckDirectory(currentFolder)); modelInStorage = true; setSaved(true); diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index de5551d2bfc..1d6d8f1715d 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -39,7 +39,7 @@ import forge.util.FileUtil; import forge.util.Utils; 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 Clipboard clipboard; diff --git a/forge-gui-mobile/src/forge/deck/FDeckEditor.java b/forge-gui-mobile/src/forge/deck/FDeckEditor.java index 10d866eb370..5166420a713 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckEditor.java +++ b/forge-gui-mobile/src/forge/deck/FDeckEditor.java @@ -28,7 +28,6 @@ import forge.menu.FMenuItem; import forge.menu.FPopupMenu; import forge.model.FModel; import forge.planarconquest.ConquestUtil; -import forge.properties.ForgeConstants; import forge.properties.ForgePreferences.FPref; import forge.quest.data.QuestPreferences.QPref; import forge.screens.FScreen; @@ -1444,7 +1443,7 @@ public class FDeckEditor extends TabPageScreen { // copy to new instance before adding to current folder so further changes are auto-saved currentFolder.add((T) model.copyTo(model.getName())); - model.setDirectory(currentFolder.getFullPath().substring(ForgeConstants.DECK_BASE_DIR.length())); + model.setDirectory(DeckProxy.getDeckDirectory(currentFolder)); modelInStorage = true; setSaved(true); diff --git a/forge-gui/src/main/java/forge/deck/DeckProxy.java b/forge-gui/src/main/java/forge/deck/DeckProxy.java index 35b3672e8bb..2a9a8a240ed 100644 --- a/forge-gui/src/main/java/forge/deck/DeckProxy.java +++ b/forge-gui/src/main/java/forge/deck/DeckProxy.java @@ -27,6 +27,7 @@ import forge.item.InventoryItem; import forge.item.PaperCard; import forge.item.PreconDeck; import forge.model.FModel; +import forge.properties.ForgeConstants; import forge.properties.ForgePreferences.FPref; import forge.quest.QuestController; import forge.quest.QuestEvent; @@ -129,6 +130,15 @@ public class DeckProxy implements InventoryItem { 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() { color = null; colorIdentity = null; diff --git a/forge-gui/src/main/java/forge/deck/io/DeckRecords.java b/forge-gui/src/main/java/forge/deck/io/DeckRecords.java new file mode 100644 index 00000000000..82c8cd55f01 --- /dev/null +++ b/forge-gui/src/main/java/forge/deck/io/DeckRecords.java @@ -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 recordLookup = new HashMap(); + + public static void recordMatchOutcome(Match match) { + for (RegisteredPlayer p1 : match.getPlayers()) { + for (RegisteredPlayer p2 : match.getPlayers()) { + if (p1 != p2) { + } + } + } + } + + private final List matches = new ArrayList(); + + 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; + } + } +} diff --git a/forge-gui/src/main/java/forge/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/properties/ForgeConstants.java index 0157edd1fb8..9e9c7cb9f12 100644 --- a/forge-gui/src/main/java/forge/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/properties/ForgeConstants.java @@ -19,16 +19,18 @@ package forge.properties; import forge.GuiBase; +import java.io.File; import java.util.Collections; import java.util.Map; 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 PROFILE_FILE = ASSETS_DIR + "forge.profile.properties"; public static final String PROFILE_TEMPLATE_FILE = PROFILE_FILE + ".example"; - public static final String RES_DIR = ASSETS_DIR + "res/"; - public static final String LISTS_DIR = RES_DIR + "lists/"; + public static final String RES_DIR = ASSETS_DIR + "res" + PATH_SEPARATOR; + 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 TYPE_LIST_FILE = LISTS_DIR + "TypeLists.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 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 SEALED_DIR = RES_DIR + "sealed/"; - public static final String CARD_DATA_DIR = RES_DIR + "cardsfolder/"; - public static final String EDITIONS_DIR = RES_DIR + "editions/"; - public static final String BLOCK_DATA_DIR = RES_DIR + "blockdata/"; - public static final String DECK_CUBE_DIR = RES_DIR + "cube/"; - public static final String AI_PROFILE_DIR = RES_DIR + "ai/"; - public static final String SOUND_DIR = RES_DIR + "sound/"; - public static final String MUSIC_DIR = RES_DIR + "music/"; - public static final String LANG_DIR = RES_DIR + "languages/"; - public static final String EFFECTS_DIR = RES_DIR + "effects/"; + public static final String SEALED_DIR = RES_DIR + "sealed" + PATH_SEPARATOR; + public static final String CARD_DATA_DIR = RES_DIR + "cardsfolder" + PATH_SEPARATOR; + public static final String EDITIONS_DIR = RES_DIR + "editions" + PATH_SEPARATOR; + public static final String BLOCK_DATA_DIR = RES_DIR + "blockdata" + PATH_SEPARATOR; + public static final String DECK_CUBE_DIR = RES_DIR + "cube" + PATH_SEPARATOR; + public static final String AI_PROFILE_DIR = RES_DIR + "ai" + PATH_SEPARATOR; + public static final String SOUND_DIR = RES_DIR + "sound" + PATH_SEPARATOR; + public static final String MUSIC_DIR = RES_DIR + "music" + PATH_SEPARATOR; + public static final String LANG_DIR = RES_DIR + "languages" + PATH_SEPARATOR; + public static final String EFFECTS_DIR = RES_DIR + "effects" + PATH_SEPARATOR; - private static final String QUEST_DIR = RES_DIR + "quest/"; - public static final String QUEST_WORLD_DIR = QUEST_DIR + "world/"; - public static final String QUEST_PRECON_DIR = QUEST_DIR + "precons/"; + private static final String QUEST_DIR = RES_DIR + "quest" + PATH_SEPARATOR; + public static final String QUEST_WORLD_DIR = QUEST_DIR + "world" + PATH_SEPARATOR; + 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 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 DEFAULT_DUELS_DIR = QUEST_DIR + "duels"; public static final String DEFAULT_CHALLENGES_DIR = QUEST_DIR + "challenges"; public static final String THEMES_DIR = QUEST_DIR + "themes"; - public static final String SKINS_DIR = RES_DIR + "skins/"; - public static final String DEFAULT_SKINS_DIR = SKINS_DIR + "default/"; + public static final String SKINS_DIR = RES_DIR + "skins" + PATH_SEPARATOR; + 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 public static final String SPRITE_ICONS_FILE = "sprite_icons.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 - public static final String USER_QUEST_DIR = USER_DIR + "quest/"; - public static final String USER_CONQUEST_DIR = USER_DIR + "conquest/"; - public static final String USER_PREFS_DIR = USER_DIR + "preferences/"; - public static final String USER_GAMES_DIR = USER_DIR + "games/"; + public static final String USER_QUEST_DIR = USER_DIR + "quest" + PATH_SEPARATOR; + public static final String USER_CONQUEST_DIR = USER_DIR + "conquest" + PATH_SEPARATOR; + public static final String USER_PREFS_DIR = USER_DIR + "preferences" + PATH_SEPARATOR; + 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 DECK_BASE_DIR = USER_DIR + "decks/"; - public static final String ACHIEVEMENTS_DIR = USER_DIR + "achievements/"; - public static final String DECK_CONSTRUCTED_DIR = DECK_BASE_DIR + "constructed/"; - public static final String DECK_DRAFT_DIR = DECK_BASE_DIR + "draft/"; - public static final String DECK_WINSTON_DIR = DECK_BASE_DIR + "winston/"; - public static final String DECK_SEALED_DIR = DECK_BASE_DIR + "sealed/"; - public static final String DECK_SCHEME_DIR = DECK_BASE_DIR + "scheme/"; - public static final String DECK_PLANE_DIR = DECK_BASE_DIR + "planar/"; - public static final String DECK_COMMANDER_DIR = DECK_BASE_DIR + "commander/"; - public static final String DECK_TINY_LEADERS_DIR = DECK_BASE_DIR + "tiny_leaders/"; - public static final String DECK_NET_DIR = DECK_BASE_DIR + "net/"; - public static final String QUEST_SAVE_DIR = USER_QUEST_DIR + "saves/"; - public static final String CONQUEST_SAVE_DIR = USER_CONQUEST_DIR + "saves/"; + public static final String DECK_BASE_DIR = USER_DIR + "decks" + PATH_SEPARATOR; + public static final String ACHIEVEMENTS_DIR = USER_DIR + "achievements" + PATH_SEPARATOR; + public static final String DECK_CONSTRUCTED_DIR = DECK_BASE_DIR + "constructed" + PATH_SEPARATOR; + public static final String DECK_DRAFT_DIR = DECK_BASE_DIR + "draft" + PATH_SEPARATOR; + public static final String DECK_WINSTON_DIR = DECK_BASE_DIR + "winston" + PATH_SEPARATOR; + public static final String DECK_SEALED_DIR = DECK_BASE_DIR + "sealed" + PATH_SEPARATOR; + public static final String DECK_SCHEME_DIR = DECK_BASE_DIR + "scheme" + PATH_SEPARATOR; + public static final String DECK_PLANE_DIR = DECK_BASE_DIR + "planar" + PATH_SEPARATOR; + 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" + PATH_SEPARATOR; + public static final String DECK_NET_DIR = DECK_BASE_DIR + "net" + PATH_SEPARATOR; + public static final String QUEST_SAVE_DIR = USER_QUEST_DIR + "saves" + PATH_SEPARATOR; + 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 CARD_PREFS_FILE = USER_PREFS_DIR + "card.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"; // 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 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 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 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 - private static final String PICS_DIR = CACHE_DIR + "pics/"; - public static final String DB_DIR = CACHE_DIR + "db/"; - public static final String FONTS_DIR = CACHE_DIR + "fonts/"; - public static final String CACHE_TOKEN_PICS_DIR = PICS_DIR + "tokens/"; - public static final String CACHE_ICON_PICS_DIR = PICS_DIR + "icons/"; - public static final String CACHE_SYMBOLS_DIR = PICS_DIR + "symbols/"; - public static final String CACHE_BOOSTER_PICS_DIR = PICS_DIR + "boosters/"; - public static final String CACHE_FATPACK_PICS_DIR = PICS_DIR + "fatpacks/"; - public static final String CACHE_BOOSTERBOX_PICS_DIR = PICS_DIR + "boosterboxes/"; - public static final String CACHE_PRECON_PICS_DIR = PICS_DIR + "precons/"; - public static final String CACHE_TOURNAMENTPACK_PICS_DIR = PICS_DIR + "tournamentpacks/"; - public static final String CACHE_ACHIEVEMENTS_DIR = PICS_DIR + "achievements/"; + private static final String PICS_DIR = CACHE_DIR + "pics" + PATH_SEPARATOR; + public static final String DB_DIR = CACHE_DIR + "db" + PATH_SEPARATOR; + public static final String FONTS_DIR = CACHE_DIR + "fonts" + PATH_SEPARATOR; + public static final String CACHE_TOKEN_PICS_DIR = PICS_DIR + "tokens" + PATH_SEPARATOR; + public static final String CACHE_ICON_PICS_DIR = PICS_DIR + "icons" + PATH_SEPARATOR; + public static final String CACHE_SYMBOLS_DIR = PICS_DIR + "symbols" + PATH_SEPARATOR; + public static final String CACHE_BOOSTER_PICS_DIR = PICS_DIR + "boosters" + PATH_SEPARATOR; + public static final String CACHE_FATPACK_PICS_DIR = PICS_DIR + "fatpacks" + PATH_SEPARATOR; + public static final String CACHE_BOOSTERBOX_PICS_DIR = PICS_DIR + "boosterboxes" + PATH_SEPARATOR; + public static final String CACHE_PRECON_PICS_DIR = PICS_DIR + "precons" + PATH_SEPARATOR; + public static final String CACHE_TOURNAMENTPACK_PICS_DIR = PICS_DIR + "tournamentpacks" + PATH_SEPARATOR; + 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[] PROFILE_DIRS = {