Net Deck Archive Vintage (Desktop implementation)

This commit is contained in:
Churrufli
2021-03-02 09:24:10 +01:00
parent 043e767c79
commit f02a3c8786
12 changed files with 1544 additions and 9 deletions

View File

@@ -47,6 +47,7 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
private NetDeckArchivePioneer NetDeckArchivePioneer; private NetDeckArchivePioneer NetDeckArchivePioneer;
private NetDeckArchiveModern NetDeckArchiveModern; private NetDeckArchiveModern NetDeckArchiveModern;
private NetDeckArchiveLegacy NetDeckArchiveLegacy; private NetDeckArchiveLegacy NetDeckArchiveLegacy;
private NetDeckArchiveVintage NetDeckArchiveVintage;
private boolean refreshingDeckType; private boolean refreshingDeckType;
private boolean isForCommander; private boolean isForCommander;
@@ -295,6 +296,13 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
updateDecks(DeckProxy.getNetArchiveLegacyDecks(NetDeckArchiveLegacy), ItemManagerConfig.NET_DECKS); updateDecks(DeckProxy.getNetArchiveLegacyDecks(NetDeckArchiveLegacy), ItemManagerConfig.NET_DECKS);
} }
private void updateNetArchiveVintageDecks() {
if (NetDeckArchiveVintage != null) {
decksComboBox.setText(NetDeckArchiveVintage.getDeckType());
}
updateDecks(DeckProxy.getNetArchiveVintageDecks(NetDeckArchiveVintage), ItemManagerConfig.NET_DECKS);
}
public Deck getDeck() { public Deck getDeck() {
final DeckProxy proxy = lstDecks.getSelectedItem(); final DeckProxy proxy = lstDecks.getSelectedItem();
if (proxy == null) { if (proxy == null) {
@@ -453,7 +461,31 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
}); } }); }
}); });
return; return;
//
} else if (ev.getDeckType() == DeckType.NET_ARCHIVE_VINTAGE_DECK&& !refreshingDeckType) {
if(lstDecks.getGameType() != GameType.Constructed)
return;
FThreads.invokeInBackgroundThread(new Runnable() { //needed for loading net decks
@Override
public void run() {
final NetDeckArchiveVintage category = NetDeckArchiveVintage.selectAndLoad(lstDecks.getGameType());
FThreads.invokeInEdtLater(new Runnable() {
@Override
public void run() {
if (category == null) {
decksComboBox.setDeckType(selectedDeckType); //restore old selection if user cancels
if (selectedDeckType == DeckType.NET_ARCHIVE_VINTAGE_DECK && NetDeckArchiveVintage != null) {
decksComboBox.setText(NetDeckArchiveVintage.getDeckType());
}
return;
}
NetDeckArchiveVintage = category;
refreshDecksList(ev.getDeckType(), true, ev);
}
}); }
});
return;
} else if ((ev.getDeckType() == DeckType.NET_DECK || ev.getDeckType() == DeckType.NET_COMMANDER_DECK) && !refreshingDeckType) { } else if ((ev.getDeckType() == DeckType.NET_DECK || ev.getDeckType() == DeckType.NET_COMMANDER_DECK) && !refreshingDeckType) {
FThreads.invokeInBackgroundThread(new Runnable() { //needed for loading net decks FThreads.invokeInBackgroundThread(new Runnable() { //needed for loading net decks
@@ -584,6 +616,9 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
case NET_ARCHIVE_LEGACY_DECK: case NET_ARCHIVE_LEGACY_DECK:
updateNetArchiveLegacyDecks(); updateNetArchiveLegacyDecks();
break; break;
case NET_ARCHIVE_VINTAGE_DECK:
updateNetArchiveVintageDecks();
break;
default: default:
break; //other deck types not currently supported here break; //other deck types not currently supported here
} }
@@ -611,6 +646,8 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
state.append(NetDeckArchivePioneer.PREFIX).append(NetDeckArchivePioneer.getName()); state.append(NetDeckArchivePioneer.PREFIX).append(NetDeckArchivePioneer.getName());
} else if (decksComboBox.getDeckType() == DeckType.NET_ARCHIVE_LEGACY_DECK) { } else if (decksComboBox.getDeckType() == DeckType.NET_ARCHIVE_LEGACY_DECK) {
state.append(NetDeckArchiveLegacy.PREFIX).append(NetDeckArchiveLegacy.getName()); state.append(NetDeckArchiveLegacy.PREFIX).append(NetDeckArchiveLegacy.getName());
} else if (decksComboBox.getDeckType() == DeckType.NET_ARCHIVE_VINTAGE_DECK) {
state.append(NetDeckArchiveVintage.PREFIX).append(NetDeckArchiveVintage.getName());
} else if (decksComboBox.getDeckType() == null || decksComboBox.getDeckType() == DeckType.NET_DECK) { } else if (decksComboBox.getDeckType() == null || decksComboBox.getDeckType() == DeckType.NET_DECK) {
//handle special case of net decks //handle special case of net decks
if (netDeckCategory == null) { return ""; } if (netDeckCategory == null) { return ""; }
@@ -677,6 +714,9 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
} else if (deckType.startsWith(NetDeckArchiveLegacy.PREFIX)) { } else if (deckType.startsWith(NetDeckArchiveLegacy.PREFIX)) {
NetDeckArchiveLegacy = NetDeckArchiveLegacy.selectAndLoad(lstDecks.getGameType(), deckType.substring(NetDeckArchiveLegacy.PREFIX.length())); NetDeckArchiveLegacy = NetDeckArchiveLegacy.selectAndLoad(lstDecks.getGameType(), deckType.substring(NetDeckArchiveLegacy.PREFIX.length()));
return DeckType.NET_ARCHIVE_LEGACY_DECK; return DeckType.NET_ARCHIVE_LEGACY_DECK;
} else if (deckType.startsWith(NetDeckArchiveVintage.PREFIX)) {
NetDeckArchiveVintage = NetDeckArchiveVintage.selectAndLoad(lstDecks.getGameType(), deckType.substring(NetDeckArchiveVintage.PREFIX.length()));
return DeckType.NET_ARCHIVE_VINTAGE_DECK;
} }
return DeckType.valueOf(deckType); return DeckType.valueOf(deckType);
} }

View File

@@ -588,6 +588,7 @@ lblNetArchiveStandardDecks=Netz-Archiv Standard-Decks
lblNetArchiveModernDecks=Netz-Archiv Modern-Decks lblNetArchiveModernDecks=Netz-Archiv Modern-Decks
lblNetArchivePioneerDecks=Netz-Archiv Pioneer-Decks lblNetArchivePioneerDecks=Netz-Archiv Pioneer-Decks
lblNetArchiveLegacyDecks=Netz-Archiv Legacy-Decks lblNetArchiveLegacyDecks=Netz-Archiv Legacy-Decks
lblNetArchiveVintageDecks=Netz-Archiv Vintage-Decks
#VSubmenuTutorial #VSubmenuTutorial
lblTutorial=Tutorial lblTutorial=Tutorial
lblTutorialMode=Tutorial Mode lblTutorialMode=Tutorial Mode

View File

@@ -585,9 +585,10 @@ lblRandomDecks=Random Decks
lblNetDecks=Net Decks lblNetDecks=Net Decks
lblNetCommanderDecks=Net Commander Decks lblNetCommanderDecks=Net Commander Decks
lblNetArchiveStandardDecks=Net Archive Standard Decks lblNetArchiveStandardDecks=Net Archive Standard Decks
lblNetArchiveModernDecks=Net Archive Modern Decks
lblNetArchivePioneerDecks=Net Archive Pioneer Decks lblNetArchivePioneerDecks=Net Archive Pioneer Decks
lblNetArchiveModernDecks=Net Archive Modern Decks
lblNetArchiveLegacyDecks=Net Archive Legacy Decks lblNetArchiveLegacyDecks=Net Archive Legacy Decks
lblNetArchiveVintageDecks=Net Archive Vintage Decks
#VSubmenuTutorial #VSubmenuTutorial
lblTutorial=Tutorial lblTutorial=Tutorial
lblTutorialMode=Tutorial Mode lblTutorialMode=Tutorial Mode

View File

@@ -588,6 +588,7 @@ lblNetArchiveStandardDecks=Archivo online de mazos Standard
lblNetArchiveModernDecks=Archivo online de mazos Modern lblNetArchiveModernDecks=Archivo online de mazos Modern
lblNetArchivePioneerDecks=Net Archive Pioneer Decks lblNetArchivePioneerDecks=Net Archive Pioneer Decks
lblNetArchiveLegacyDecks=Net Archive Legacy Decks lblNetArchiveLegacyDecks=Net Archive Legacy Decks
lblNetArchiveVintageDecks=Net Archive Vintage Decks
#VSubmenuTutorial #VSubmenuTutorial
lblTutorial=Tutorial lblTutorial=Tutorial
lblTutorialMode=Modo Tutorial lblTutorialMode=Modo Tutorial

View File

@@ -585,9 +585,10 @@ lblRandomDecks=Mazzi casuali
lblNetDecks=Net Decks lblNetDecks=Net Decks
lblNetCommanderDecks=Mazzi Net Commander lblNetCommanderDecks=Mazzi Net Commander
lblNetArchiveStandardDecks=Net Archive Standard Decks lblNetArchiveStandardDecks=Net Archive Standard Decks
lblNetArchiveModernDecks=Net Archive Modern Decks
lblNetArchivePioneerDecks=Net Archive Pioneer Decks lblNetArchivePioneerDecks=Net Archive Pioneer Decks
lblNetArchiveModernDecks=Net Archive Modern Decks
lblNetArchiveLegacyDecks=Net Archive Legacy Decks lblNetArchiveLegacyDecks=Net Archive Legacy Decks
lblNetArchiveVintageDecks=Net Archive Vintage Decks
#VSubmenuTutorial #VSubmenuTutorial
lblTutorial=Tutorial lblTutorial=Tutorial
lblTutorialMode=Tutorial Mode lblTutorialMode=Tutorial Mode

View File

@@ -584,10 +584,11 @@ lblRandomThemeDecks=ランダムテーマデッキ
lblRandomDecks=ランダムデッキ lblRandomDecks=ランダムデッキ
lblNetDecks=ネットデッキ lblNetDecks=ネットデッキ
lblNetCommanderDecks=ネット統率者デッキ lblNetCommanderDecks=ネット統率者デッキ
lblNetArchiveStandardDecks=Net Standard Archive Decks lblNetArchiveStandardDecks=Net Archive Standard Decks
lblNetArchiveModernDecks=Net Modern Archive Decks
lblNetArchivePioneerDecks=Net Archive Pioneer Decks lblNetArchivePioneerDecks=Net Archive Pioneer Decks
lblNetArchiveModernDecks=Net Archive Modern Decks
lblNetArchiveLegacyDecks=Net Archive Legacy Decks lblNetArchiveLegacyDecks=Net Archive Legacy Decks
lblNetArchiveVintageDecks=Net Archive Vintage Decks
#VSubmenuTutorial #VSubmenuTutorial
lblTutorial=チュートリアル lblTutorial=チュートリアル
lblTutorialMode=チュートリアルモード lblTutorialMode=チュートリアルモード

View File

@@ -586,6 +586,8 @@ lblNetCommanderDecks=网络指挥官套牌
lblNetArchiveStandardDecks=网络标准套牌存档 lblNetArchiveStandardDecks=网络标准套牌存档
lblNetArchiveModernDecks=网络摩登套牌存档 lblNetArchiveModernDecks=网络摩登套牌存档
lblNetArchivePioneerDecks=网络先驱套牌存档 lblNetArchivePioneerDecks=网络先驱套牌存档
lblNetArchiveLegacyDecks=Net Archive Legacy Decks
lblNetArchiveVintageDecks=Net Archive Vintage Decks
#VSubmenuTutorial #VSubmenuTutorial
lblTutorial=教程 lblTutorial=教程
lblTutorialMode=教程模式 lblTutorialMode=教程模式

File diff suppressed because it is too large Load Diff

View File

@@ -655,6 +655,14 @@ public class DeckProxy implements InventoryItem {
return decks; return decks;
} }
public static List<DeckProxy> getNetArchiveVintageDecks(final NetDeckArchiveVintage category) {
final List<DeckProxy> decks = new ArrayList<>();
if (category != null) {
addDecksRecursivelly("Constructed", GameType.Constructed, decks, "", category, null);
}
return decks;
}
public static CardEdition getDefaultLandSet(Deck deck) { public static CardEdition getDefaultLandSet(Deck deck) {
List<CardEdition> availableEditions = new ArrayList<>(); List<CardEdition> availableEditions = new ArrayList<>();

View File

@@ -34,7 +34,8 @@ public enum DeckType {
NET_ARCHIVE_STANDARD_DECK("lblNetArchiveStandardDecks"), NET_ARCHIVE_STANDARD_DECK("lblNetArchiveStandardDecks"),
NET_ARCHIVE_PIONEER_DECK("lblNetArchivePioneerDecks"), NET_ARCHIVE_PIONEER_DECK("lblNetArchivePioneerDecks"),
NET_ARCHIVE_MODERN_DECK("lblNetArchiveModernDecks"), NET_ARCHIVE_MODERN_DECK("lblNetArchiveModernDecks"),
NET_ARCHIVE_LEGACY_DECK("lblNetArchiveLegacyDecks"); NET_ARCHIVE_LEGACY_DECK("lblNetArchiveLegacyDecks"),
NET_ARCHIVE_VINTAGE_DECK("lblNetArchiveVintageDecks");
public static DeckType[] ConstructedOptions; public static DeckType[] ConstructedOptions;
public static DeckType[] CommanderOptions; public static DeckType[] CommanderOptions;
@@ -59,8 +60,8 @@ public enum DeckType {
DeckType.NET_ARCHIVE_STANDARD_DECK, DeckType.NET_ARCHIVE_STANDARD_DECK,
DeckType.NET_ARCHIVE_PIONEER_DECK, DeckType.NET_ARCHIVE_PIONEER_DECK,
DeckType.NET_ARCHIVE_MODERN_DECK, DeckType.NET_ARCHIVE_MODERN_DECK,
DeckType.NET_ARCHIVE_LEGACY_DECK DeckType.NET_ARCHIVE_LEGACY_DECK,
DeckType.NET_ARCHIVE_VINTAGE_DECK
}; };
} else { } else {
ConstructedOptions = new DeckType[]{ ConstructedOptions = new DeckType[]{
@@ -74,8 +75,11 @@ public enum DeckType {
DeckType.RANDOM_DECK, DeckType.RANDOM_DECK,
DeckType.NET_DECK, DeckType.NET_DECK,
DeckType.NET_ARCHIVE_STANDARD_DECK, DeckType.NET_ARCHIVE_STANDARD_DECK,
DeckType.NET_ARCHIVE_PIONEER_DECK,
DeckType.NET_ARCHIVE_MODERN_DECK, DeckType.NET_ARCHIVE_MODERN_DECK,
DeckType.NET_ARCHIVE_PIONEER_DECK DeckType.NET_ARCHIVE_LEGACY_DECK,
DeckType.NET_ARCHIVE_VINTAGE_DECK
}; };
} }
} }

View File

@@ -0,0 +1,122 @@
package forge.deck;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import forge.GuiBase;
import forge.deck.io.DeckSerializer;
import forge.deck.io.DeckStorage;
import forge.download.GuiDownloadZipService;
import forge.game.GameType;
import forge.properties.ForgeConstants;
import forge.util.FileUtil;
import forge.util.WaitCallback;
import forge.util.gui.SGuiChoose;
import forge.util.storage.StorageBase;
public class NetDeckArchiveVintage extends StorageBase<Deck> {
public static final String PREFIX = "NET_ARCHIVE_VINTAGE_DECK";
private static Map<String, NetDeckArchiveVintage> constructed, commander, brawl;
private static Map<String, NetDeckArchiveVintage> loadCategories(String filename) {
Map<String, NetDeckArchiveVintage> categories = new TreeMap<>();
if (FileUtil.doesFileExist(filename)) {
List<String> lines = FileUtil.readFile(filename);
for (String line : lines) {
int idx = line.indexOf('|');
if (idx != -1) {
String name = line.substring(0, idx).trim();
String url = line.substring(idx + 1).trim();
categories.put(name, new NetDeckArchiveVintage(name, url));
}
}
}
return categories;
}
public static NetDeckArchiveVintage selectAndLoad(GameType gameType) {
return selectAndLoad(gameType, null);
}
public static NetDeckArchiveVintage selectAndLoad(GameType gameType, String name) {
Map<String, NetDeckArchiveVintage> categories;
switch (gameType) {
case Constructed:
case Gauntlet:
if (constructed == null) {
constructed = loadCategories(ForgeConstants.NET_ARCHIVE_VINTAGE_DECKS_LIST_FILE);
}
categories = constructed;
break;
default:
return null;
}
if (name != null) {
NetDeckArchiveVintage category = categories.get(name);
if (category != null && category.map.isEmpty()) {
//if name passed in, try to load decks from current cached files
File downloadDir = new File(category.getFullPath());
if (downloadDir.exists()) {
for (File file : downloadDir.listFiles(DeckStorage.DCK_FILE_FILTER)) {
Deck deck = DeckSerializer.fromFile(file);
if (deck != null) {
category.map.put(deck.getName(), deck);
}
}
}
}
return category;
}
final NetDeckArchiveVintage c = SGuiChoose.oneOrNone("Select a Net Deck Archive Vintage category", categories.values());
if (c == null) { return null; }
if (c.map.isEmpty()) { //only download decks once per session
WaitCallback<Boolean> callback = new WaitCallback<Boolean>() {
@Override
public void run() {
String downloadLoc = c.getFullPath();
GuiBase.getInterface().download(new GuiDownloadZipService(c.getName(), "decks", c.getUrl(), downloadLoc, downloadLoc, null) {
@Override
protected void copyInputStream(InputStream in, String outPath) throws IOException {
super.copyInputStream(in, outPath);
Deck deck = DeckSerializer.fromFile(new File(outPath));
if (deck != null) {
c.map.put(deck.getName(), deck);
}
}
}, this);
}
};
if (!callback.invokeAndWait()) { return null; } //wait for download to finish
}
return c;
}
private final String url;
private NetDeckArchiveVintage(String name0, String url0) {
super(name0, ForgeConstants.DECK_NET_ARCHIVE_DIR + name0, new HashMap<>());
url = url0;
}
public String getUrl() {
return url;
}
public String getDeckType() {
return "Net Archive Vintage Decks - " + name;
}
@Override
public String toString() {
return name;
}
}

View File

@@ -54,6 +54,8 @@ public final class ForgeConstants {
public static final String NET_ARCHIVE_PIONEER_DECKS_LIST_FILE = LISTS_DIR + "net-decks-archive-pioneer.txt"; public static final String NET_ARCHIVE_PIONEER_DECKS_LIST_FILE = LISTS_DIR + "net-decks-archive-pioneer.txt";
public static final String NET_ARCHIVE_MODERN_DECKS_LIST_FILE = LISTS_DIR + "net-decks-archive-modern.txt"; public static final String NET_ARCHIVE_MODERN_DECKS_LIST_FILE = LISTS_DIR + "net-decks-archive-modern.txt";
public static final String NET_ARCHIVE_LEGACY_DECKS_LIST_FILE = LISTS_DIR + "net-decks-archive-legacy.txt"; public static final String NET_ARCHIVE_LEGACY_DECKS_LIST_FILE = LISTS_DIR + "net-decks-archive-legacy.txt";
public static final String NET_ARCHIVE_VINTAGE_DECKS_LIST_FILE = LISTS_DIR + "net-decks-archive-vintage.txt";
public static final String CHANGES_FILE = ASSETS_DIR + "README.txt"; public static final String CHANGES_FILE = ASSETS_DIR + "README.txt";
public static final String CHANGES_FILE_NO_RELEASE = ASSETS_DIR + "CHANGES.txt"; public static final String CHANGES_FILE_NO_RELEASE = ASSETS_DIR + "CHANGES.txt";