Merge branch 'netdeckarchivemodern' into 'master'

New Net Deck Category: Deck Modern Archive

See merge request core-developers/forge!3972
This commit is contained in:
Michael Kamensky
2021-02-22 12:10:56 +00:00
13 changed files with 2700 additions and 12 deletions

View File

@@ -585,6 +585,7 @@ lblRandomDecks=zufälliges Deck
lblNetDecks=Decks aus dem Netz
lblNetCommanderDecks=Commanderdecks aus dem Netz
lblNetArchiveStandardDecks=Netz-Archiv-Standarddecks
lblNetArchiveModernDecks=Netz-Archiv-Moderndecks
#VSubmenuTutorial
lblTutorial=Tutorial
lblTutorialMode=Tutorial Mode

View File

@@ -585,6 +585,7 @@ lblRandomDecks=Random Decks
lblNetDecks=Net Decks
lblNetCommanderDecks=Net Commander Decks
lblNetArchiveStandardDecks=Net Archive Standard Decks
lblNetArchiveModernDecks=Net Archive Modern Decks
#VSubmenuTutorial
lblTutorial=Tutorial
lblTutorialMode=Tutorial Mode

View File

@@ -585,6 +585,7 @@ lblRandomDecks=Mazos aleatorios
lblNetDecks=Mazos online
lblNetCommanderDecks=Mazos Commander online
lblNetArchiveStandardDecks=Archivo online de mazos Standard
lblNetArchiveModernDecks=Archivo online de mazos Modern
#VSubmenuTutorial
lblTutorial=Tutorial
lblTutorialMode=Modo Tutorial

View File

@@ -584,7 +584,8 @@ lblRandomThemeDecks=Mazzi tematici casuali
lblRandomDecks=Mazzi casuali
lblNetDecks=Net Decks
lblNetCommanderDecks=Mazzi Net Commander
lblNetArchiveDecks=Net Archive Standard Decks
lblNetArchiveStandardDecks=Net Archive Standard Decks
lblNetArchiveModernDecks=Net Archive Modern Decks
#VSubmenuTutorial
lblTutorial=Tutorial
lblTutorialMode=Tutorial Mode

View File

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

View File

@@ -583,7 +583,8 @@ lblRandomThemeDecks=随机主题套牌
lblRandomDecks=随机套牌
lblNetDecks=网络套牌
lblNetCommanderDecks=网络指挥官套牌
lblNetArchiveStandardDecks=Net Archive Standard Decks
lblNetArchiveStandardDecks=Net Standard Archive Decks
lblNetArchiveModernDecks=Net Modern Archive Decks
#VSubmenuTutorial
lblTutorial=教程
lblTutorialMode=教程模式

File diff suppressed because it is too large Load Diff

View File

@@ -624,7 +624,15 @@ public class DeckProxy implements InventoryItem {
return decks;
}
public static List<DeckProxy> getNetArchiveDecks(final NetDeckArchiveStandard category) {
public static List<DeckProxy> getNetArchiveStandardDecks(final NetDeckArchiveStandard category) {
final List<DeckProxy> decks = new ArrayList<>();
if (category != null) {
addDecksRecursivelly("Constructed", GameType.Constructed, decks, "", category, null);
}
return decks;
}
public static List<DeckProxy> getNetArchiveModernDecks(final NetDeckArchiveModern category) {
final List<DeckProxy> decks = new ArrayList<>();
if (category != null) {
addDecksRecursivelly("Constructed", GameType.Constructed, decks, "", category, null);

View File

@@ -31,7 +31,8 @@ public enum DeckType {
RANDOM_DECK("lblRandomDecks"),
NET_DECK("lblNetDecks"),
NET_COMMANDER_DECK("lblNetCommanderDecks"),
NET_ARCHIVE_STANDARD_DECK("lblNetArchiveStandardDecks");
NET_ARCHIVE_STANDARD_DECK("lblNetArchiveStandardDecks"),
NET_ARCHIVE_MODERN_DECK("lblNetArchiveModernDecks");
public static DeckType[] ConstructedOptions;
public static DeckType[] CommanderOptions;
@@ -53,7 +54,8 @@ public enum DeckType {
DeckType.THEME_DECK,
DeckType.RANDOM_DECK,
DeckType.NET_DECK,
DeckType.NET_ARCHIVE_STANDARD_DECK
DeckType.NET_ARCHIVE_STANDARD_DECK,
DeckType.NET_ARCHIVE_MODERN_DECK
};
} else {
ConstructedOptions = new DeckType[]{
@@ -66,7 +68,9 @@ public enum DeckType {
DeckType.THEME_DECK,
DeckType.RANDOM_DECK,
DeckType.NET_DECK,
DeckType.NET_ARCHIVE_STANDARD_DECK
DeckType.NET_ARCHIVE_STANDARD_DECK,
DeckType.NET_ARCHIVE_MODERN_DECK
};
}
}

View File

@@ -0,0 +1,121 @@
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 NetDeckArchiveModern extends StorageBase<Deck> {
public static final String PREFIX = "NET_ARCHIVE_MODERN_DECK";
private static Map<String, NetDeckArchiveModern> constructed, commander, brawl;
private static Map<String, NetDeckArchiveModern> loadCategories(String filename) {
Map<String, NetDeckArchiveModern> 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 NetDeckArchiveModern(name, url));
}
}
}
return categories;
}
public static NetDeckArchiveModern selectAndLoad(GameType gameType) {
return selectAndLoad(gameType, null);
}
public static NetDeckArchiveModern selectAndLoad(GameType gameType, String name) {
Map<String, NetDeckArchiveModern> categories;
switch (gameType) {
case Constructed:
case Gauntlet:
if (constructed == null) {
constructed = loadCategories(ForgeConstants.NET_ARCHIVE_MODERN_DECKS_LIST_FILE);
}
categories = constructed;
break;
default:
return null;
}
if (name != null) {
NetDeckArchiveModern 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 NetDeckArchiveModern c = SGuiChoose.oneOrNone("Select a Net Deck Archive Modern 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 NetDeckArchiveModern(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 Modern Decks - " + name;
}
@Override
public String toString() {
return name;
}
}

View File

@@ -106,6 +106,7 @@ public class NetDeckArchiveStandard extends StorageBase<Deck> {
url = url0;
}
public String getUrl() {
return url;
}

View File

@@ -51,6 +51,7 @@ public final class ForgeConstants {
public static final String BORDERLESS_CARD_LIST_FILE = LISTS_DIR + "borderlessCardList.txt";
public static final String SKINS_LIST_FILE = LISTS_DIR + "skinsList.txt";
public static final String NET_ARCHIVE_STANDARD_DECKS_LIST_FILE = LISTS_DIR + "net-decks-archive-standard.txt";
public static final String NET_ARCHIVE_MODERN_DECKS_LIST_FILE = LISTS_DIR + "net-decks-archive-modern.txt";
public static final String CHANGES_FILE = ASSETS_DIR + "README.txt";