mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 02:38:02 +00:00
Decks save/load operations moved to DeckIO class, references updated
This commit is contained in:
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -11145,6 +11145,7 @@ src/main/java/forge/control/match/package-info.java -text
|
|||||||
src/main/java/forge/control/package-info.java -text
|
src/main/java/forge/control/package-info.java -text
|
||||||
src/main/java/forge/deck/Deck.java svneol=native#text/plain
|
src/main/java/forge/deck/Deck.java svneol=native#text/plain
|
||||||
src/main/java/forge/deck/DeckGeneration.java -text
|
src/main/java/forge/deck/DeckGeneration.java -text
|
||||||
|
src/main/java/forge/deck/DeckIO.java -text
|
||||||
src/main/java/forge/deck/DeckManager.java svneol=native#text/plain
|
src/main/java/forge/deck/DeckManager.java svneol=native#text/plain
|
||||||
src/main/java/forge/deck/DeckRecognizer.java -text
|
src/main/java/forge/deck/DeckRecognizer.java -text
|
||||||
src/main/java/forge/deck/generate/Generate2ColorDeck.java svneol=native#text/plain
|
src/main/java/forge/deck/generate/Generate2ColorDeck.java svneol=native#text/plain
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import forge.Constant;
|
|||||||
import forge.PlayerType;
|
import forge.PlayerType;
|
||||||
import forge.control.FControl;
|
import forge.control.FControl;
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
|
import forge.deck.DeckIO;
|
||||||
import forge.deck.DeckManager;
|
import forge.deck.DeckManager;
|
||||||
import forge.game.GameType;
|
import forge.game.GameType;
|
||||||
import forge.game.limited.SealedDeck;
|
import forge.game.limited.SealedDeck;
|
||||||
@@ -209,7 +210,7 @@ public class ControlSealed {
|
|||||||
aiDeck.setName("AI_" + sDeckName);
|
aiDeck.setName("AI_" + sDeckName);
|
||||||
aiDeck.setPlayerType(PlayerType.COMPUTER);
|
aiDeck.setPlayerType(PlayerType.COMPUTER);
|
||||||
deckManager.addDeck(aiDeck);
|
deckManager.addDeck(aiDeck);
|
||||||
DeckManager.writeDeck(aiDeck, DeckManager.makeFileName(aiDeck));
|
DeckIO.writeDeck(aiDeck, DeckIO.makeFileName(aiDeck));
|
||||||
|
|
||||||
view.getParentView().getUtilitiesController().showDeckEditor(GameType.Sealed, deck);
|
view.getParentView().getUtilitiesController().showDeckEditor(GameType.Sealed, deck);
|
||||||
}
|
}
|
||||||
|
|||||||
518
src/main/java/forge/deck/DeckIO.java
Normal file
518
src/main/java/forge/deck/DeckIO.java
Normal file
@@ -0,0 +1,518 @@
|
|||||||
|
package forge.deck;
|
||||||
|
|
||||||
|
import java.io.BufferedWriter;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.FilenameFilter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import javax.swing.JOptionPane;
|
||||||
|
import javax.swing.filechooser.FileFilter;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
|
import forge.Card;
|
||||||
|
import forge.PlayerType;
|
||||||
|
import forge.game.GameType;
|
||||||
|
import forge.gui.deckeditor.TableSorter;
|
||||||
|
import forge.item.CardPrinted;
|
||||||
|
import forge.item.ItemPoolView;
|
||||||
|
import forge.properties.ForgeProps;
|
||||||
|
import forge.properties.NewConstants;
|
||||||
|
import forge.util.FileUtil;
|
||||||
|
import forge.util.SectionUtil;
|
||||||
|
import freemarker.template.Configuration;
|
||||||
|
import freemarker.template.DefaultObjectWrapper;
|
||||||
|
import freemarker.template.Template;
|
||||||
|
import freemarker.template.TemplateException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Write javadoc for this type.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class DeckIO {
|
||||||
|
|
||||||
|
private static final String NAME = "Name";
|
||||||
|
private static final String DECK_TYPE = "Deck Type";
|
||||||
|
private static final String COMMENT = "Comment";
|
||||||
|
private static final String PLAYER = "Player";
|
||||||
|
private static final String CSTM_POOL = "Custom Pool";
|
||||||
|
/** Constant <code>BDKFileFilter</code>. */
|
||||||
|
static FilenameFilter bdkFileFilter = new FilenameFilter() {
|
||||||
|
@Override
|
||||||
|
public boolean accept(final File dir, final String name) {
|
||||||
|
return name.endsWith(".bdk");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
/** Constant <code>DCKFileFilter</code>. */
|
||||||
|
public static final FilenameFilter DCK_FILE_FILTER = new FilenameFilter() {
|
||||||
|
@Override
|
||||||
|
public boolean accept(final File dir, final String name) {
|
||||||
|
return name.endsWith(".dck");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
/** The Constant DCK_FILTER. */
|
||||||
|
public static final FileFilter DCK_FILTER = new FileFilter() {
|
||||||
|
@Override
|
||||||
|
public boolean accept(final File f) {
|
||||||
|
return f.getName().endsWith(".dck") || f.isDirectory();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDescription() {
|
||||||
|
return "Simple Deck File .dck";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
/** The Constant HTML_FILTER. */
|
||||||
|
public static final FileFilter HTML_FILTER = new FileFilter() {
|
||||||
|
@Override
|
||||||
|
public boolean accept(final File f) {
|
||||||
|
return f.getName().endsWith(".html") || f.isDirectory();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDescription() {
|
||||||
|
return "Simple Deck File .html";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* readDeck.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param deckFile
|
||||||
|
* a {@link java.io.File} object.
|
||||||
|
* @return a {@link forge.deck.Deck} object.
|
||||||
|
*/
|
||||||
|
public static Deck readDeck(final File deckFile) {
|
||||||
|
|
||||||
|
final List<String> lines = FileUtil.readFile(deckFile);
|
||||||
|
final Map<String, List<String>> sections = SectionUtil.parseSections(lines);
|
||||||
|
if (sections.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Deck d = new Deck();
|
||||||
|
|
||||||
|
final String firstLine = lines.get(0);
|
||||||
|
if (!firstLine.startsWith("[") || firstLine.equalsIgnoreCase("[general]")) {
|
||||||
|
readDeckOldMetadata(lines.iterator(), d);
|
||||||
|
} else {
|
||||||
|
readDeckMetadata(sections.get("metadata"), d);
|
||||||
|
}
|
||||||
|
d.setMain(readCardList(sections.get("main")));
|
||||||
|
d.setSideboard(readCardList(sections.get("sideboard")));
|
||||||
|
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void readDeckMetadata(final Iterable<String> lines, final Deck d) {
|
||||||
|
if (lines == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final Iterator<String> lineIterator = lines.iterator();
|
||||||
|
while (lineIterator.hasNext()) {
|
||||||
|
final String line = lineIterator.next();
|
||||||
|
|
||||||
|
final String[] linedata = line.split("=", 2);
|
||||||
|
final String field = linedata[0].toLowerCase();
|
||||||
|
String value = "";
|
||||||
|
|
||||||
|
if (linedata.length > 1) {
|
||||||
|
value = linedata[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NAME.equalsIgnoreCase(field)) {
|
||||||
|
d.setName(value);
|
||||||
|
|
||||||
|
} else if (COMMENT.equalsIgnoreCase(field)) {
|
||||||
|
d.setComment(value);
|
||||||
|
|
||||||
|
} else if (DECK_TYPE.equalsIgnoreCase(field)) {
|
||||||
|
d.setDeckType(GameType.smartValueOf(value));
|
||||||
|
|
||||||
|
} else if (CSTM_POOL.equalsIgnoreCase(field)) {
|
||||||
|
d.setCustomPool(value.equalsIgnoreCase("true"));
|
||||||
|
|
||||||
|
} else if (PLAYER.equalsIgnoreCase(field)) {
|
||||||
|
if ("human".equalsIgnoreCase(value)) {
|
||||||
|
d.setPlayerType(PlayerType.HUMAN);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
d.setPlayerType(PlayerType.COMPUTER);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* readDeckOld.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param iterator
|
||||||
|
* a {@link java.util.ListIterator} object.
|
||||||
|
* @return a {@link forge.deck.Deck} object.
|
||||||
|
*/
|
||||||
|
private static void readDeckOldMetadata(final Iterator<String> iterator, final Deck d) {
|
||||||
|
|
||||||
|
String line;
|
||||||
|
// readDeck name
|
||||||
|
final String name = iterator.next();
|
||||||
|
|
||||||
|
// readDeck comments
|
||||||
|
String comment = null;
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
line = iterator.next();
|
||||||
|
if ((line != null) && !line.equals("[general")) {
|
||||||
|
if (comment == null) {
|
||||||
|
comment = line;
|
||||||
|
} else {
|
||||||
|
comment += "\n" + line;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// readDeck deck type
|
||||||
|
|
||||||
|
final GameType deckType = iterator.hasNext() ? GameType.smartValueOf(iterator.next()) : GameType.Constructed;
|
||||||
|
|
||||||
|
d.setName(name);
|
||||||
|
d.setComment(comment);
|
||||||
|
d.setDeckType(deckType);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Precondition: iterator should point at the first line of cards list
|
||||||
|
private static List<String> readCardList(final Iterable<String> lines) {
|
||||||
|
final List<String> result = new ArrayList<String>();
|
||||||
|
final Pattern p = Pattern.compile("((\\d+)\\s+)?(.*?)");
|
||||||
|
|
||||||
|
if (lines == null) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Iterator<String> lineIterator = lines.iterator();
|
||||||
|
while (lineIterator.hasNext()) {
|
||||||
|
final String line = lineIterator.next();
|
||||||
|
if (line.startsWith("[")) {
|
||||||
|
break;
|
||||||
|
} // there comes another section
|
||||||
|
|
||||||
|
final Matcher m = p.matcher(line.trim());
|
||||||
|
m.matches();
|
||||||
|
final String sCnt = m.group(2);
|
||||||
|
final String cardName = m.group(3);
|
||||||
|
if (StringUtils.isBlank(cardName)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
final int count = sCnt == null ? 1 : Integer.parseInt(sCnt);
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
result.add(cardName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String deriveFileName(final String deckName) {
|
||||||
|
// skips all but the listed characters
|
||||||
|
return deckName.replaceAll("[^-_$#@.{[()]} a-zA-Z0-9]", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
// only accepts numbers, letters or dashes up to 20 characters in length
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Clean deck name.
|
||||||
|
*
|
||||||
|
* @param in
|
||||||
|
* a String
|
||||||
|
* @return a String
|
||||||
|
*/
|
||||||
|
public static String cleanDeckName(final String in) {
|
||||||
|
final char[] c = in.toCharArray();
|
||||||
|
final StringBuilder sb = new StringBuilder();
|
||||||
|
for (int i = 0; (i < c.length) && (i < 20); i++) {
|
||||||
|
if (Character.isLetterOrDigit(c[i]) || (c[i] == '-')) {
|
||||||
|
sb.append(c[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Make file name.
|
||||||
|
*
|
||||||
|
* @param deckName
|
||||||
|
* a String
|
||||||
|
* @param deckType
|
||||||
|
* a GameType
|
||||||
|
* @return a File
|
||||||
|
*/
|
||||||
|
public static File makeFileName(final String deckName, final GameType deckType) {
|
||||||
|
final File path = ForgeProps.getFile(NewConstants.NEW_DECKS);
|
||||||
|
if (deckType == GameType.Draft) {
|
||||||
|
return new File(path, deriveFileName(deckName) + ".bdk");
|
||||||
|
} else {
|
||||||
|
return new File(path, deriveFileName(deckName) + ".dck");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Make file name.
|
||||||
|
*
|
||||||
|
* @param deck
|
||||||
|
* a Deck
|
||||||
|
* @return a File
|
||||||
|
*/
|
||||||
|
public static File makeFileName(final Deck deck) {
|
||||||
|
return makeFileName(deck.getName(), deck.getDeckType());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Write draft Decks.
|
||||||
|
*
|
||||||
|
* @param drafts
|
||||||
|
* a Deck[]
|
||||||
|
*/
|
||||||
|
public static void writeDraftDecks(final Deck[] drafts) {
|
||||||
|
final File f = makeFileName(drafts[0]);
|
||||||
|
f.mkdir();
|
||||||
|
for (int i = 0; i < drafts.length; i++) {
|
||||||
|
FileUtil.writeFile(new File(f, i + ".dck"), serializeDeck(drafts[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* writeDeck.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param d
|
||||||
|
* a {@link forge.deck.Deck} object.
|
||||||
|
* @param out
|
||||||
|
* a {@link java.io.BufferedWriter} object.
|
||||||
|
* @throws java.io.IOException
|
||||||
|
* if any.
|
||||||
|
*/
|
||||||
|
private static List<String> serializeDeck(final Deck d) {
|
||||||
|
final List<String> out = new ArrayList<String>();
|
||||||
|
out.add(String.format("[metadata]"));
|
||||||
|
|
||||||
|
out.add(String.format("%s=%s", NAME, d.getName().replaceAll("\n", "")));
|
||||||
|
out.add(String.format("%s=%s", DECK_TYPE, d.getDeckType()));
|
||||||
|
// these are optional
|
||||||
|
if (d.getComment() != null) {
|
||||||
|
out.add(String.format("%s=%s", COMMENT, d.getComment().replaceAll("\n", "")));
|
||||||
|
}
|
||||||
|
if (d.getPlayerType() != null) {
|
||||||
|
out.add(String.format("%s=%s", PLAYER, d.getPlayerType()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (d.isCustomPool()) {
|
||||||
|
out.add(String.format("%s=%s", CSTM_POOL, "true"));
|
||||||
|
}
|
||||||
|
|
||||||
|
out.add(String.format("%s", "[main]"));
|
||||||
|
out.addAll(writeCardPool(d.getMain()));
|
||||||
|
|
||||||
|
out.add(String.format("%s", "[sideboard]"));
|
||||||
|
out.addAll(writeCardPool(d.getSideboard()));
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* writeDeck.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param d
|
||||||
|
* a {@link forge.deck.Deck} object.
|
||||||
|
* @param out
|
||||||
|
* a {@link java.io.BufferedWriter} object.
|
||||||
|
* @throws java.io.IOException
|
||||||
|
* if any.
|
||||||
|
*/
|
||||||
|
private static void writeDeckHtml(final Deck d, final BufferedWriter out) throws IOException {
|
||||||
|
Template temp = null;
|
||||||
|
final int cardBorder = 0;
|
||||||
|
final int height = 319;
|
||||||
|
final int width = 222;
|
||||||
|
|
||||||
|
/* Create and adjust the configuration */
|
||||||
|
final Configuration cfg = new Configuration();
|
||||||
|
try {
|
||||||
|
cfg.setClassForTemplateLoading(d.getClass(), "/");
|
||||||
|
cfg.setObjectWrapper(new DefaultObjectWrapper());
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------------------
|
||||||
|
* -
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* You usually do these for many times in the application
|
||||||
|
* life-cycle:
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Get or create a template */
|
||||||
|
temp = cfg.getTemplate("proxy-template.ftl");
|
||||||
|
|
||||||
|
/* Create a data-model */
|
||||||
|
final Map<String, Object> root = new HashMap<String, Object>();
|
||||||
|
root.put("title", d.getName());
|
||||||
|
final List<String> list = new ArrayList<String>();
|
||||||
|
for (final Card card : d.getMain().toForgeCardList().toArray()) {
|
||||||
|
// System.out.println(card.getSets().get(card.getSets().size() -
|
||||||
|
// 1).URL);
|
||||||
|
list.add(card.getSets().get(card.getSets().size() - 1).getUrl());
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* List<String> nameList = new ArrayList<String>(); for (Card card :
|
||||||
|
* d.getMain().toForgeCardList().toArray()) {
|
||||||
|
* //System.out.println(card.getSets().get(card.getSets().size() -
|
||||||
|
* 1).URL); nameList.add(card.getName()); }
|
||||||
|
*/
|
||||||
|
|
||||||
|
final TreeMap<String, Integer> map = new TreeMap<String, Integer>();
|
||||||
|
for (final Entry<CardPrinted, Integer> entry : d.getMain().getOrderedList()) {
|
||||||
|
map.put(entry.getKey().getName(), entry.getValue());
|
||||||
|
// System.out.println(entry.getValue() + " " +
|
||||||
|
// entry.getKey().getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
root.put("urls", list);
|
||||||
|
root.put("cardBorder", cardBorder);
|
||||||
|
root.put("height", height);
|
||||||
|
root.put("width", width);
|
||||||
|
root.put("cardlistWidth", width - 11);
|
||||||
|
// root.put("nameList", nameList);
|
||||||
|
root.put("cardList", map);
|
||||||
|
|
||||||
|
/* Merge data-model with template */
|
||||||
|
// StringWriter sw = new StringWriter();
|
||||||
|
temp.process(root, out);
|
||||||
|
out.flush();
|
||||||
|
} catch (final IOException e) {
|
||||||
|
System.out.println(e.toString());
|
||||||
|
} catch (final TemplateException e) {
|
||||||
|
System.out.println(e.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<String> writeCardPool(final ItemPoolView<CardPrinted> pool) {
|
||||||
|
final List<Entry<CardPrinted, Integer>> main2sort = pool.getOrderedList();
|
||||||
|
Collections.sort(main2sort, TableSorter.BY_NAME_THEN_SET);
|
||||||
|
final List<String> out = new ArrayList<String>();
|
||||||
|
for (final Entry<CardPrinted, Integer> e : main2sort) {
|
||||||
|
final CardPrinted card = e.getKey();
|
||||||
|
final boolean hasBadSetInfo = "???".equals(card.getSet()) || StringUtils.isBlank(card.getSet());
|
||||||
|
if (hasBadSetInfo) {
|
||||||
|
out.add(String.format("%d %s", e.getValue(), card.getName()));
|
||||||
|
} else {
|
||||||
|
out.add(String.format("%d %s|%s", e.getValue(), card.getName(), card.getSet()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* writeDeck.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param d
|
||||||
|
* a {@link forge.deck.Deck} object.
|
||||||
|
* @param f
|
||||||
|
* a {@link java.io.File} object.
|
||||||
|
*/
|
||||||
|
public static void writeDeck(final Deck d, final File f) {
|
||||||
|
FileUtil.writeFile(f, serializeDeck(d));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* Write deck to HTML.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param d
|
||||||
|
* a {@link forge.deck.Deck} object.
|
||||||
|
* @param f
|
||||||
|
* a {@link java.io.File} object.
|
||||||
|
*/
|
||||||
|
public static void writeDeckHtml(final Deck d, final File f) {
|
||||||
|
try {
|
||||||
|
final BufferedWriter writer = new BufferedWriter(new FileWriter(f));
|
||||||
|
writeDeckHtml(d, writer);
|
||||||
|
writer.close();
|
||||||
|
} catch (final IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* readAllDecks.
|
||||||
|
* </p>
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public final static Map<String, Deck> readAllDecks(File deckDir) {
|
||||||
|
Map<String, Deck> result = new HashMap<String, Deck>();
|
||||||
|
final List<String> decksThatFailedToLoad = new ArrayList<String>();
|
||||||
|
File[] files = deckDir.listFiles(DeckIO.DCK_FILE_FILTER);
|
||||||
|
for (final File file : files) {
|
||||||
|
try {
|
||||||
|
final Deck newDeck = DeckIO.readDeck(file);
|
||||||
|
result.put(newDeck.getName(), newDeck);
|
||||||
|
} catch (final NoSuchElementException ex) {
|
||||||
|
final String message = String.format("%s failed to load because ---- %s", file.getName(),
|
||||||
|
ex.getMessage());
|
||||||
|
decksThatFailedToLoad.add(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!decksThatFailedToLoad.isEmpty()) {
|
||||||
|
JOptionPane.showMessageDialog(null,
|
||||||
|
StringUtils.join(decksThatFailedToLoad, System.getProperty("line.separator")),
|
||||||
|
"Some of your decks were not loaded.", JOptionPane.WARNING_MESSAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final static Map<String, Deck[]> readAllDraftDecks(File deckDir)
|
||||||
|
{
|
||||||
|
Map<String, Deck[]> result = new HashMap<String, Deck[]>();
|
||||||
|
File[] files = deckDir.listFiles(DeckIO.bdkFileFilter);
|
||||||
|
for (final File file : files) {
|
||||||
|
final Deck[] d = new Deck[8];
|
||||||
|
|
||||||
|
boolean gotError = false;
|
||||||
|
for (int i = 0; i < d.length; i++) {
|
||||||
|
d[i] = DeckIO.readDeck(new File(file, i + ".dck"));
|
||||||
|
if (d[i] == null) {
|
||||||
|
gotError = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!gotError) {
|
||||||
|
result.put(d[0].getName(), d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -17,44 +17,18 @@
|
|||||||
*/
|
*/
|
||||||
package forge.deck;
|
package forge.deck;
|
||||||
|
|
||||||
import java.io.BufferedWriter;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileWriter;
|
|
||||||
import java.io.FilenameFilter;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
|
||||||
import java.util.NoSuchElementException;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
import javax.swing.JOptionPane;
|
|
||||||
import javax.swing.filechooser.FileFilter;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
|
|
||||||
import forge.Card;
|
|
||||||
import forge.PlayerType;
|
|
||||||
import forge.error.ErrorViewer;
|
import forge.error.ErrorViewer;
|
||||||
import forge.game.GameType;
|
import forge.game.GameType;
|
||||||
import forge.gui.deckeditor.TableSorter;
|
|
||||||
import forge.item.CardPrinted;
|
|
||||||
import forge.item.ItemPoolView;
|
|
||||||
import forge.properties.ForgeProps;
|
|
||||||
import forge.properties.NewConstants;
|
|
||||||
import forge.util.FileUtil;
|
|
||||||
import forge.util.SectionUtil;
|
|
||||||
import freemarker.template.Configuration;
|
|
||||||
import freemarker.template.DefaultObjectWrapper;
|
|
||||||
import freemarker.template.Template;
|
|
||||||
import freemarker.template.TemplateException;
|
|
||||||
|
|
||||||
//reads and writeDeck Deck objects
|
//reads and writeDeck Deck objects
|
||||||
/**
|
/**
|
||||||
@@ -66,55 +40,6 @@ import freemarker.template.TemplateException;
|
|||||||
* @version $Id$
|
* @version $Id$
|
||||||
*/
|
*/
|
||||||
public class DeckManager {
|
public class DeckManager {
|
||||||
/** Constant <code>BDKFileFilter</code>. */
|
|
||||||
private static FilenameFilter bdkFileFilter = new FilenameFilter() {
|
|
||||||
@Override
|
|
||||||
public boolean accept(final File dir, final String name) {
|
|
||||||
return name.endsWith(".bdk");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Constant <code>DCKFileFilter</code>. */
|
|
||||||
public static final FilenameFilter DCK_FILE_FILTER = new FilenameFilter() {
|
|
||||||
@Override
|
|
||||||
public boolean accept(final File dir, final String name) {
|
|
||||||
return name.endsWith(".dck");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/** The Constant DCK_FILTER. */
|
|
||||||
public static final FileFilter DCK_FILTER = new FileFilter() {
|
|
||||||
@Override
|
|
||||||
public boolean accept(final File f) {
|
|
||||||
return f.getName().endsWith(".dck") || f.isDirectory();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDescription() {
|
|
||||||
return "Simple Deck File .dck";
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/** The Constant HTML_FILTER. */
|
|
||||||
public static final FileFilter HTML_FILTER = new FileFilter() {
|
|
||||||
@Override
|
|
||||||
public boolean accept(final File f) {
|
|
||||||
return f.getName().endsWith(".html") || f.isDirectory();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDescription() {
|
|
||||||
return "Simple Deck File .html";
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private static final String NAME = "Name";
|
|
||||||
private static final String DECK_TYPE = "Deck Type";
|
|
||||||
private static final String COMMENT = "Comment";
|
|
||||||
private static final String PLAYER = "Player";
|
|
||||||
private static final String CSTM_POOL = "Custom Pool";
|
|
||||||
|
|
||||||
private File deckDir;
|
|
||||||
private Map<String, Deck> deckMap;
|
private Map<String, Deck> deckMap;
|
||||||
private Map<String, Deck[]> draftMap;
|
private Map<String, Deck[]> draftMap;
|
||||||
|
|
||||||
@@ -131,8 +56,6 @@ public class DeckManager {
|
|||||||
throw new IllegalArgumentException("No deck directory specified");
|
throw new IllegalArgumentException("No deck directory specified");
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
this.deckDir = deckDir;
|
|
||||||
|
|
||||||
if (deckDir.isFile()) {
|
if (deckDir.isFile()) {
|
||||||
throw new IOException("Not a directory");
|
throw new IOException("Not a directory");
|
||||||
} else {
|
} else {
|
||||||
@@ -140,9 +63,8 @@ public class DeckManager {
|
|||||||
if (!deckDir.isDirectory()) {
|
if (!deckDir.isDirectory()) {
|
||||||
throw new IOException("Directory can't be created");
|
throw new IOException("Directory can't be created");
|
||||||
}
|
}
|
||||||
this.deckMap = new HashMap<String, Deck>();
|
this.deckMap = DeckIO.readAllDecks(deckDir);
|
||||||
this.draftMap = new HashMap<String, Deck[]>();
|
this.draftMap = DeckIO.readAllDraftDecks(deckDir);
|
||||||
this.readAllDecks();
|
|
||||||
}
|
}
|
||||||
} catch (final IOException ex) {
|
} catch (final IOException ex) {
|
||||||
ErrorViewer.showError(ex);
|
ErrorViewer.showError(ex);
|
||||||
@@ -343,429 +265,4 @@ public class DeckManager {
|
|||||||
Collections.sort(list);
|
Collections.sort(list);
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* readAllDecks.
|
|
||||||
* </p>
|
|
||||||
*/
|
|
||||||
public final void readAllDecks() {
|
|
||||||
this.deckMap.clear();
|
|
||||||
this.draftMap.clear();
|
|
||||||
|
|
||||||
File[] files;
|
|
||||||
|
|
||||||
final List<String> decksThatFailedToLoad = new ArrayList<String>();
|
|
||||||
files = this.deckDir.listFiles(DeckManager.DCK_FILE_FILTER);
|
|
||||||
for (final File file : files) {
|
|
||||||
try {
|
|
||||||
final Deck newDeck = DeckManager.readDeck(file);
|
|
||||||
this.deckMap.put(newDeck.getName(), newDeck);
|
|
||||||
} catch (final NoSuchElementException ex) {
|
|
||||||
final String message = String.format("%s failed to load because ---- %s", file.getName(),
|
|
||||||
ex.getMessage());
|
|
||||||
decksThatFailedToLoad.add(message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!decksThatFailedToLoad.isEmpty()) {
|
|
||||||
JOptionPane.showMessageDialog(null,
|
|
||||||
StringUtils.join(decksThatFailedToLoad, System.getProperty("line.separator")),
|
|
||||||
"Some of your decks were not loaded.", JOptionPane.WARNING_MESSAGE);
|
|
||||||
}
|
|
||||||
|
|
||||||
files = this.deckDir.listFiles(DeckManager.bdkFileFilter);
|
|
||||||
for (final File file : files) {
|
|
||||||
final Deck[] d = new Deck[8];
|
|
||||||
|
|
||||||
boolean gotError = false;
|
|
||||||
for (int i = 0; i < d.length; i++) {
|
|
||||||
d[i] = DeckManager.readDeck(new File(file, i + ".dck"));
|
|
||||||
if (d[i] == null) {
|
|
||||||
gotError = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!gotError) {
|
|
||||||
this.draftMap.put(d[0].getName(), d);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* readDeck.
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @param deckFile
|
|
||||||
* a {@link java.io.File} object.
|
|
||||||
* @return a {@link forge.deck.Deck} object.
|
|
||||||
*/
|
|
||||||
public static Deck readDeck(final File deckFile) {
|
|
||||||
|
|
||||||
final List<String> lines = FileUtil.readFile(deckFile);
|
|
||||||
final Map<String, List<String>> sections = SectionUtil.parseSections(lines);
|
|
||||||
if (sections.isEmpty()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
final Deck d = new Deck();
|
|
||||||
|
|
||||||
final String firstLine = lines.get(0);
|
|
||||||
if (!firstLine.startsWith("[") || firstLine.equalsIgnoreCase("[general]")) {
|
|
||||||
DeckManager.readDeckOldMetadata(lines.iterator(), d);
|
|
||||||
} else {
|
|
||||||
DeckManager.readDeckMetadata(sections.get("metadata"), d);
|
|
||||||
}
|
|
||||||
d.setMain(DeckManager.readCardList(sections.get("main")));
|
|
||||||
d.setSideboard(DeckManager.readCardList(sections.get("sideboard")));
|
|
||||||
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void readDeckMetadata(final Iterable<String> lines, final Deck d) {
|
|
||||||
if (lines == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
final Iterator<String> lineIterator = lines.iterator();
|
|
||||||
while (lineIterator.hasNext()) {
|
|
||||||
final String line = lineIterator.next();
|
|
||||||
|
|
||||||
final String[] linedata = line.split("=", 2);
|
|
||||||
final String field = linedata[0].toLowerCase();
|
|
||||||
String value = "";
|
|
||||||
|
|
||||||
if (linedata.length > 1) {
|
|
||||||
value = linedata[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (DeckManager.NAME.equalsIgnoreCase(field)) {
|
|
||||||
d.setName(value);
|
|
||||||
|
|
||||||
} else if (DeckManager.COMMENT.equalsIgnoreCase(field)) {
|
|
||||||
d.setComment(value);
|
|
||||||
|
|
||||||
} else if (DeckManager.DECK_TYPE.equalsIgnoreCase(field)) {
|
|
||||||
d.setDeckType(GameType.smartValueOf(value));
|
|
||||||
|
|
||||||
} else if (DeckManager.CSTM_POOL.equalsIgnoreCase(field)) {
|
|
||||||
d.setCustomPool(value.equalsIgnoreCase("true"));
|
|
||||||
|
|
||||||
} else if (DeckManager.PLAYER.equalsIgnoreCase(field)) {
|
|
||||||
if ("human".equalsIgnoreCase(value)) {
|
|
||||||
d.setPlayerType(PlayerType.HUMAN);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
d.setPlayerType(PlayerType.COMPUTER);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* readDeckOld.
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @param iterator
|
|
||||||
* a {@link java.util.ListIterator} object.
|
|
||||||
* @return a {@link forge.deck.Deck} object.
|
|
||||||
*/
|
|
||||||
private static void readDeckOldMetadata(final Iterator<String> iterator, final Deck d) {
|
|
||||||
|
|
||||||
String line;
|
|
||||||
// readDeck name
|
|
||||||
final String name = iterator.next();
|
|
||||||
|
|
||||||
// readDeck comments
|
|
||||||
String comment = null;
|
|
||||||
while (iterator.hasNext()) {
|
|
||||||
line = iterator.next();
|
|
||||||
if ((line != null) && !line.equals("[general")) {
|
|
||||||
if (comment == null) {
|
|
||||||
comment = line;
|
|
||||||
} else {
|
|
||||||
comment += "\n" + line;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// readDeck deck type
|
|
||||||
|
|
||||||
final GameType deckType = iterator.hasNext() ? GameType.smartValueOf(iterator.next()) : GameType.Constructed;
|
|
||||||
|
|
||||||
d.setName(name);
|
|
||||||
d.setComment(comment);
|
|
||||||
d.setDeckType(deckType);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Precondition: iterator should point at the first line of cards list
|
|
||||||
private static List<String> readCardList(final Iterable<String> lines) {
|
|
||||||
final List<String> result = new ArrayList<String>();
|
|
||||||
final Pattern p = Pattern.compile("((\\d+)\\s+)?(.*?)");
|
|
||||||
|
|
||||||
if (lines == null) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
final Iterator<String> lineIterator = lines.iterator();
|
|
||||||
while (lineIterator.hasNext()) {
|
|
||||||
final String line = lineIterator.next();
|
|
||||||
if (line.startsWith("[")) {
|
|
||||||
break;
|
|
||||||
} // there comes another section
|
|
||||||
|
|
||||||
final Matcher m = p.matcher(line.trim());
|
|
||||||
m.matches();
|
|
||||||
final String sCnt = m.group(2);
|
|
||||||
final String cardName = m.group(3);
|
|
||||||
if (StringUtils.isBlank(cardName)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
final int count = sCnt == null ? 1 : Integer.parseInt(sCnt);
|
|
||||||
for (int i = 0; i < count; i++) {
|
|
||||||
result.add(cardName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String deriveFileName(final String deckName) {
|
|
||||||
// skips all but the listed characters
|
|
||||||
return deckName.replaceAll("[^-_$#@.{[()]} a-zA-Z0-9]", "");
|
|
||||||
}
|
|
||||||
|
|
||||||
// only accepts numbers, letters or dashes up to 20 characters in length
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* Clean deck name.
|
|
||||||
*
|
|
||||||
* @param in
|
|
||||||
* a String
|
|
||||||
* @return a String
|
|
||||||
*/
|
|
||||||
public static String cleanDeckName(final String in) {
|
|
||||||
final char[] c = in.toCharArray();
|
|
||||||
final StringBuilder sb = new StringBuilder();
|
|
||||||
for (int i = 0; (i < c.length) && (i < 20); i++) {
|
|
||||||
if (Character.isLetterOrDigit(c[i]) || (c[i] == '-')) {
|
|
||||||
sb.append(c[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* Make file name.
|
|
||||||
*
|
|
||||||
* @param deckName
|
|
||||||
* a String
|
|
||||||
* @param deckType
|
|
||||||
* a GameType
|
|
||||||
* @return a File
|
|
||||||
*/
|
|
||||||
public static File makeFileName(final String deckName, final GameType deckType) {
|
|
||||||
final File path = ForgeProps.getFile(NewConstants.NEW_DECKS);
|
|
||||||
if (deckType == GameType.Draft) {
|
|
||||||
return new File(path, DeckManager.deriveFileName(deckName) + ".bdk");
|
|
||||||
} else {
|
|
||||||
return new File(path, DeckManager.deriveFileName(deckName) + ".dck");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* Make file name.
|
|
||||||
*
|
|
||||||
* @param deck
|
|
||||||
* a Deck
|
|
||||||
* @return a File
|
|
||||||
*/
|
|
||||||
public static File makeFileName(final Deck deck) {
|
|
||||||
return DeckManager.makeFileName(deck.getName(), deck.getDeckType());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* Write draft Decks.
|
|
||||||
*
|
|
||||||
* @param drafts
|
|
||||||
* a Deck[]
|
|
||||||
*/
|
|
||||||
public static void writeDraftDecks(final Deck[] drafts) {
|
|
||||||
final File f = DeckManager.makeFileName(drafts[0]);
|
|
||||||
f.mkdir();
|
|
||||||
for (int i = 0; i < drafts.length; i++) {
|
|
||||||
FileUtil.writeFile(new File(f, i + ".dck"), DeckManager.serializeDeck(drafts[i]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* writeDeck.
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @param d
|
|
||||||
* a {@link forge.deck.Deck} object.
|
|
||||||
* @param out
|
|
||||||
* a {@link java.io.BufferedWriter} object.
|
|
||||||
* @throws java.io.IOException
|
|
||||||
* if any.
|
|
||||||
*/
|
|
||||||
private static List<String> serializeDeck(final Deck d) {
|
|
||||||
final List<String> out = new ArrayList<String>();
|
|
||||||
out.add(String.format("[metadata]"));
|
|
||||||
|
|
||||||
out.add(String.format("%s=%s", DeckManager.NAME, d.getName().replaceAll("\n", "")));
|
|
||||||
out.add(String.format("%s=%s", DeckManager.DECK_TYPE, d.getDeckType()));
|
|
||||||
// these are optional
|
|
||||||
if (d.getComment() != null) {
|
|
||||||
out.add(String.format("%s=%s", DeckManager.COMMENT, d.getComment().replaceAll("\n", "")));
|
|
||||||
}
|
|
||||||
if (d.getPlayerType() != null) {
|
|
||||||
out.add(String.format("%s=%s", DeckManager.PLAYER, d.getPlayerType()));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (d.isCustomPool()) {
|
|
||||||
out.add(String.format("%s=%s", DeckManager.CSTM_POOL, "true"));
|
|
||||||
}
|
|
||||||
|
|
||||||
out.add(String.format("%s", "[main]"));
|
|
||||||
out.addAll(DeckManager.writeCardPool(d.getMain()));
|
|
||||||
|
|
||||||
out.add(String.format("%s", "[sideboard]"));
|
|
||||||
out.addAll(DeckManager.writeCardPool(d.getSideboard()));
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* writeDeck.
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @param d
|
|
||||||
* a {@link forge.deck.Deck} object.
|
|
||||||
* @param out
|
|
||||||
* a {@link java.io.BufferedWriter} object.
|
|
||||||
* @throws java.io.IOException
|
|
||||||
* if any.
|
|
||||||
*/
|
|
||||||
private static void writeDeckHtml(final Deck d, final BufferedWriter out) throws IOException {
|
|
||||||
Template temp = null;
|
|
||||||
final int cardBorder = 0;
|
|
||||||
final int height = 319;
|
|
||||||
final int width = 222;
|
|
||||||
|
|
||||||
/* Create and adjust the configuration */
|
|
||||||
final Configuration cfg = new Configuration();
|
|
||||||
try {
|
|
||||||
cfg.setClassForTemplateLoading(d.getClass(), "/");
|
|
||||||
cfg.setObjectWrapper(new DefaultObjectWrapper());
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ------------------------------------------------------------------
|
|
||||||
* -
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* You usually do these for many times in the application
|
|
||||||
* life-cycle:
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Get or create a template */
|
|
||||||
temp = cfg.getTemplate("proxy-template.ftl");
|
|
||||||
|
|
||||||
/* Create a data-model */
|
|
||||||
final Map<String, Object> root = new HashMap<String, Object>();
|
|
||||||
root.put("title", d.getName());
|
|
||||||
final List<String> list = new ArrayList<String>();
|
|
||||||
for (final Card card : d.getMain().toForgeCardList().toArray()) {
|
|
||||||
// System.out.println(card.getSets().get(card.getSets().size() -
|
|
||||||
// 1).URL);
|
|
||||||
list.add(card.getSets().get(card.getSets().size() - 1).getUrl());
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* List<String> nameList = new ArrayList<String>(); for (Card card :
|
|
||||||
* d.getMain().toForgeCardList().toArray()) {
|
|
||||||
* //System.out.println(card.getSets().get(card.getSets().size() -
|
|
||||||
* 1).URL); nameList.add(card.getName()); }
|
|
||||||
*/
|
|
||||||
|
|
||||||
final TreeMap<String, Integer> map = new TreeMap<String, Integer>();
|
|
||||||
for (final Entry<CardPrinted, Integer> entry : d.getMain().getOrderedList()) {
|
|
||||||
map.put(entry.getKey().getName(), entry.getValue());
|
|
||||||
// System.out.println(entry.getValue() + " " +
|
|
||||||
// entry.getKey().getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
root.put("urls", list);
|
|
||||||
root.put("cardBorder", cardBorder);
|
|
||||||
root.put("height", height);
|
|
||||||
root.put("width", width);
|
|
||||||
root.put("cardlistWidth", width - 11);
|
|
||||||
// root.put("nameList", nameList);
|
|
||||||
root.put("cardList", map);
|
|
||||||
|
|
||||||
/* Merge data-model with template */
|
|
||||||
// StringWriter sw = new StringWriter();
|
|
||||||
temp.process(root, out);
|
|
||||||
out.flush();
|
|
||||||
} catch (final IOException e) {
|
|
||||||
System.out.println(e.toString());
|
|
||||||
} catch (final TemplateException e) {
|
|
||||||
System.out.println(e.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static List<String> writeCardPool(final ItemPoolView<CardPrinted> pool) {
|
|
||||||
final List<Entry<CardPrinted, Integer>> main2sort = pool.getOrderedList();
|
|
||||||
Collections.sort(main2sort, TableSorter.BY_NAME_THEN_SET);
|
|
||||||
final List<String> out = new ArrayList<String>();
|
|
||||||
for (final Entry<CardPrinted, Integer> e : main2sort) {
|
|
||||||
final CardPrinted card = e.getKey();
|
|
||||||
final boolean hasBadSetInfo = "???".equals(card.getSet()) || StringUtils.isBlank(card.getSet());
|
|
||||||
if (hasBadSetInfo) {
|
|
||||||
out.add(String.format("%d %s", e.getValue(), card.getName()));
|
|
||||||
} else {
|
|
||||||
out.add(String.format("%d %s|%s", e.getValue(), card.getName(), card.getSet()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* writeDeck.
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @param d
|
|
||||||
* a {@link forge.deck.Deck} object.
|
|
||||||
* @param f
|
|
||||||
* a {@link java.io.File} object.
|
|
||||||
*/
|
|
||||||
public static void writeDeck(final Deck d, final File f) {
|
|
||||||
FileUtil.writeFile(f, DeckManager.serializeDeck(d));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* Write deck to HTML.
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @param d
|
|
||||||
* a {@link forge.deck.Deck} object.
|
|
||||||
* @param f
|
|
||||||
* a {@link java.io.File} object.
|
|
||||||
*/
|
|
||||||
public static void writeDeckHtml(final Deck d, final File f) {
|
|
||||||
try {
|
|
||||||
final BufferedWriter writer = new BufferedWriter(new FileWriter(f));
|
|
||||||
DeckManager.writeDeckHtml(d, writer);
|
|
||||||
writer.close();
|
|
||||||
} catch (final IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,8 +19,10 @@ package forge.game.limited;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
|
|
||||||
@@ -29,8 +31,6 @@ import javax.swing.JOptionPane;
|
|||||||
import net.slightlymagic.braids.util.lambda.Lambda1;
|
import net.slightlymagic.braids.util.lambda.Lambda1;
|
||||||
import net.slightlymagic.maxmtg.Closure1;
|
import net.slightlymagic.maxmtg.Closure1;
|
||||||
|
|
||||||
import org.apache.commons.lang3.ArrayUtils;
|
|
||||||
|
|
||||||
import forge.AllZone;
|
import forge.AllZone;
|
||||||
import forge.Card;
|
import forge.Card;
|
||||||
import forge.CardList;
|
import forge.CardList;
|
||||||
@@ -361,12 +361,10 @@ public final class BoosterDraft implements IBoosterDraft {
|
|||||||
if (this.draftPicks.size() > 1) {
|
if (this.draftPicks.size() > 1) {
|
||||||
final ArrayList<String> outDraftData = new ArrayList<String>();
|
final ArrayList<String> outDraftData = new ArrayList<String>();
|
||||||
|
|
||||||
final String[] keys = this.draftPicks.keySet().toArray(ArrayUtils.EMPTY_STRING_ARRAY);
|
for (final Entry<String, Float> key : this.draftPicks.entrySet()) {
|
||||||
|
outDraftData.add(key.getValue() + "|" + key.getKey());
|
||||||
for (final String key : keys) {
|
|
||||||
outDraftData.add(key + "|" + this.draftPicks.get(key));
|
|
||||||
}
|
}
|
||||||
|
Collections.sort(outDraftData);
|
||||||
FileUtil.writeFile("res/draft/tmpDraftData.txt", outDraftData);
|
FileUtil.writeFile("res/draft/tmpDraftData.txt", outDraftData);
|
||||||
|
|
||||||
final HttpUtil poster = new HttpUtil();
|
final HttpUtil poster = new HttpUtil();
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ import forge.Card;
|
|||||||
import forge.CardList;
|
import forge.CardList;
|
||||||
import forge.Command;
|
import forge.Command;
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
|
import forge.deck.DeckIO;
|
||||||
import forge.deck.DeckManager;
|
import forge.deck.DeckManager;
|
||||||
import forge.deck.generate.GenerateConstructedDeck;
|
import forge.deck.generate.GenerateConstructedDeck;
|
||||||
import forge.error.ErrorViewer;
|
import forge.error.ErrorViewer;
|
||||||
@@ -231,7 +232,7 @@ public final class DeckEditorCommonMenu extends JMenuBar {
|
|||||||
private File getImportFilename() {
|
private File getImportFilename() {
|
||||||
final JFileChooser chooser = new JFileChooser(DeckEditorCommonMenu.previousDirectory);
|
final JFileChooser chooser = new JFileChooser(DeckEditorCommonMenu.previousDirectory);
|
||||||
|
|
||||||
chooser.addChoosableFileFilter(DeckManager.DCK_FILTER);
|
chooser.addChoosableFileFilter(DeckIO.DCK_FILTER);
|
||||||
final int returnVal = chooser.showOpenDialog(null);
|
final int returnVal = chooser.showOpenDialog(null);
|
||||||
|
|
||||||
if (returnVal == JFileChooser.APPROVE_OPTION) {
|
if (returnVal == JFileChooser.APPROVE_OPTION) {
|
||||||
@@ -260,7 +261,7 @@ public final class DeckEditorCommonMenu extends JMenuBar {
|
|||||||
srcChannel.close();
|
srcChannel.close();
|
||||||
dstChannel.close();
|
dstChannel.close();
|
||||||
|
|
||||||
final Deck newDeck = DeckManager.readDeck(file);
|
final Deck newDeck = DeckIO.readDeck(file);
|
||||||
this.deckManager.addDeck(newDeck);
|
this.deckManager.addDeck(newDeck);
|
||||||
this.showDeck(newDeck, newDeck.getDeckType());
|
this.showDeck(newDeck, newDeck.getDeckType());
|
||||||
|
|
||||||
@@ -285,7 +286,7 @@ public final class DeckEditorCommonMenu extends JMenuBar {
|
|||||||
|
|
||||||
final Deck deck = this.getDeck();
|
final Deck deck = this.getDeck();
|
||||||
try {
|
try {
|
||||||
DeckManager.writeDeck(deck, filename);
|
DeckIO.writeDeck(deck, filename);
|
||||||
} catch (final Exception ex) {
|
} catch (final Exception ex) {
|
||||||
ErrorViewer.showError(ex);
|
ErrorViewer.showError(ex);
|
||||||
throw new RuntimeException("Gui_DeckEditor_Menu : exportDeck() error, " + ex);
|
throw new RuntimeException("Gui_DeckEditor_Menu : exportDeck() error, " + ex);
|
||||||
@@ -296,7 +297,7 @@ public final class DeckEditorCommonMenu extends JMenuBar {
|
|||||||
final JFileChooser save = new JFileChooser(DeckEditorCommonMenu.previousDirectory);
|
final JFileChooser save = new JFileChooser(DeckEditorCommonMenu.previousDirectory);
|
||||||
save.setDialogTitle("Export Deck Filename");
|
save.setDialogTitle("Export Deck Filename");
|
||||||
save.setDialogType(JFileChooser.SAVE_DIALOG);
|
save.setDialogType(JFileChooser.SAVE_DIALOG);
|
||||||
save.setFileFilter(DeckManager.DCK_FILTER);
|
save.setFileFilter(DeckIO.DCK_FILTER);
|
||||||
|
|
||||||
if (save.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
|
if (save.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
|
||||||
final File file = save.getSelectedFile();
|
final File file = save.getSelectedFile();
|
||||||
@@ -322,7 +323,7 @@ public final class DeckEditorCommonMenu extends JMenuBar {
|
|||||||
|
|
||||||
final Deck deck = this.getDeck();
|
final Deck deck = this.getDeck();
|
||||||
try {
|
try {
|
||||||
DeckManager.writeDeckHtml(deck, filename);
|
DeckIO.writeDeckHtml(deck, filename);
|
||||||
} catch (final Exception ex) {
|
} catch (final Exception ex) {
|
||||||
ErrorViewer.showError(ex);
|
ErrorViewer.showError(ex);
|
||||||
throw new RuntimeException("Gui_DeckEditor_Menu : printProxies() error, " + ex);
|
throw new RuntimeException("Gui_DeckEditor_Menu : printProxies() error, " + ex);
|
||||||
@@ -333,7 +334,7 @@ public final class DeckEditorCommonMenu extends JMenuBar {
|
|||||||
final JFileChooser save = new JFileChooser(DeckEditorCommonMenu.previousDirectory);
|
final JFileChooser save = new JFileChooser(DeckEditorCommonMenu.previousDirectory);
|
||||||
save.setDialogTitle("Proxy HTML Filename");
|
save.setDialogTitle("Proxy HTML Filename");
|
||||||
save.setDialogType(JFileChooser.SAVE_DIALOG);
|
save.setDialogType(JFileChooser.SAVE_DIALOG);
|
||||||
save.setFileFilter(DeckManager.HTML_FILTER);
|
save.setFileFilter(DeckIO.HTML_FILTER);
|
||||||
|
|
||||||
if (save.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
|
if (save.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
|
||||||
final File file = save.getSelectedFile();
|
final File file = save.getSelectedFile();
|
||||||
@@ -394,11 +395,11 @@ public final class DeckEditorCommonMenu extends JMenuBar {
|
|||||||
final Deck[] all = this.deckManager.getDraftDeck(this.currentDeckName);
|
final Deck[] all = this.deckManager.getDraftDeck(this.currentDeckName);
|
||||||
all[0] = deck;
|
all[0] = deck;
|
||||||
this.deckManager.addDraftDeck(all);
|
this.deckManager.addDraftDeck(all);
|
||||||
DeckManager.writeDraftDecks(all);
|
DeckIO.writeDraftDecks(all);
|
||||||
} else { // constructed or sealed
|
} else { // constructed or sealed
|
||||||
this.setDeckData(this.currentDeckName, true);
|
this.setDeckData(this.currentDeckName, true);
|
||||||
this.deckManager.addDeck(deck);
|
this.deckManager.addDeck(deck);
|
||||||
DeckManager.writeDeck(deck, DeckManager.makeFileName(deck));
|
DeckIO.writeDeck(deck, DeckIO.makeFileName(deck));
|
||||||
}
|
}
|
||||||
this.isDeckSaved = true;
|
this.isDeckSaved = true;
|
||||||
}
|
}
|
||||||
@@ -421,10 +422,10 @@ public final class DeckEditorCommonMenu extends JMenuBar {
|
|||||||
|
|
||||||
all[0] = deck;
|
all[0] = deck;
|
||||||
this.deckManager.addDraftDeck(all);
|
this.deckManager.addDraftDeck(all);
|
||||||
DeckManager.writeDraftDecks(all);
|
DeckIO.writeDraftDecks(all);
|
||||||
} else { // constructed and sealed
|
} else { // constructed and sealed
|
||||||
this.deckManager.addDeck(deck);
|
this.deckManager.addDeck(deck);
|
||||||
DeckManager.writeDeck(deck, DeckManager.makeFileName(deck));
|
DeckIO.writeDeck(deck, DeckIO.makeFileName(deck));
|
||||||
}
|
}
|
||||||
this.isDeckSaved = true;
|
this.isDeckSaved = true;
|
||||||
}
|
}
|
||||||
@@ -480,7 +481,7 @@ public final class DeckEditorCommonMenu extends JMenuBar {
|
|||||||
|
|
||||||
final Deck deck = this.getDeck();
|
final Deck deck = this.getDeck();
|
||||||
deck.setName(this.currentDeckName);
|
deck.setName(this.currentDeckName);
|
||||||
DeckManager.writeDeck(deck, DeckManager.makeFileName(deck));
|
DeckIO.writeDeck(deck, DeckIO.makeFileName(deck));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -531,7 +532,7 @@ public final class DeckEditorCommonMenu extends JMenuBar {
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
final String deckName = DeckManager.cleanDeckName(o.toString());
|
final String deckName = DeckIO.cleanDeckName(o.toString());
|
||||||
final boolean isDraft = this.deckDisplay.getGameType() == GameType.Draft;
|
final boolean isDraft = this.deckDisplay.getGameType() == GameType.Draft;
|
||||||
final boolean isUniqueName = isDraft ? this.deckManager.isUniqueDraft(deckName) : this.deckManager
|
final boolean isUniqueName = isDraft ? this.deckManager.isUniqueDraft(deckName) : this.deckManager
|
||||||
.isUnique(deckName);
|
.isUnique(deckName);
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ import forge.AllZone;
|
|||||||
import forge.Constant;
|
import forge.Constant;
|
||||||
import forge.control.FControl;
|
import forge.control.FControl;
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
|
import forge.deck.DeckIO;
|
||||||
import forge.deck.DeckManager;
|
import forge.deck.DeckManager;
|
||||||
import forge.error.ErrorViewer;
|
import forge.error.ErrorViewer;
|
||||||
import forge.game.GameType;
|
import forge.game.GameType;
|
||||||
@@ -348,7 +349,7 @@ public class DeckEditorDraft extends DeckEditorBase {
|
|||||||
deckManager.addDraftDeck(all);
|
deckManager.addDraftDeck(all);
|
||||||
|
|
||||||
// write file
|
// write file
|
||||||
DeckManager.writeDraftDecks(all);
|
DeckIO.writeDraftDecks(all);
|
||||||
|
|
||||||
// close and open next screen
|
// close and open next screen
|
||||||
this.dispose();
|
this.dispose();
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ import forge.Command;
|
|||||||
import forge.Constant;
|
import forge.Constant;
|
||||||
import forge.card.CardRules;
|
import forge.card.CardRules;
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
import forge.deck.DeckManager;
|
import forge.deck.DeckIO;
|
||||||
import forge.error.ErrorViewer;
|
import forge.error.ErrorViewer;
|
||||||
import forge.game.GameType;
|
import forge.game.GameType;
|
||||||
import forge.gui.GuiUtils;
|
import forge.gui.GuiUtils;
|
||||||
@@ -317,7 +317,7 @@ public class DeckEditorQuestMenu extends JMenuBar {
|
|||||||
if (file == null) {
|
if (file == null) {
|
||||||
} else if (file.getName().endsWith(".dck")) {
|
} else if (file.getName().endsWith(".dck")) {
|
||||||
try {
|
try {
|
||||||
final Deck newDeck = DeckManager.readDeck(file);
|
final Deck newDeck = DeckIO.readDeck(file);
|
||||||
this.questData.addDeck(newDeck);
|
this.questData.addDeck(newDeck);
|
||||||
|
|
||||||
final ItemPool<CardPrinted> cardpool = ItemPool.createFrom(this.questData.getCards().getCardpool(),
|
final ItemPool<CardPrinted> cardpool = ItemPool.createFrom(this.questData.getCards().getCardpool(),
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import java.util.List;
|
|||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import forge.AllZone;
|
import forge.AllZone;
|
||||||
|
import forge.deck.DeckIO;
|
||||||
import forge.deck.DeckManager;
|
import forge.deck.DeckManager;
|
||||||
import forge.properties.ForgeProps;
|
import forge.properties.ForgeProps;
|
||||||
import forge.properties.NewConstants;
|
import forge.properties.NewConstants;
|
||||||
@@ -78,7 +79,7 @@ public class QuestEventManager {
|
|||||||
|
|
||||||
final DeckManager manager = new DeckManager(file);
|
final DeckManager manager = new DeckManager(file);
|
||||||
|
|
||||||
final File[] allFiles = ForgeProps.getFile(NewConstants.Quest.DECKS).listFiles(DeckManager.DCK_FILE_FILTER);
|
final File[] allFiles = ForgeProps.getFile(NewConstants.Quest.DECKS).listFiles(DeckIO.DCK_FILE_FILTER);
|
||||||
|
|
||||||
for (final File f : allFiles) {
|
for (final File f : allFiles) {
|
||||||
contents = FileUtil.readFile(f);
|
contents = FileUtil.readFile(f);
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import forge.AllZone;
|
|||||||
import forge.Command;
|
import forge.Command;
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
|
import forge.deck.DeckIO;
|
||||||
import forge.deck.DeckManager;
|
import forge.deck.DeckManager;
|
||||||
import forge.game.GameType;
|
import forge.game.GameType;
|
||||||
import forge.gui.deckeditor.DeckEditorCommon;
|
import forge.gui.deckeditor.DeckEditorCommon;
|
||||||
@@ -298,7 +299,7 @@ public class DeckLister extends JPanel {
|
|||||||
deckmanager.deleteDraftDeck(d0.getName());
|
deckmanager.deleteDraftDeck(d0.getName());
|
||||||
|
|
||||||
// Since draft deck files are really directories, must delete all children first.
|
// Since draft deck files are really directories, must delete all children first.
|
||||||
File dir = DeckManager.makeFileName(d0.getName(), GameType.Draft);
|
File dir = DeckIO.makeFileName(d0.getName(), GameType.Draft);
|
||||||
String[] children = dir.list();
|
String[] children = dir.list();
|
||||||
|
|
||||||
for (int i = 0; i < children.length; i++) {
|
for (int i = 0; i < children.length; i++) {
|
||||||
@@ -310,8 +311,8 @@ public class DeckLister extends JPanel {
|
|||||||
else if (gametype.equals(GameType.Sealed)) {
|
else if (gametype.equals(GameType.Sealed)) {
|
||||||
deckmanager.deleteDeck(d0.getName());
|
deckmanager.deleteDeck(d0.getName());
|
||||||
|
|
||||||
File address1 = DeckManager.makeFileName(d0.getName(), GameType.Sealed);
|
File address1 = DeckIO.makeFileName(d0.getName(), GameType.Sealed);
|
||||||
File address2 = DeckManager.makeFileName("AI_" + d0.getName(), GameType.Sealed);
|
File address2 = DeckIO.makeFileName("AI_" + d0.getName(), GameType.Sealed);
|
||||||
|
|
||||||
// not working??!!
|
// not working??!!
|
||||||
address1.delete();
|
address1.delete();
|
||||||
@@ -320,7 +321,7 @@ public class DeckLister extends JPanel {
|
|||||||
else {
|
else {
|
||||||
deckmanager.deleteDeck(d0.getName());
|
deckmanager.deleteDeck(d0.getName());
|
||||||
|
|
||||||
File address1 = DeckManager.makeFileName(d0.getName(), GameType.Constructed);
|
File address1 = DeckIO.makeFileName(d0.getName(), GameType.Constructed);
|
||||||
address1.delete();
|
address1.delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user