diff --git a/.gitattributes b/.gitattributes index f2e303b356f..e32a9f2645d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -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 diff --git a/forge-gui/src/main/java/forge/deck/Deck.java b/forge-core/src/main/java/forge/deck/Deck.java similarity index 100% rename from forge-gui/src/main/java/forge/deck/Deck.java rename to forge-core/src/main/java/forge/deck/Deck.java diff --git a/forge-gui/src/main/java/forge/deck/DeckBase.java b/forge-core/src/main/java/forge/deck/DeckBase.java similarity index 93% rename from forge-gui/src/main/java/forge/deck/DeckBase.java rename to forge-core/src/main/java/forge/deck/DeckBase.java index 859cb22f9b4..604b7f326bf 100644 --- a/forge-gui/src/main/java/forge/deck/DeckBase.java +++ b/forge-core/src/main/java/forge/deck/DeckBase.java @@ -52,8 +52,8 @@ public abstract class DeckBase implements Serializable, Comparable, 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; diff --git a/forge-gui/src/main/java/forge/deck/DeckFormat.java b/forge-core/src/main/java/forge/deck/DeckFormat.java similarity index 80% rename from forge-gui/src/main/java/forge/deck/DeckFormat.java rename to forge-core/src/main/java/forge/deck/DeckFormat.java index 64515e70af6..c93cda09304 100644 --- a/forge-gui/src/main/java/forge/deck/DeckFormat.java +++ b/forge-core/src/main/java/forge/deck/DeckFormat.java @@ -22,42 +22,37 @@ 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; /** * GameType is an enum to determine the type of current game. :) */ 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 mainRange; + private final Range 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 main, Range side, int maxCopies) { mainRange = main; sideRange = side; maxCardCopies = maxCopies; @@ -89,7 +84,7 @@ public enum DeckFormat { /** * @return the sideRange */ - public IntRange getSideRange() { + public Range getSideRange() { return sideRange; } @@ -97,7 +92,7 @@ public enum DeckFormat { /** * @return the mainRange */ - public IntRange getMainRange() { + public Range 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 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 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; diff --git a/forge-gui/src/main/java/forge/deck/DeckSection.java b/forge-core/src/main/java/forge/deck/DeckSection.java similarity index 100% rename from forge-gui/src/main/java/forge/deck/DeckSection.java rename to forge-core/src/main/java/forge/deck/DeckSection.java diff --git a/forge-gui/src/main/java/forge/deck/io/DeckFileHeader.java b/forge-core/src/main/java/forge/deck/io/DeckFileHeader.java similarity index 84% rename from forge-gui/src/main/java/forge/deck/io/DeckFileHeader.java rename to forge-core/src/main/java/forge/deck/io/DeckFileHeader.java index 6aaa0bdde55..b432afe309f 100644 --- a/forge-gui/src/main/java/forge/deck/io/DeckFileHeader.java +++ b/forge-core/src/main/java/forge/deck/io/DeckFileHeader.java @@ -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 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 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. * diff --git a/forge-core/src/main/java/forge/deck/io/DeckSerializer.java b/forge-core/src/main/java/forge/deck/io/DeckSerializer.java new file mode 100644 index 00000000000..6349005ccdd --- /dev/null +++ b/forge-core/src/main/java/forge/deck/io/DeckSerializer.java @@ -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 . + */ +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 implements IItemSerializer { + 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 DCKFileFilter. */ + 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> 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> map, final boolean canThrow) { + if (map == null) { + return null; + } + final List metadata = map.get("metadata"); + if (metadata != null) { + return new DeckFileHeader(FileSection.parse(metadata, "=")); + } + final List 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 getReaderForFolder(File subfolder) { + if ( !subfolder.getParentFile().equals(directory) ) + throw new UnsupportedOperationException("Only child folders of " + directory + " may be processed"); + return new DeckSerializer(subfolder, false); + } +} diff --git a/forge-gui/src/main/java/forge/deck/io/OldDeckFileFormatException.java b/forge-core/src/main/java/forge/deck/io/OldDeckFileFormatException.java similarity index 100% rename from forge-gui/src/main/java/forge/deck/io/OldDeckFileFormatException.java rename to forge-core/src/main/java/forge/deck/io/OldDeckFileFormatException.java diff --git a/forge-core/src/main/java/forge/deck/io/package-info.java b/forge-core/src/main/java/forge/deck/io/package-info.java new file mode 100644 index 00000000000..8aaad793334 --- /dev/null +++ b/forge-core/src/main/java/forge/deck/io/package-info.java @@ -0,0 +1,8 @@ +/** + * + */ +/** + * @author Max + * + */ +package forge.deck.io; \ No newline at end of file diff --git a/forge-gui/src/main/java/forge/item/BoosterPack.java b/forge-core/src/main/java/forge/item/BoosterPack.java similarity index 87% rename from forge-gui/src/main/java/forge/item/BoosterPack.java rename to forge-core/src/main/java/forge/item/BoosterPack.java index c1f84aebc91..270d5d6e003 100644 --- a/forge-gui/src/main/java/forge/item/BoosterPack.java +++ b/forge-core/src/main/java/forge/item/BoosterPack.java @@ -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 FN_FROM_SET = new Function() { @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; } diff --git a/forge-gui/src/main/java/forge/item/FatPack.java b/forge-core/src/main/java/forge/item/FatPack.java similarity index 88% rename from forge-gui/src/main/java/forge/item/FatPack.java rename to forge-core/src/main/java/forge/item/FatPack.java index ae6df71b3c0..aef4f71d455 100644 --- a/forge-gui/src/main/java/forge/item/FatPack.java +++ b/forge-core/src/main/java/forge/item/FatPack.java @@ -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 FN_FROM_SET = new Function() { @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; } diff --git a/forge-gui/src/main/java/forge/item/ItemPredicate.java b/forge-core/src/main/java/forge/item/ItemPredicate.java similarity index 100% rename from forge-gui/src/main/java/forge/item/ItemPredicate.java rename to forge-core/src/main/java/forge/item/ItemPredicate.java diff --git a/forge-gui/src/main/java/forge/item/OpenablePack.java b/forge-core/src/main/java/forge/item/OpenablePack.java similarity index 86% rename from forge-gui/src/main/java/forge/item/OpenablePack.java rename to forge-core/src/main/java/forge/item/OpenablePack.java index 2f15f9b54a5..f048f4ce19c 100644 --- a/forge-gui/src/main/java/forge/item/OpenablePack.java +++ b/forge-core/src/main/java/forge/item/OpenablePack.java @@ -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 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 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); } } diff --git a/forge-gui/src/main/java/forge/item/PreconDeck.java b/forge-core/src/main/java/forge/item/PreconDeck.java similarity index 55% rename from forge-gui/src/main/java/forge/item/PreconDeck.java rename to forge-core/src/main/java/forge/item/PreconDeck.java index 49fca865cd4..67fe506176b 100644 --- a/forge-gui/src/main/java/forge/item/PreconDeck.java +++ b/forge-core/src/main/java/forge/item/PreconDeck.java @@ -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 final SellRules recommendedDeals; + private String imageFilename; + + // 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 deckLines = FileUtil.readFile(f); - final Map> 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; @@ -132,5 +112,38 @@ public class PreconDeck implements InventoryItemFromSet { return arg1.getName(); } }; + + public static class Reader extends StorageReaderFolder { + + + 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> 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; + } + + + } } diff --git a/forge-gui/src/main/java/forge/item/TournamentPack.java b/forge-core/src/main/java/forge/item/TournamentPack.java similarity index 91% rename from forge-gui/src/main/java/forge/item/TournamentPack.java rename to forge-core/src/main/java/forge/item/TournamentPack.java index 9357da452f5..cc16f0575f5 100644 --- a/forge-gui/src/main/java/forge/item/TournamentPack.java +++ b/forge-core/src/main/java/forge/item/TournamentPack.java @@ -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 FN_FROM_SET = new Function() { @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); } }; diff --git a/forge-core/src/main/java/forge/Constant.java b/forge-gui/src/main/java/forge/Constant.java similarity index 100% rename from forge-core/src/main/java/forge/Constant.java rename to forge-gui/src/main/java/forge/Constant.java diff --git a/forge-gui/src/main/java/forge/deck/io/DeckHtmlSerializer.java b/forge-gui/src/main/java/forge/deck/io/DeckHtmlSerializer.java new file mode 100644 index 00000000000..9b304d62e8b --- /dev/null +++ b/forge-gui/src/main/java/forge/deck/io/DeckHtmlSerializer.java @@ -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); + } + } + + /** + *

+ * writeDeck. + *

+ * + * @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 root = new HashMap(); + root.put("title", d.getName()); + final List list = new ArrayList(); + for (final Entry 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 map = new TreeMap(); + for (final Entry 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()); + } + } +} \ No newline at end of file diff --git a/forge-gui/src/main/java/forge/deck/io/DeckSerializer.java b/forge-gui/src/main/java/forge/deck/io/DeckSerializer.java deleted file mode 100644 index 1d98751d261..00000000000 --- a/forge-gui/src/main/java/forge/deck/io/DeckSerializer.java +++ /dev/null @@ -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 . - */ -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 implements IItemSerializer { - 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 DCKFileFilter. */ - 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"; - } - }; - - /** - *

- * writeDeck. - *

- * - * @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 root = new HashMap(); - root.put("title", d.getName()); - final List list = new ArrayList(); - for (final Entry 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 map = new TreeMap(); - for (final Entry 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> 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> map, final boolean canThrow) { - if (map == null) { - return null; - } - final List metadata = map.get("metadata"); - if (metadata != null) { - return new DeckFileHeader(FileSection.parse(metadata, "=")); - } - final List 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 getReaderForFolder(File subfolder) { - if ( !subfolder.getParentFile().equals(directory) ) - throw new UnsupportedOperationException("Only child folders of " + directory + " may be processed"); - return new DeckSerializer(subfolder, false); - } -} diff --git a/forge-gui/src/main/java/forge/deck/io/OldDeckParser.java b/forge-gui/src/main/java/forge/deck/io/OldDeckParser.java index c4fcc747750..d779544152b 100644 --- a/forge-gui/src/main/java/forge/deck/io/OldDeckParser.java +++ b/forge-gui/src/main/java/forge/deck/io/OldDeckParser.java @@ -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> 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 { diff --git a/forge-gui/src/main/java/forge/game/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/game/player/PlayerControllerHuman.java index fc20a1ac354..81236cb39e8 100644 --- a/forge-gui/src/main/java/forge/game/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/game/player/PlayerControllerHuman.java @@ -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 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 newMain = null; diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CCurrentDeck.java b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CCurrentDeck.java index cefb89d667b..d779d661df9 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CCurrentDeck.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CCurrentDeck.java @@ -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) 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"; + } + }; } diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java index 86b5dd8deb6..1595358285c 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java @@ -220,7 +220,7 @@ public final class CEditorQuestCardShop extends ACEditorBase { IStorage preconDecks = QuestController.getPrecons(); for (PreconDeck preconDeck : preconDecks) { - if (preconDeck.getRecommendedDeals().getMinWins() > 0) { + if (QuestController.getPreconDeals(preconDeck).getMinWins() > 0) { continue; } String name = preconDeck.getName(); diff --git a/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java b/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java index ba7556cb6c1..ffa7116055b 100644 --- a/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java +++ b/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java @@ -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; - } - - String rightDeckErrorMessage = gameType.getDecksFormat().getDeckConformanceProblem(pscRight.getOriginalDeck()); - if (null != rightDeckErrorMessage) { - JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Right-side deck " + rightDeckErrorMessage, "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; + } } Lobby lobby = FServer.instance.getLobby(); diff --git a/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuDraft.java b/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuDraft.java index 6e7ba131ee1..da263699040 100644 --- a/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuDraft.java +++ b/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuDraft.java @@ -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(); diff --git a/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuSealed.java b/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuSealed.java index bc1c8d40417..6251cdc8a51 100644 --- a/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuSealed.java +++ b/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuSealed.java @@ -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(); diff --git a/forge-gui/src/main/java/forge/gui/home/variant/CSubmenuCommander.java b/forge-gui/src/main/java/forge/gui/home/variant/CSubmenuCommander.java index 75c2512b30b..0636d489442 100644 --- a/forge-gui/src/main/java/forge/gui/home/variant/CSubmenuCommander.java +++ b/forge-gui/src/main/java/forge/gui/home/variant/CSubmenuCommander.java @@ -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); diff --git a/forge-gui/src/main/java/forge/item/package-info.java b/forge-gui/src/main/java/forge/item/package-info.java deleted file mode 100644 index b2c023f908f..00000000000 --- a/forge-gui/src/main/java/forge/item/package-info.java +++ /dev/null @@ -1,3 +0,0 @@ -/** Forge Card Game. */ -package forge.item; - diff --git a/forge-gui/src/main/java/forge/quest/QuestController.java b/forge-gui/src/main/java/forge/quest/QuestController.java index a89f2bfb860..459fd249b1f 100644 --- a/forge-gui/src/main/java/forge/quest/QuestController.java +++ b/forge-gui/src/main/java/forge/quest/QuestController.java @@ -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,19 +170,25 @@ public class QuestController { this.currentEvent = currentEvent; } - /** - * Gets the precons. - * - * @return QuestPreconManager - */ public static IStorage getPrecons() { if (null == preconManager) { - preconManager = new StorageBase("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("Quest shop decks", new PreconDeck.Reader(new File(NewConstants.QUEST_PRECON_DIR)){ + @Override + protected PreconDeck getPreconDeckFromSections(java.util.Map> sections) { + PreconDeck result = super.getPreconDeckFromSections(sections); + preconDeals.put(result.getName(), new SellRules(sections.get("shop"))); + return result; + }; + }); } - return QuestController.preconManager; } - + private final static Map preconDeals = new TreeMap(); + public static SellRules getPreconDeals(PreconDeck deck) { + return preconDeals.get(deck.getName()); + } + /** * TODO: Write javadoc for this method. * diff --git a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java index ad632218912..8962b7e97c0 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java @@ -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 meetRequirements = new ArrayList(); 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); } diff --git a/forge-gui/src/main/java/forge/quest/io/PreconReader.java b/forge-gui/src/main/java/forge/quest/io/PreconReader.java deleted file mode 100644 index a8d7003c457..00000000000 --- a/forge-gui/src/main/java/forge/quest/io/PreconReader.java +++ /dev/null @@ -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 . - */ -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 { - - /** - * 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() - */ - -} diff --git a/forge-gui/src/main/java/forge/view/Main.java b/forge-gui/src/main/java/forge/view/Main.java index 5e4aa762805..fec39c2018a 100644 --- a/forge-gui/src/main/java/forge/view/Main.java +++ b/forge-gui/src/main/java/forge/view/Main.java @@ -19,7 +19,6 @@ package forge.view; import forge.Singletons; -import forge.card.cardfactory.CardStorageReader; import forge.net.FServer; /** diff --git a/pom.xml b/pom.xml index 7dd800b74ae..ca0d5ef53e8 100644 --- a/pom.xml +++ b/pom.xml @@ -432,7 +432,6 @@ org.apache.maven.plugins maven-deploy-plugin - 2.8.1 org.apache.maven.wagon