moved all items to core, decks were included too.

This commit is contained in:
Maxmtg
2013-11-20 08:34:37 +00:00
parent 0786012ed8
commit 4d3945f5a4
34 changed files with 457 additions and 498 deletions

32
.gitattributes vendored
View File

@@ -19,7 +19,6 @@ forge-core/.settings/org.eclipse.core.resources.prefs -text
forge-core/.settings/org.eclipse.jdt.core.prefs -text
forge-core/.settings/org.eclipse.m2e.core.prefs -text
forge-core/pom.xml -text
forge-core/src/main/java/forge/Constant.java svneol=native#text/plain
forge-core/src/main/java/forge/ICardStorageReader.java -text
forge-core/src/main/java/forge/IProgressObserver.java -text
forge-core/src/main/java/forge/StaticData.java -text
@@ -58,14 +57,28 @@ forge-core/src/main/java/forge/card/mana/ManaCostParser.java -text
forge-core/src/main/java/forge/card/mana/ManaCostShard.java -text
forge-core/src/main/java/forge/card/mana/package-info.java svneol=native#text/plain
forge-core/src/main/java/forge/deck/CardPool.java -text
forge-core/src/main/java/forge/deck/Deck.java svneol=native#text/plain
forge-core/src/main/java/forge/deck/DeckBase.java -text
forge-core/src/main/java/forge/deck/DeckFormat.java -text
forge-core/src/main/java/forge/deck/DeckSection.java -text
forge-core/src/main/java/forge/deck/io/DeckFileHeader.java -text
forge-core/src/main/java/forge/deck/io/DeckSerializer.java -text
forge-core/src/main/java/forge/deck/io/OldDeckFileFormatException.java -text
forge-core/src/main/java/forge/deck/io/package-info.java -text
forge-core/src/main/java/forge/deck/package-info.java -text
forge-core/src/main/java/forge/game/GameFormat.java -text
forge-core/src/main/java/forge/game/package-info.java -text
forge-core/src/main/java/forge/item/BoosterPack.java -text
forge-core/src/main/java/forge/item/FatPack.java -text
forge-core/src/main/java/forge/item/IPaperCard.java -text
forge-core/src/main/java/forge/item/InventoryItem.java -text
forge-core/src/main/java/forge/item/InventoryItemFromSet.java -text
forge-core/src/main/java/forge/item/ItemPredicate.java -text
forge-core/src/main/java/forge/item/OpenablePack.java -text
forge-core/src/main/java/forge/item/PaperCard.java -text
forge-core/src/main/java/forge/item/PaperToken.java -text
forge-core/src/main/java/forge/item/PreconDeck.java -text
forge-core/src/main/java/forge/item/TournamentPack.java -text
forge-core/src/main/java/forge/item/package-info.java -text
forge-core/src/main/java/forge/package-info.java -text
forge-core/src/main/java/forge/util/Aggregates.java -text
@@ -14669,6 +14682,7 @@ forge-gui/src/main/java/forge/CardPredicates.java svneol=native#text/plain
forge-gui/src/main/java/forge/CardType.java svneol=native#text/plain
forge-gui/src/main/java/forge/CardUtil.java svneol=native#text/plain
forge-gui/src/main/java/forge/Command.java svneol=native#text/plain
forge-gui/src/main/java/forge/Constant.java svneol=native#text/plain
forge-gui/src/main/java/forge/CounterType.java svneol=native#text/plain
forge-gui/src/main/java/forge/FThreads.java -text
forge-gui/src/main/java/forge/GameEntity.java -text
@@ -15069,12 +15083,8 @@ forge-gui/src/main/java/forge/control/KeyboardShortcuts.java -text
forge-gui/src/main/java/forge/control/RestartUtil.java -text
forge-gui/src/main/java/forge/control/package-info.java -text
forge-gui/src/main/java/forge/deck/CardCollections.java -text
forge-gui/src/main/java/forge/deck/Deck.java svneol=native#text/plain
forge-gui/src/main/java/forge/deck/DeckBase.java -text
forge-gui/src/main/java/forge/deck/DeckFormat.java -text
forge-gui/src/main/java/forge/deck/DeckGroup.java -text
forge-gui/src/main/java/forge/deck/DeckRecognizer.java -text
forge-gui/src/main/java/forge/deck/DeckSection.java -text
forge-gui/src/main/java/forge/deck/DeckgenUtil.java -text
forge-gui/src/main/java/forge/deck/generate/Generate2ColorDeck.java svneol=native#text/plain
forge-gui/src/main/java/forge/deck/generate/Generate3ColorDeck.java svneol=native#text/plain
@@ -15084,10 +15094,8 @@ forge-gui/src/main/java/forge/deck/generate/GenerateDeckUtil.java -text
forge-gui/src/main/java/forge/deck/generate/GenerateMonoColorDeck.java -text
forge-gui/src/main/java/forge/deck/generate/GenerateThemeDeck.java svneol=native#text/plain
forge-gui/src/main/java/forge/deck/generate/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/deck/io/DeckFileHeader.java -text
forge-gui/src/main/java/forge/deck/io/DeckGroupSerializer.java -text
forge-gui/src/main/java/forge/deck/io/DeckSerializer.java -text
forge-gui/src/main/java/forge/deck/io/OldDeckFileFormatException.java -text
forge-gui/src/main/java/forge/deck/io/DeckHtmlSerializer.java -text
forge-gui/src/main/java/forge/deck/io/OldDeckParser.java -text
forge-gui/src/main/java/forge/deck/io/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/deck/package-info.java svneol=native#text/plain
@@ -15507,13 +15515,6 @@ forge-gui/src/main/java/forge/gui/workshop/menus/WorkshopFileMenu.java -text
forge-gui/src/main/java/forge/gui/workshop/views/VCardDesigner.java -text
forge-gui/src/main/java/forge/gui/workshop/views/VCardScript.java -text
forge-gui/src/main/java/forge/gui/workshop/views/VWorkshopCatalog.java -text
forge-gui/src/main/java/forge/item/BoosterPack.java -text
forge-gui/src/main/java/forge/item/FatPack.java -text
forge-gui/src/main/java/forge/item/ItemPredicate.java -text
forge-gui/src/main/java/forge/item/OpenablePack.java -text
forge-gui/src/main/java/forge/item/PreconDeck.java -text
forge-gui/src/main/java/forge/item/TournamentPack.java -text
forge-gui/src/main/java/forge/item/package-info.java -text
forge-gui/src/main/java/forge/model/BuildInfo.java -text
forge-gui/src/main/java/forge/model/FModel.java svneol=native#text/plain
forge-gui/src/main/java/forge/model/MultipleForgeJarsFoundError.java -text
@@ -15599,7 +15600,6 @@ forge-gui/src/main/java/forge/quest/data/package-info.java svneol=native#text/pl
forge-gui/src/main/java/forge/quest/gui/ViewItem.java -text
forge-gui/src/main/java/forge/quest/gui/ViewStall.java svneol=native#text/plain
forge-gui/src/main/java/forge/quest/gui/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/quest/io/PreconReader.java -text
forge-gui/src/main/java/forge/quest/io/QuestChallengeReader.java -text
forge-gui/src/main/java/forge/quest/io/QuestDataIO.java svneol=native#text/plain
forge-gui/src/main/java/forge/quest/io/QuestDuelReader.java -text

View File

@@ -52,8 +52,8 @@ public abstract class DeckBase implements Serializable, Comparable<DeckBase>, IH
/** {@inheritDoc} */
@Override
public boolean equals(final Object o) {
if (o instanceof Deck) {
final Deck d = (Deck) o;
if (o instanceof DeckBase) {
final DeckBase d = (DeckBase) o;
return this.getName().equals(d.getName());
}
return false;

View File

@@ -22,14 +22,14 @@ import java.util.Arrays;
import java.util.List;
import java.util.Map.Entry;
import org.apache.commons.lang.math.IntRange;
import forge.Singletons;
import org.apache.commons.lang3.Range;
import forge.StaticData;
import forge.card.CardCoreType;
import forge.card.ColorSet;
import forge.item.PaperCard;
import forge.item.IPaperCard;
import forge.properties.ForgePreferences.FPref;
import forge.util.Aggregates;
/**
@@ -38,26 +38,21 @@ import forge.util.Aggregates;
public enum DeckFormat {
// Main board: allowed size SB: restriction Max distinct non basic cards
Constructed ( new IntRange(60, Integer.MAX_VALUE), new IntRange(0, 15), 4),
QuestDeck ( new IntRange(40, Integer.MAX_VALUE), new IntRange(0, 15), 4),
Limited ( new IntRange(40, Integer.MAX_VALUE), null, Integer.MAX_VALUE),
Commander ( new IntRange(99), new IntRange(0, 10), 1),
Vanguard ( new IntRange(60, Integer.MAX_VALUE), new IntRange(0), 4),
Planechase ( new IntRange(60, Integer.MAX_VALUE), new IntRange(0), 4),
Archenemy ( new IntRange(60, Integer.MAX_VALUE), new IntRange(0), 4);
Constructed ( Range.between(60, Integer.MAX_VALUE), Range.between(0, 15), 4),
QuestDeck ( Range.between(40, Integer.MAX_VALUE), Range.between(0, 15), 4),
Limited ( Range.between(40, Integer.MAX_VALUE), null, Integer.MAX_VALUE),
Commander ( Range.is(99), Range.between(0, 10), 1),
Vanguard ( Range.between(60, Integer.MAX_VALUE), Range.is(0), 4),
Planechase ( Range.between(60, Integer.MAX_VALUE), Range.is(0), 4),
Archenemy ( Range.between(60, Integer.MAX_VALUE), Range.is(0), 4);
private final IntRange mainRange;
private final IntRange sideRange; // null => no check
private final Range<Integer> mainRange;
private final Range<Integer> sideRange; // null => no check
private final int maxCardCopies;
/**
* Instantiates a new game type.
*
* @param isLimited
* the is limited
*/
DeckFormat(IntRange main, IntRange side, int maxCopies) {
DeckFormat(Range<Integer> main, Range<Integer> side, int maxCopies) {
mainRange = main;
sideRange = side;
maxCardCopies = maxCopies;
@@ -89,7 +84,7 @@ public enum DeckFormat {
/**
* @return the sideRange
*/
public IntRange getSideRange() {
public Range<Integer> getSideRange() {
return sideRange;
}
@@ -97,7 +92,7 @@ public enum DeckFormat {
/**
* @return the mainRange
*/
public IntRange getMainRange() {
public Range<Integer> getMainRange() {
return mainRange;
}
@@ -117,15 +112,10 @@ public enum DeckFormat {
return "is not selected";
}
// That's really a bad dependence
if (!Singletons.getModel().getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) {
return null;
}
int deckSize = deck.getMain().countAll();
int min = getMainRange().getMinimumInteger();
int max = getMainRange().getMaximumInteger();
int min = getMainRange().getMinimum();
int max = getMainRange().getMaximum();
if (deckSize < min) {
return String.format("should have a minimum of %d cards", min);
@@ -232,7 +222,7 @@ public enum DeckFormat {
// should group all cards by name, so that different editions of same card are really counted as the same card
for (Entry<String, Integer> cp : Aggregates.groupSumBy(tmp, PaperCard.FN_GET_NAME)) {
IPaperCard simpleCard = Singletons.getMagicDb().getCommonCards().getCard(cp.getKey());
IPaperCard simpleCard = StaticData.instance().getCommonCards().getCard(cp.getKey());
boolean canHaveMultiple = simpleCard.getRules().getType().isBasicLand() || limitExceptions.contains(cp.getKey());
if (!canHaveMultiple && cp.getValue() > maxCopies) {
@@ -243,11 +233,11 @@ public enum DeckFormat {
// The sideboard must contain either 0 or 15 cards
int sideboardSize = deck.has(DeckSection.Sideboard) ? deck.get(DeckSection.Sideboard).countAll() : 0;
IntRange sbRange = getSideRange();
if (sbRange != null && sideboardSize > 0 && !sbRange.containsInteger(sideboardSize)) {
return sbRange.getMinimumInteger() == sbRange.getMaximumInteger()
? String.format("must have a sideboard of %d cards or no sideboard at all", sbRange.getMaximumInteger())
: String.format("must have a sideboard of %d to %d cards or no sideboard at all", sbRange.getMinimumInteger(), sbRange.getMaximumInteger());
Range<Integer> sbRange = getSideRange();
if (sbRange != null && sideboardSize > 0 && !sbRange.contains(sideboardSize)) {
return sbRange.getMinimum() == sbRange.getMaximum()
? String.format("must have a sideboard of %d cards or no sideboard at all", sbRange.getMaximum())
: String.format("must have a sideboard of %d to %d cards or no sideboard at all", sbRange.getMinimum(), sbRange.getMaximum());
}
return null;

View File

@@ -23,7 +23,6 @@ import java.util.TreeSet;
import org.apache.commons.lang3.StringUtils;
import forge.deck.DeckFormat;
import forge.game.player.PlayerType;
import forge.util.FileSection;
/**
@@ -48,7 +47,6 @@ public class DeckFileHeader {
private static final String PLAYER_TYPE = "PlayerType";
private final DeckFormat deckType;
private final PlayerType playerType;
private final boolean customPool;
private final String name;
@@ -56,6 +54,15 @@ public class DeckFileHeader {
private final Set<String> tags;
private final boolean intendedForAi;
/**
* @return the intendedForAi
*/
public boolean isIntendedForAi() {
return intendedForAi;
}
/**
* TODO: Write javadoc for Constructor.
*
@@ -67,8 +74,7 @@ public class DeckFileHeader {
this.comment = kvPairs.get(DeckFileHeader.COMMENT);
this.deckType = DeckFormat.smartValueOf(kvPairs.get(DeckFileHeader.DECK_TYPE), DeckFormat.Constructed);
this.customPool = kvPairs.getBoolean(DeckFileHeader.CSTM_POOL);
boolean isForAi = "computer".equalsIgnoreCase(kvPairs.get(DeckFileHeader.PLAYER)) || "ai".equalsIgnoreCase(kvPairs.get(DeckFileHeader.PLAYER_TYPE));
this.playerType = isForAi ? PlayerType.COMPUTER : PlayerType.HUMAN;
this.intendedForAi = "computer".equalsIgnoreCase(kvPairs.get(DeckFileHeader.PLAYER)) || "ai".equalsIgnoreCase(kvPairs.get(DeckFileHeader.PLAYER_TYPE));
this.tags = new TreeSet<String>();
String rawTags = kvPairs.get(DeckFileHeader.TAGS);
@@ -81,15 +87,6 @@ public class DeckFileHeader {
}
/**
* Gets the player type.
*
* @return the player type
*/
public final PlayerType getPlayerType() {
return this.playerType;
}
/**
* Checks if is custom pool.
*

View File

@@ -0,0 +1,135 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.deck.io;
import java.io.File;
import java.io.FilenameFilter;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import forge.deck.Deck;
import forge.util.FileSection;
import forge.util.FileSectionManual;
import forge.util.FileUtil;
import forge.util.IItemReader;
import forge.util.IItemSerializer;
import forge.util.storage.StorageReaderFolder;
/**
* This class knows how to make a file out of a deck object and vice versa.
*/
public class DeckSerializer extends StorageReaderFolder<Deck> implements IItemSerializer<Deck> {
private final boolean moveWronglyNamedDecks;
public static final String FILE_EXTENSION = ".dck";
public DeckSerializer(final File deckDir0) {
this(deckDir0, false);
}
public DeckSerializer(final File deckDir0, boolean moveWrongDecks) {
super(deckDir0, Deck.FN_NAME_SELECTOR);
moveWronglyNamedDecks = moveWrongDecks;
}
/** 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(FILE_EXTENSION);
}
};
public static void writeDeck(final Deck d, final File f) {
FileUtil.writeFile(f, d.save());
}
@Override
public void save(final Deck unit) {
FileUtil.writeFile(this.makeFileFor(unit), unit.save());
}
@Override
public void erase(final Deck unit) {
this.makeFileFor(unit).delete();
}
public File makeFileFor(final Deck deck) {
return new File(this.directory, deck.getBestFileName() + FILE_EXTENSION);
}
@Override
protected Deck read(final File file) {
final Map<String, List<String>> sections = FileSection.parseSections(FileUtil.readFile(file));
Deck result = Deck.fromSections(sections, true);
if (moveWronglyNamedDecks) {
adjustFileLocation(file, result);
}
return result;
}
private void adjustFileLocation(final File file, final Deck result) {
if (result == null) {
file.delete();
} else {
String destFilename = result.getBestFileName() + FILE_EXTENSION;
if (!file.getName().equals(destFilename)) {
file.renameTo(new File(file.getParentFile().getParentFile(), destFilename));
}
}
}
@Override
protected FilenameFilter getFileFilter() {
return DeckSerializer.DCK_FILE_FILTER;
}
public static DeckFileHeader readDeckMetadata(final Map<String, List<String>> map, final boolean canThrow) {
if (map == null) {
return null;
}
final List<String> metadata = map.get("metadata");
if (metadata != null) {
return new DeckFileHeader(FileSection.parse(metadata, "="));
}
final List<String> general = map.get("general");
if (general != null) {
if (canThrow) {
throw new OldDeckFileFormatException();
}
final FileSectionManual fs = new FileSectionManual();
fs.put(DeckFileHeader.NAME, StringUtils.join(map.get(""), " "));
fs.put(DeckFileHeader.DECK_TYPE, StringUtils.join(general, " "));
return new DeckFileHeader(fs);
}
return null;
}
/* (non-Javadoc)
* @see forge.util.storage.StorageReaderBase#getReaderForFolder(java.io.File)
*/
@Override
public IItemReader<Deck> getReaderForFolder(File subfolder) {
if ( !subfolder.getParentFile().equals(directory) )
throw new UnsupportedOperationException("Only child folders of " + directory + " may be processed");
return new DeckSerializer(subfolder, false);
}
}

View File

@@ -0,0 +1,8 @@
/**
*
*/
/**
* @author Max
*
*/
package forge.deck.io;

View File

@@ -20,7 +20,7 @@ package forge.item;
import com.google.common.base.Function;
import forge.Singletons;
import forge.StaticData;
import forge.card.CardEdition;
import forge.card.SealedProductTemplate;
import forge.util.MyRandom;
@@ -32,14 +32,14 @@ public class BoosterPack extends OpenablePack {
public static final Function<CardEdition, BoosterPack> FN_FROM_SET = new Function<CardEdition, BoosterPack>() {
@Override
public BoosterPack apply(final CardEdition arg1) {
SealedProductTemplate d = Singletons.getMagicDb().getBoosters().get(arg1.getCode());
SealedProductTemplate d = StaticData.instance().getBoosters().get(arg1.getCode());
return new BoosterPack(arg1.getName(), d);
}
};
public BoosterPack(final String name0, final SealedProductTemplate boosterData) {
super(name0, boosterData);
int maxIdx = Singletons.getMagicDb().getEditions().get(boosterData.getEdition()).getCntBoosterPictures();
int maxIdx = StaticData.instance().getEditions().get(boosterData.getEdition()).getCntBoosterPictures();
artIndex = MyRandom.getRandom().nextInt(maxIdx) + 1;
hash = super.hashCode() ^ artIndex;
}

View File

@@ -23,7 +23,7 @@ import java.util.List;
import com.google.common.base.Function;
import forge.Singletons;
import forge.StaticData;
import forge.card.BoosterGenerator;
import forge.card.CardEdition;
import forge.card.FatPackTemplate;
@@ -32,7 +32,7 @@ public class FatPack extends OpenablePack {
public static final Function<CardEdition, FatPack> FN_FROM_SET = new Function<CardEdition, FatPack>() {
@Override
public FatPack apply(final CardEdition arg1) {
FatPackTemplate d = Singletons.getMagicDb().getFatPacks().get(arg1.getCode());
FatPackTemplate d = StaticData.instance().getFatPacks().get(arg1.getCode());
return new FatPack(arg1.getName(), d);
}
};
@@ -40,7 +40,7 @@ public class FatPack extends OpenablePack {
private final FatPackTemplate fpData;
public FatPack(final String name0, final FatPackTemplate fpData0) {
super(name0, Singletons.getMagicDb().getBoosters().get(fpData0.getEdition()));
super(name0, StaticData.instance().getBoosters().get(fpData0.getEdition()));
fpData = fpData0;
}

View File

@@ -20,13 +20,11 @@ package forge.item;
import java.util.List;
import org.apache.commons.lang.NullArgumentException;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import forge.Singletons;
import forge.StaticData;
import forge.card.BoosterGenerator;
import forge.card.CardRulesPredicates;
import forge.card.SealedProductTemplate;
@@ -39,8 +37,8 @@ public abstract class OpenablePack implements InventoryItemFromSet {
private List<PaperCard> cards = null;
public OpenablePack(String name0, SealedProductTemplate boosterData) {
if (null == name0) { throw new NullArgumentException("name0"); }
if (null == boosterData) { throw new NullArgumentException("boosterData"); }
if (null == name0) { throw new IllegalArgumentException("name0 must not be null"); }
if (null == boosterData) { throw new IllegalArgumentException("boosterData must not be null"); }
contents = boosterData;
name = name0;
hash = name.hashCode() ^ getClass().hashCode() ^ contents.hashCode();
@@ -104,6 +102,6 @@ public abstract class OpenablePack implements InventoryItemFromSet {
Predicate<PaperCard> cardsRule = Predicates.and(
IPaperCard.Predicates.printedInSet(setCode),
Predicates.compose(CardRulesPredicates.Presets.IS_BASIC_LAND, PaperCard.FN_GET_RULES));
return Aggregates.random(Iterables.filter(Singletons.getMagicDb().getCommonCards().getAllCards(), cardsRule), count);
return Aggregates.random(Iterables.filter(StaticData.instance().getCommonCards().getAllCards(), cardsRule), count);
}
}

View File

@@ -18,16 +18,18 @@
package forge.item;
import java.io.File;
import java.io.FilenameFilter;
import java.util.List;
import java.util.Map;
import com.google.common.base.Function;
import forge.Singletons;
import forge.StaticData;
import forge.deck.Deck;
import forge.quest.SellRules;
import forge.deck.io.DeckSerializer;
import forge.util.FileSection;
import forge.util.FileUtil;
import forge.util.storage.StorageReaderFolder;
/**
* TODO: Write javadoc for this type.
@@ -36,11 +38,11 @@ import forge.util.FileUtil;
public class PreconDeck implements InventoryItemFromSet {
private final Deck deck;
private final String imageFilename;
private final String set;
private final String description;
private String imageFilename;
private final SellRules recommendedDeals;
// private final SellRules recommendedDeals;
/*
* (non-Javadoc)
@@ -62,34 +64,12 @@ public class PreconDeck implements InventoryItemFromSet {
return "Prebuilt Deck";
}
/**
* Instantiates a new precon deck.
*
* @param f
* the f
*/
public PreconDeck(final File f) {
final List<String> deckLines = FileUtil.readFile(f);
final Map<String, List<String>> sections = FileSection.parseSections(deckLines);
this.deck = Deck.fromSections(sections);
FileSection kv = FileSection.parse(sections.get("metadata"), "=");
imageFilename = kv.get("Image");
description = kv.get("Description");
String deckEdition = kv.get("set");
this.set = deckEdition == null || Singletons.getMagicDb().getEditions().get(deckEdition.toUpperCase()) == null ? "n/a" : deckEdition;
this.recommendedDeals = new SellRules(sections.get("shop"));
public PreconDeck(final Deck d, String set, String description) {
deck = d;
this.set = set;
this.description = description;
}
/**
* Gets the deck.
*
* @return the deck
*/
public final Deck getDeck() {
return this.deck;
}
@@ -99,9 +79,9 @@ public class PreconDeck implements InventoryItemFromSet {
*
* @return the recommended deals
*/
public final SellRules getRecommendedDeals() {
return this.recommendedDeals;
}
// public final SellRules getRecommendedDeals() {
// return this.recommendedDeals;
// }
public final String getImageFilename() {
return imageFilename;
@@ -133,4 +113,37 @@ public class PreconDeck implements InventoryItemFromSet {
}
};
public static class Reader extends StorageReaderFolder<PreconDeck> {
public Reader(final File deckDir0) {
super(deckDir0, PreconDeck.FN_NAME_SELECTOR);
}
@Override
protected PreconDeck read(final File file) {
return getPreconDeckFromSections(FileSection.parseSections(FileUtil.readFile(file)));
}
// To be able to read "shops" section in overloads
protected PreconDeck getPreconDeckFromSections(final Map<String, List<String>> sections) {
FileSection kv = FileSection.parse(sections.get("metadata"), "=");
String imageFilename = kv.get("Image");
String description = kv.get("Description");
String deckEdition = kv.get("set");
String set = deckEdition == null || StaticData.instance().getEditions().get(deckEdition.toUpperCase()) == null ? "n/a" : deckEdition;
PreconDeck result = new PreconDeck(Deck.fromSections(sections), set, description);
result.imageFilename = imageFilename;
return result;
}
@Override
protected FilenameFilter getFileFilter() {
return DeckSerializer.DCK_FILE_FILTER;
}
}
}

View File

@@ -21,7 +21,7 @@ import java.util.List;
import com.google.common.base.Function;
import forge.Singletons;
import forge.StaticData;
import forge.card.BoosterGenerator;
import forge.card.CardEdition;
import forge.card.SealedProductTemplate;
@@ -32,7 +32,7 @@ public class TournamentPack extends OpenablePack {
public static final Function<CardEdition, TournamentPack> FN_FROM_SET = new Function<CardEdition, TournamentPack>() {
@Override
public TournamentPack apply(final CardEdition arg1) {
SealedProductTemplate d = Singletons.getMagicDb().getTournamentPacks().get(arg1.getCode());
SealedProductTemplate d = StaticData.instance().getTournamentPacks().get(arg1.getCode());
return new TournamentPack(arg1.getName(), d);
}
};

View File

@@ -0,0 +1,106 @@
package forge.deck.io;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.Map.Entry;
import forge.ImageCache;
import forge.deck.Deck;
import forge.item.PaperCard;
import forge.properties.NewConstants;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class DeckHtmlSerializer {
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>
* 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 Entry<PaperCard, Integer> card : d.getMain()) {
// System.out.println(card.getSets().get(card.getSets().size() - 1).URL);
for (int i = card.getValue().intValue(); i > 0; --i ) {
PaperCard r = card.getKey();
String url = NewConstants.URL_PIC_DOWNLOAD + ImageCache.getDownloadUrl(r, false);
list.add(url);
}
}
final TreeMap<String, Integer> map = new TreeMap<String, Integer>();
for (final Entry<PaperCard, 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("cardList", map);
/* Merge data-model with template */
temp.process(root, out);
out.flush();
} catch (final IOException e) {
System.out.println(e.toString());
} catch (final TemplateException e) {
System.out.println(e.toString());
}
}
}

View File

@@ -1,259 +0,0 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.deck.io;
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.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import javax.swing.filechooser.FileFilter;
import org.apache.commons.lang3.StringUtils;
import forge.ImageCache;
import forge.deck.Deck;
import forge.item.PaperCard;
import forge.properties.NewConstants;
import forge.util.FileSection;
import forge.util.FileSectionManual;
import forge.util.FileUtil;
import forge.util.IItemReader;
import forge.util.IItemSerializer;
import forge.util.storage.StorageReaderFolder;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
/**
* This class knows how to make a file out of a deck object and vice versa.
*/
public class DeckSerializer extends StorageReaderFolder<Deck> implements IItemSerializer<Deck> {
private final boolean moveWronglyNamedDecks;
public static final String FILE_EXTENSION = ".dck";
public DeckSerializer(final File deckDir0) {
this(deckDir0, false);
}
public DeckSerializer(final File deckDir0, boolean moveWrongDecks) {
super(deckDir0, Deck.FN_NAME_SELECTOR);
moveWronglyNamedDecks = moveWrongDecks;
}
/** 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(FILE_EXTENSION);
}
};
/** The Constant DCK_FILTER. */
public static final FileFilter DCK_FILTER = new FileFilter() {
@Override
public boolean accept(final File f) {
return f.getName().endsWith(FILE_EXTENSION) || 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 "Proxy File .html";
}
};
/**
* <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 Entry<PaperCard, Integer> card : d.getMain()) {
// System.out.println(card.getSets().get(card.getSets().size() - 1).URL);
for (int i = card.getValue().intValue(); i > 0; --i ) {
PaperCard r = card.getKey();
String url = NewConstants.URL_PIC_DOWNLOAD + ImageCache.getDownloadUrl(r, false);
list.add(url);
}
}
final TreeMap<String, Integer> map = new TreeMap<String, Integer>();
for (final Entry<PaperCard, 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("cardList", map);
/* Merge data-model with template */
temp.process(root, out);
out.flush();
} catch (final IOException e) {
System.out.println(e.toString());
} catch (final TemplateException e) {
System.out.println(e.toString());
}
}
public static void writeDeck(final Deck d, final File f) {
FileUtil.writeFile(f, d.save());
}
public static void writeDeckHtml(final Deck d, final File f) {
try {
final BufferedWriter writer = new BufferedWriter(new FileWriter(f));
DeckSerializer.writeDeckHtml(d, writer);
writer.close();
} catch (final IOException e) {
throw new RuntimeException(e);
}
}
@Override
public void save(final Deck unit) {
FileUtil.writeFile(this.makeFileFor(unit), unit.save());
}
@Override
public void erase(final Deck unit) {
this.makeFileFor(unit).delete();
}
public File makeFileFor(final Deck deck) {
return new File(this.directory, deck.getBestFileName() + FILE_EXTENSION);
}
@Override
protected Deck read(final File file) {
final Map<String, List<String>> sections = FileSection.parseSections(FileUtil.readFile(file));
Deck result = Deck.fromSections(sections, true);
if (moveWronglyNamedDecks) {
adjustFileLocation(file, result);
}
return result;
}
private void adjustFileLocation(final File file, final Deck result) {
if (result == null) {
file.delete();
} else {
String destFilename = result.getBestFileName() + FILE_EXTENSION;
if (!file.getName().equals(destFilename)) {
file.renameTo(new File(file.getParentFile().getParentFile(), destFilename));
}
}
}
@Override
protected FilenameFilter getFileFilter() {
return DeckSerializer.DCK_FILE_FILTER;
}
public static DeckFileHeader readDeckMetadata(final Map<String, List<String>> map, final boolean canThrow) {
if (map == null) {
return null;
}
final List<String> metadata = map.get("metadata");
if (metadata != null) {
return new DeckFileHeader(FileSection.parse(metadata, "="));
}
final List<String> general = map.get("general");
if (general != null) {
if (canThrow) {
throw new OldDeckFileFormatException();
}
final FileSectionManual fs = new FileSectionManual();
fs.put(DeckFileHeader.NAME, StringUtils.join(map.get(""), " "));
fs.put(DeckFileHeader.DECK_TYPE, StringUtils.join(general, " "));
return new DeckFileHeader(fs);
}
return null;
}
/* (non-Javadoc)
* @see forge.util.storage.StorageReaderBase#getReaderForFolder(java.io.File)
*/
@Override
public IItemReader<Deck> getReaderForFolder(File subfolder) {
if ( !subfolder.getParentFile().equals(directory) )
throw new UnsupportedOperationException("Only child folders of " + directory + " may be processed");
return new DeckSerializer(subfolder, false);
}
}

View File

@@ -32,7 +32,6 @@ import org.apache.commons.lang3.tuple.Pair;
import forge.deck.Deck;
import forge.deck.DeckGroup;
import forge.game.player.PlayerType;
import forge.properties.NewConstants;
import forge.util.FileSection;
import forge.util.FileUtil;
@@ -216,7 +215,6 @@ public class OldDeckParser {
break;
case Limited:
final boolean isAi = dh.getPlayerType() == PlayerType.COMPUTER;
name = name.startsWith("AI_") ? name.replace("AI_", "") : name;
Pair<DeckGroup, MutablePair<File, File>> stored = sealedDecks.get(name);
@@ -225,7 +223,7 @@ public class OldDeckParser {
}
final Deck deck = Deck.fromSections(sections);
if (isAi) {
if (dh.isIntendedForAi()) {
stored.getLeft().addAiDeck(deck);
stored.getRight().setRight(f);
} else {

View File

@@ -15,7 +15,7 @@ import javax.swing.MenuElement;
import javax.swing.MenuSelectionManager;
import javax.swing.SwingUtilities;
import org.apache.commons.lang.math.IntRange;
import org.apache.commons.lang3.Range;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
@@ -188,10 +188,10 @@ public class PlayerControllerHuman extends PlayerController {
int sbSize = sideboard.countAll();
int combinedDeckSize = mainSize + sbSize;
int deckMinSize = Math.min(mainSize, gameType.getDecksFormat().getMainRange().getMinimumInteger());
IntRange sbRange = gameType.getDecksFormat().getSideRange();
int deckMinSize = Math.min(mainSize, gameType.getDecksFormat().getMainRange().getMinimum());
Range<Integer> sbRange = gameType.getDecksFormat().getSideRange();
// Limited doesn't have a sideboard max, so let the Main min take care of things.
int sbMax = sbRange == null ? combinedDeckSize : sbRange.getMaximumInteger();
int sbMax = sbRange == null ? combinedDeckSize : sbRange.getMaximum();
CardPool newSb = new CardPool();
List<PaperCard> newMain = null;

View File

@@ -11,6 +11,7 @@ import forge.Command;
import forge.Singletons;
import forge.deck.Deck;
import forge.deck.DeckBase;
import forge.deck.io.DeckHtmlSerializer;
import forge.deck.io.DeckSerializer;
import forge.error.BugReporter;
import forge.gui.deckeditor.CDeckEditorUI;
@@ -45,7 +46,19 @@ public enum CCurrentDeck implements ICDoc {
fileChooser.removeChoosableFileFilter(defFilter);
}
fileChooser.addChoosableFileFilter(DeckSerializer.DCK_FILTER);
FileFilter DCK_FILTER = new FileFilter() {
@Override
public boolean accept(final File f) {
return f.getName().endsWith(DeckSerializer.FILE_EXTENSION) || f.isDirectory();
}
@Override
public String getDescription() {
return "Simple Deck File .dck";
}
};
fileChooser.addChoosableFileFilter(DCK_FILTER);
}
/* (non-Javadoc)
@@ -202,7 +215,7 @@ public enum CCurrentDeck implements ICDoc {
}
try {
DeckSerializer.writeDeckHtml(
DeckHtmlSerializer.writeDeckHtml(
((DeckController<Deck>) CDeckEditorUI.SINGLETON_INSTANCE
.getCurrentEditorController().getDeckController()).getModel(), filename);
} catch (final Exception ex) {
@@ -231,7 +244,7 @@ public enum CCurrentDeck implements ICDoc {
final JFileChooser save = new JFileChooser(previousDirectory);
save.setDialogTitle("Print Proxies");
save.setDialogType(JFileChooser.SAVE_DIALOG);
save.setFileFilter(DeckSerializer.HTML_FILTER);
save.setFileFilter(HTML_FILTER);
if (save.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
final File file = save.getSelectedFile();
@@ -244,4 +257,16 @@ public enum CCurrentDeck implements ICDoc {
return null;
}
/** 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 "Proxy File .html";
}
};
}

View File

@@ -220,7 +220,7 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
} else if (card instanceof FatPack) {
value = 2365;
} else if (card instanceof PreconDeck) {
value = ((PreconDeck) card).getRecommendedDeals().getCost();
value = QuestController.getPreconDeals((PreconDeck) card).getCost();
}
// TODO: make this changeable via a user-definable property?

View File

@@ -27,6 +27,7 @@ import forge.gui.framework.FScreen;
import forge.gui.toolbox.FSkin;
import forge.net.FServer;
import forge.net.Lobby;
import forge.properties.ForgePreferences.FPref;
import forge.quest.QuestController;
import forge.quest.QuestEvent;
import forge.quest.QuestEventChallenge;
@@ -374,10 +375,12 @@ public class SSubmenuQuestUtil {
return;
}
String errorMessage = GameType.Quest.getDecksFormat().getDeckConformanceProblem(deck);
if (null != errorMessage) {
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid deck", JOptionPane.ERROR_MESSAGE);
return;
if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) {
String errorMessage = GameType.Quest.getDecksFormat().getDeckConformanceProblem(deck);
if (null != errorMessage) {
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid deck", JOptionPane.ERROR_MESSAGE);
return;
}
}
SwingUtilities.invokeLater(new Runnable() {

View File

@@ -268,7 +268,7 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
IStorage<PreconDeck> preconDecks = QuestController.getPrecons();
for (PreconDeck preconDeck : preconDecks) {
if (preconDeck.getRecommendedDeals().getMinWins() > 0) {
if (QuestController.getPreconDeals(preconDeck).getMinWins() > 0) {
continue;
}
String name = preconDeck.getName();

View File

@@ -106,16 +106,18 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider {
return;
}
String leftDeckErrorMessage = gameType.getDecksFormat().getDeckConformanceProblem(pscLeft.getOriginalDeck());
if (null != leftDeckErrorMessage) {
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Left-side deck " + leftDeckErrorMessage, "Invalid deck", JOptionPane.ERROR_MESSAGE);
return;
}
if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) {
String leftDeckErrorMessage = gameType.getDecksFormat().getDeckConformanceProblem(pscLeft.getOriginalDeck());
if (null != leftDeckErrorMessage) {
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Left-side deck " + leftDeckErrorMessage, "Invalid deck", JOptionPane.ERROR_MESSAGE);
return;
}
String rightDeckErrorMessage = gameType.getDecksFormat().getDeckConformanceProblem(pscRight.getOriginalDeck());
if (null != rightDeckErrorMessage) {
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Right-side deck " + rightDeckErrorMessage, "Invalid deck", JOptionPane.ERROR_MESSAGE);
return;
String rightDeckErrorMessage = gameType.getDecksFormat().getDeckConformanceProblem(pscRight.getOriginalDeck());
if (null != rightDeckErrorMessage) {
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Right-side deck " + rightDeckErrorMessage, "Invalid deck", JOptionPane.ERROR_MESSAGE);
return;
}
}
Lobby lobby = FServer.instance.getLobby();

View File

@@ -27,6 +27,7 @@ import forge.gui.framework.FScreen;
import forge.gui.framework.ICDoc;
import forge.net.FServer;
import forge.net.Lobby;
import forge.properties.ForgePreferences.FPref;
/**
* Controls the draft submenu in the home UI.
@@ -103,10 +104,13 @@ public enum CSubmenuDraft implements ICDoc {
"No deck", JOptionPane.ERROR_MESSAGE);
return;
}
String errorMessage = gameType.getDecksFormat().getDeckConformanceProblem(humanDeck);
if (null != errorMessage) {
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid deck", JOptionPane.ERROR_MESSAGE);
return;
if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) {
String errorMessage = gameType.getDecksFormat().getDeckConformanceProblem(humanDeck);
if (null != errorMessage) {
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid deck", JOptionPane.ERROR_MESSAGE);
return;
}
}
Singletons.getModel().getGauntletMini().resetGauntletDraft();

View File

@@ -34,6 +34,7 @@ import forge.gui.framework.FScreen;
import forge.gui.framework.ICDoc;
import forge.item.PaperCard;
import forge.item.InventoryItem;
import forge.properties.ForgePreferences.FPref;
import forge.util.ItemPool;
import forge.util.storage.IStorage;
@@ -129,10 +130,12 @@ public enum CSubmenuSealed implements ICDoc {
return;
}
String errorMessage = gameType.getDecksFormat().getDeckConformanceProblem(human);
if (null != errorMessage) {
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid deck", JOptionPane.ERROR_MESSAGE);
return;
if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) {
String errorMessage = gameType.getDecksFormat().getDeckConformanceProblem(human);
if (null != errorMessage) {
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid deck", JOptionPane.ERROR_MESSAGE);
return;
}
}
int matches = Singletons.getModel().getDecks().getSealed().get(human.getName()).getAiDecks().size();

View File

@@ -27,6 +27,7 @@ import forge.gui.framework.ICDoc;
import forge.gui.toolbox.FList;
import forge.net.FServer;
import forge.net.Lobby;
import forge.properties.ForgePreferences.FPref;
import forge.util.MyRandom;
/**
@@ -125,12 +126,14 @@ public enum CSubmenuCommander implements ICDoc {
GuiDialog.message("No deck selected for player " + (i + 1));
return;
}
String errorMessage = GameType.Commander.getDecksFormat().getDeckConformanceProblem(d);
if (null != errorMessage) {
if(!problemDecks.contains(d))
{
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "The deck " + d.getName() + " " + errorMessage + " Please edit or choose a different deck.", "Invalid deck", JOptionPane.ERROR_MESSAGE);
problemDecks.add(d);
if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) {
String errorMessage = GameType.Commander.getDecksFormat().getDeckConformanceProblem(d);
if (null != errorMessage) {
if(!problemDecks.contains(d))
{
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "The deck " + d.getName() + " " + errorMessage + " Please edit or choose a different deck.", "Invalid deck", JOptionPane.ERROR_MESSAGE);
problemDecks.add(d);
}
}
}
playerDecks.add(d);

View File

@@ -1,3 +0,0 @@
/** Forge Card Game. */
package forge.item;

View File

@@ -21,6 +21,8 @@ import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
@@ -43,7 +45,6 @@ import forge.quest.data.QuestAchievements;
import forge.quest.data.QuestAssets;
import forge.quest.data.QuestData;
import forge.quest.data.QuestPreferences.DifficultyPrefs;
import forge.quest.io.PreconReader;
import forge.quest.io.QuestChallengeReader;
import forge.util.storage.IStorage;
import forge.util.storage.StorageBase;
@@ -169,18 +170,24 @@ public class QuestController {
this.currentEvent = currentEvent;
}
/**
* Gets the precons.
*
* @return QuestPreconManager
*/
public static IStorage<PreconDeck> getPrecons() {
if (null == preconManager) {
preconManager = new StorageBase<PreconDeck>("Quest shop decks", new PreconReader(new File(NewConstants.QUEST_PRECON_DIR)));
// read with a special class, that will fill sell rules as it processes each PreconDeck
preconManager = new StorageBase<PreconDeck>("Quest shop decks", new PreconDeck.Reader(new File(NewConstants.QUEST_PRECON_DIR)){
@Override
protected PreconDeck getPreconDeckFromSections(java.util.Map<String,java.util.List<String>> sections) {
PreconDeck result = super.getPreconDeckFromSections(sections);
preconDeals.put(result.getName(), new SellRules(sections.get("shop")));
return result;
};
});
}
return QuestController.preconManager;
}
private final static Map<String, SellRules> preconDeals = new TreeMap<String, SellRules>();
public static SellRules getPreconDeals(PreconDeck deck) {
return preconDeals.get(deck.getName());
}
/**
* TODO: Write javadoc for this method.

View File

@@ -30,7 +30,6 @@ import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import forge.Singletons;
import forge.card.BoosterGenerator;
import forge.card.BoosterSlots;
import forge.card.CardEdition;
import forge.card.CardEditionPredicates;
@@ -516,7 +515,7 @@ public final class QuestUtilCards {
private void generatePreconsInShop(final int count) {
final List<PreconDeck> meetRequirements = new ArrayList<PreconDeck>();
for (final PreconDeck deck : QuestController.getPrecons()) {
if (deck.getRecommendedDeals().meetsRequiremnts(this.qc.getAchievements())
if (QuestController.getPreconDeals(deck).meetsRequiremnts(this.qc.getAchievements())
&& (null == qc.getFormat() || qc.getFormat().isSetLegal(deck.getEdition()))) {
meetRequirements.add(deck);
}

View File

@@ -1,68 +0,0 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.quest.io;
import java.io.File;
import java.io.FilenameFilter;
import forge.deck.io.DeckSerializer;
import forge.item.PreconDeck;
import forge.util.storage.StorageReaderFolder;
/**
* TODO: Write javadoc for this type.
*
*/
public class PreconReader extends StorageReaderFolder<PreconDeck> {
/**
* TODO: Write javadoc for Constructor.
*
* @param deckDir0 the deck dir0
*/
public PreconReader(final File deckDir0) {
super(deckDir0, PreconDeck.FN_NAME_SELECTOR);
}
/*
* (non-Javadoc)
*
* @see forge.deck.io.DeckSerializerBase#read(java.io.File)
*/
@Override
protected PreconDeck read(final File file) {
return new PreconDeck(file);
}
/*
* (non-Javadoc)
*
* @see forge.deck.io.DeckSerializerBase#getFileFilter()
*/
@Override
protected FilenameFilter getFileFilter() {
return DeckSerializer.DCK_FILE_FILTER;
}
/*
* (non-Javadoc)
*
* @see forge.util.IItemReader#readAll()
*/
}

View File

@@ -19,7 +19,6 @@ package forge.view;
import forge.Singletons;
import forge.card.cardfactory.CardStorageReader;
import forge.net.FServer;
/**

View File

@@ -432,7 +432,6 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.1</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.wagon</groupId>