Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions forge-core/src/main/java/forge/deck/Deck.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ public class Deck extends DeckBase implements Iterable<Entry<DeckSection, CardPo
private final Set<String> aiHints = new TreeSet<>();
private final List<String> keyCards = new ArrayList<>();
private final Map<String, String> draftNotes = new HashMap<>();
private String deckHash;
private Integer commanderBracket;
private Map<String, List<String>> deferredSections = null;
private Map<String, List<String>> loadedSections = null;
private String lastCardArtPreferenceUsed = "";
Expand Down Expand Up @@ -253,6 +255,7 @@ protected void cloneFieldsTo(final DeckBase clone) {
}
result.setAiHints(StringUtils.join(aiHints, " | "));
result.setDraftNotes(draftNotes);
result.setCommanderBracket(deckHash, commanderBracket);
//noinspection ConstantValue
if(tags != null) //Can happen deserializing old Decks.
result.tags.addAll(this.tags);
Expand Down Expand Up @@ -526,6 +529,19 @@ public Set<String> getTags() {
return tags;
}

public String getDeckHash() {
return deckHash;
}

public Integer getCommanderBracket() {
return commanderBracket;
}

public void setCommanderBracket(final String hash, final Integer bracket) {
deckHash = hash;
commanderBracket = bracket;
}

public CardPool getAllCardsInASinglePool() {
return getAllCardsInASinglePool(true, false);
}
Expand Down
27 changes: 27 additions & 0 deletions forge-core/src/main/java/forge/deck/io/DeckFileHeader.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ public class DeckFileHeader {
public static final String TAGS_SEPARATOR = ",";
public static final String DRAFT_NOTES = "DraftNotes";
public static final String KEY_CARDS = "KeyCards";
public static final String DECK_HASH = "DeckHash";
public static final String COMMANDER_BRACKET = "CommanderBracket";

/** The Constant COMMENT. */
public static final String COMMENT = "Comment";
Expand All @@ -60,6 +62,8 @@ public class DeckFileHeader {
private final Set<String> tags;
private final HashMap<String, String> draftNotes;
private final List<String> keyCards;
private final String deckHash;
private final Integer commanderBracket;

private final boolean intendedForAi;
private final String aiHints;
Expand All @@ -79,6 +83,8 @@ public DeckFileHeader(final FileSection kvPairs) {
this.customPool = kvPairs.getBoolean(DeckFileHeader.CSTM_POOL);
this.intendedForAi = "computer".equalsIgnoreCase(kvPairs.get(DeckFileHeader.PLAYER)) || "ai".equalsIgnoreCase(kvPairs.get(DeckFileHeader.PLAYER_TYPE));
this.aiHints = kvPairs.get(DeckFileHeader.AI_HINTS);
this.deckHash = kvPairs.get(DeckFileHeader.DECK_HASH);
this.commanderBracket = parseCommanderBracket(kvPairs.get(DeckFileHeader.COMMANDER_BRACKET));

this.tags = new TreeSet<>();

Expand All @@ -100,6 +106,19 @@ public DeckFileHeader(final FileSection kvPairs) {
}
}

private static Integer parseCommanderBracket(final String rawBracket) {
if (StringUtils.isBlank(rawBracket)) {
return null;
}
try {
final int bracket = Integer.parseInt(rawBracket.trim());
return bracket >= 1 && bracket <= 5 ? bracket : null;
}
catch (final NumberFormatException e) {
return null;
}
}

private void extractDraftNotes(String rawNotes) {
if(StringUtils.isBlank(rawNotes) ) {
return;
Expand Down Expand Up @@ -147,4 +166,12 @@ public final HashMap<String, String> getDraftNotes() {
public final List<String> getKeyCards() {
return keyCards;
}

public final String getDeckHash() {
return deckHash;
}

public final Integer getCommanderBracket() {
return commanderBracket;
}
}
7 changes: 6 additions & 1 deletion forge-core/src/main/java/forge/deck/io/DeckSerializer.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ private static List<String> serializeDeck(Deck d) {
if (d.getComment() != null) {
out.add(TextUtil.concatNoSpace(DeckFileHeader.COMMENT,"=", d.getComment().replaceAll("\n", "")));
}
if (StringUtils.isNotBlank(d.getDeckHash()) && d.getCommanderBracket() != null) {
out.add(TextUtil.concatNoSpace(DeckFileHeader.DECK_HASH, "=", d.getDeckHash()));
out.add(TextUtil.concatNoSpace(DeckFileHeader.COMMANDER_BRACKET, "=", String.valueOf(d.getCommanderBracket())));
}
if (!d.getTags().isEmpty()) {
out.add(TextUtil.concatNoSpace(DeckFileHeader.TAGS,"=", StringUtils.join(d.getTags(), DeckFileHeader.TAGS_SEPARATOR)));
}
Expand Down Expand Up @@ -103,10 +107,11 @@ public static Deck fromSections(final Map<String, List<String>> sections) {
d.setAiHints(dh.getAiHints());
d.getTags().addAll(dh.getTags());
d.setDraftNotes(dh.getDraftNotes());
d.setCommanderBracket(dh.getDeckHash(), dh.getCommanderBracket());
for (String keyCard : dh.getKeyCards()) {
d.addKeyCard(keyCard);
}
d.setDeferredSections(sections);
return d;
}
}
}
54 changes: 53 additions & 1 deletion forge-core/src/main/java/forge/deck/io/DeckStorage.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import forge.util.IItemReader;
import forge.util.IItemSerializer;
import forge.util.storage.StorageReaderFolder;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.io.FilenameFilter;
Expand Down Expand Up @@ -76,6 +77,45 @@ public File makeFileFor(final Deck deck) {
return new File(this.directory, deck.getBestFileName() + FILE_EXTENSION);
}

@Override
public boolean saveMetadata(final Deck deck) {
final File file = makeFileFor(deck);
if (!file.exists()) {
return false;
}
try {
final List<String> lines = FileUtil.readFile(file);
final int metadataStart = findMetadataSection(lines);
if (metadataStart < 0) {
return false;
}

int insertAt = metadataStart + 1;
for (int i = metadataStart + 1; i < lines.size(); i++) {
final String line = lines.get(i).trim();
if (line.startsWith("[") && line.endsWith("]")) {
break;
}
if (isMetadataLine(line, DeckFileHeader.DECK_HASH) || isMetadataLine(line, DeckFileHeader.COMMANDER_BRACKET)) {
lines.remove(i--);
continue;
}
if (isMetadataLine(line, DeckFileHeader.NAME) || isMetadataLine(line, DeckFileHeader.COMMENT)) {
insertAt = i + 1;
}
}
if (StringUtils.isNotBlank(deck.getDeckHash()) && deck.getCommanderBracket() != null) {
lines.add(insertAt, DeckFileHeader.DECK_HASH + "=" + deck.getDeckHash());
lines.add(insertAt + 1, DeckFileHeader.COMMANDER_BRACKET + "=" + deck.getCommanderBracket());
}
FileUtil.writeFile(file, lines);
return true;
}
catch (final RuntimeException ignored) {
return false;
}
}

@Override
protected Deck read(final File file) {
final Map<String, List<String>> sections = FileSection.parseSections(FileUtil.readFile(file));
Expand Down Expand Up @@ -106,5 +146,17 @@ private static void adjustFileLocation(final File file, final Deck result) {
protected FilenameFilter getFileFilter() {
return DCK_FILE_FILTER;
}
}

private static int findMetadataSection(final List<String> lines) {
for (int i = 0; i < lines.size(); i++) {
if ("[metadata]".equalsIgnoreCase(lines.get(i).trim())) {
return i;
}
}
return -1;
}

private static boolean isMetadataLine(final String line, final String key) {
return line.regionMatches(true, 0, key + "=", 0, key.length() + 1);
}
}
2 changes: 2 additions & 0 deletions forge-core/src/main/java/forge/util/IItemSerializer.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ public interface IItemSerializer<T> extends IItemReader<T> {
*/
void save(T unit);

default boolean saveMetadata(T unit) { return false; }

/**
* Erase.
*
Expand Down
Loading