mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 19:58:00 +00:00
moved all items to core, decks were included too.
This commit is contained in:
32
.gitattributes
vendored
32
.gitattributes
vendored
@@ -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.jdt.core.prefs -text
|
||||||
forge-core/.settings/org.eclipse.m2e.core.prefs -text
|
forge-core/.settings/org.eclipse.m2e.core.prefs -text
|
||||||
forge-core/pom.xml -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/ICardStorageReader.java -text
|
||||||
forge-core/src/main/java/forge/IProgressObserver.java -text
|
forge-core/src/main/java/forge/IProgressObserver.java -text
|
||||||
forge-core/src/main/java/forge/StaticData.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/ManaCostShard.java -text
|
||||||
forge-core/src/main/java/forge/card/mana/package-info.java svneol=native#text/plain
|
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/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/deck/package-info.java -text
|
||||||
forge-core/src/main/java/forge/game/GameFormat.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/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/IPaperCard.java -text
|
||||||
forge-core/src/main/java/forge/item/InventoryItem.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/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/PaperCard.java -text
|
||||||
forge-core/src/main/java/forge/item/PaperToken.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/item/package-info.java -text
|
||||||
forge-core/src/main/java/forge/package-info.java -text
|
forge-core/src/main/java/forge/package-info.java -text
|
||||||
forge-core/src/main/java/forge/util/Aggregates.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/CardType.java svneol=native#text/plain
|
||||||
forge-gui/src/main/java/forge/CardUtil.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/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/CounterType.java svneol=native#text/plain
|
||||||
forge-gui/src/main/java/forge/FThreads.java -text
|
forge-gui/src/main/java/forge/FThreads.java -text
|
||||||
forge-gui/src/main/java/forge/GameEntity.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/RestartUtil.java -text
|
||||||
forge-gui/src/main/java/forge/control/package-info.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/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/DeckGroup.java -text
|
||||||
forge-gui/src/main/java/forge/deck/DeckRecognizer.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/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/Generate2ColorDeck.java svneol=native#text/plain
|
||||||
forge-gui/src/main/java/forge/deck/generate/Generate3ColorDeck.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/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/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/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/DeckGroupSerializer.java -text
|
||||||
forge-gui/src/main/java/forge/deck/io/DeckSerializer.java -text
|
forge-gui/src/main/java/forge/deck/io/DeckHtmlSerializer.java -text
|
||||||
forge-gui/src/main/java/forge/deck/io/OldDeckFileFormatException.java -text
|
|
||||||
forge-gui/src/main/java/forge/deck/io/OldDeckParser.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/io/package-info.java svneol=native#text/plain
|
||||||
forge-gui/src/main/java/forge/deck/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/VCardDesigner.java -text
|
||||||
forge-gui/src/main/java/forge/gui/workshop/views/VCardScript.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/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/BuildInfo.java -text
|
||||||
forge-gui/src/main/java/forge/model/FModel.java svneol=native#text/plain
|
forge-gui/src/main/java/forge/model/FModel.java svneol=native#text/plain
|
||||||
forge-gui/src/main/java/forge/model/MultipleForgeJarsFoundError.java -text
|
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/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/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/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/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/QuestDataIO.java svneol=native#text/plain
|
||||||
forge-gui/src/main/java/forge/quest/io/QuestDuelReader.java -text
|
forge-gui/src/main/java/forge/quest/io/QuestDuelReader.java -text
|
||||||
|
|||||||
@@ -52,8 +52,8 @@ public abstract class DeckBase implements Serializable, Comparable<DeckBase>, IH
|
|||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(final Object o) {
|
public boolean equals(final Object o) {
|
||||||
if (o instanceof Deck) {
|
if (o instanceof DeckBase) {
|
||||||
final Deck d = (Deck) o;
|
final DeckBase d = (DeckBase) o;
|
||||||
return this.getName().equals(d.getName());
|
return this.getName().equals(d.getName());
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -22,14 +22,14 @@ import java.util.Arrays;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map.Entry;
|
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.CardCoreType;
|
||||||
import forge.card.ColorSet;
|
import forge.card.ColorSet;
|
||||||
import forge.item.PaperCard;
|
import forge.item.PaperCard;
|
||||||
import forge.item.IPaperCard;
|
import forge.item.IPaperCard;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
|
||||||
import forge.util.Aggregates;
|
import forge.util.Aggregates;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -38,26 +38,21 @@ import forge.util.Aggregates;
|
|||||||
public enum DeckFormat {
|
public enum DeckFormat {
|
||||||
|
|
||||||
// Main board: allowed size SB: restriction Max distinct non basic cards
|
// Main board: allowed size SB: restriction Max distinct non basic cards
|
||||||
Constructed ( new IntRange(60, Integer.MAX_VALUE), new IntRange(0, 15), 4),
|
Constructed ( Range.between(60, Integer.MAX_VALUE), Range.between(0, 15), 4),
|
||||||
QuestDeck ( new IntRange(40, Integer.MAX_VALUE), new IntRange(0, 15), 4),
|
QuestDeck ( Range.between(40, Integer.MAX_VALUE), Range.between(0, 15), 4),
|
||||||
Limited ( new IntRange(40, Integer.MAX_VALUE), null, Integer.MAX_VALUE),
|
Limited ( Range.between(40, Integer.MAX_VALUE), null, Integer.MAX_VALUE),
|
||||||
Commander ( new IntRange(99), new IntRange(0, 10), 1),
|
Commander ( Range.is(99), Range.between(0, 10), 1),
|
||||||
Vanguard ( new IntRange(60, Integer.MAX_VALUE), new IntRange(0), 4),
|
Vanguard ( Range.between(60, Integer.MAX_VALUE), Range.is(0), 4),
|
||||||
Planechase ( new IntRange(60, Integer.MAX_VALUE), new IntRange(0), 4),
|
Planechase ( Range.between(60, Integer.MAX_VALUE), Range.is(0), 4),
|
||||||
Archenemy ( new IntRange(60, Integer.MAX_VALUE), new IntRange(0), 4);
|
Archenemy ( Range.between(60, Integer.MAX_VALUE), Range.is(0), 4);
|
||||||
|
|
||||||
private final IntRange mainRange;
|
private final Range<Integer> mainRange;
|
||||||
private final IntRange sideRange; // null => no check
|
private final Range<Integer> sideRange; // null => no check
|
||||||
private final int maxCardCopies;
|
private final int maxCardCopies;
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new game type.
|
DeckFormat(Range<Integer> main, Range<Integer> side, int maxCopies) {
|
||||||
*
|
|
||||||
* @param isLimited
|
|
||||||
* the is limited
|
|
||||||
*/
|
|
||||||
DeckFormat(IntRange main, IntRange side, int maxCopies) {
|
|
||||||
mainRange = main;
|
mainRange = main;
|
||||||
sideRange = side;
|
sideRange = side;
|
||||||
maxCardCopies = maxCopies;
|
maxCardCopies = maxCopies;
|
||||||
@@ -89,7 +84,7 @@ public enum DeckFormat {
|
|||||||
/**
|
/**
|
||||||
* @return the sideRange
|
* @return the sideRange
|
||||||
*/
|
*/
|
||||||
public IntRange getSideRange() {
|
public Range<Integer> getSideRange() {
|
||||||
return sideRange;
|
return sideRange;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,7 +92,7 @@ public enum DeckFormat {
|
|||||||
/**
|
/**
|
||||||
* @return the mainRange
|
* @return the mainRange
|
||||||
*/
|
*/
|
||||||
public IntRange getMainRange() {
|
public Range<Integer> getMainRange() {
|
||||||
return mainRange;
|
return mainRange;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,15 +112,10 @@ public enum DeckFormat {
|
|||||||
return "is not selected";
|
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 deckSize = deck.getMain().countAll();
|
||||||
|
|
||||||
int min = getMainRange().getMinimumInteger();
|
int min = getMainRange().getMinimum();
|
||||||
int max = getMainRange().getMaximumInteger();
|
int max = getMainRange().getMaximum();
|
||||||
|
|
||||||
if (deckSize < min) {
|
if (deckSize < min) {
|
||||||
return String.format("should have a minimum of %d cards", 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
|
// 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)) {
|
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());
|
boolean canHaveMultiple = simpleCard.getRules().getType().isBasicLand() || limitExceptions.contains(cp.getKey());
|
||||||
|
|
||||||
if (!canHaveMultiple && cp.getValue() > maxCopies) {
|
if (!canHaveMultiple && cp.getValue() > maxCopies) {
|
||||||
@@ -243,11 +233,11 @@ public enum DeckFormat {
|
|||||||
|
|
||||||
// The sideboard must contain either 0 or 15 cards
|
// The sideboard must contain either 0 or 15 cards
|
||||||
int sideboardSize = deck.has(DeckSection.Sideboard) ? deck.get(DeckSection.Sideboard).countAll() : 0;
|
int sideboardSize = deck.has(DeckSection.Sideboard) ? deck.get(DeckSection.Sideboard).countAll() : 0;
|
||||||
IntRange sbRange = getSideRange();
|
Range<Integer> sbRange = getSideRange();
|
||||||
if (sbRange != null && sideboardSize > 0 && !sbRange.containsInteger(sideboardSize)) {
|
if (sbRange != null && sideboardSize > 0 && !sbRange.contains(sideboardSize)) {
|
||||||
return sbRange.getMinimumInteger() == sbRange.getMaximumInteger()
|
return sbRange.getMinimum() == sbRange.getMaximum()
|
||||||
? String.format("must have a sideboard of %d cards or no sideboard at all", sbRange.getMaximumInteger())
|
? 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.getMinimumInteger(), sbRange.getMaximumInteger());
|
: String.format("must have a sideboard of %d to %d cards or no sideboard at all", sbRange.getMinimum(), sbRange.getMaximum());
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
@@ -23,7 +23,6 @@ import java.util.TreeSet;
|
|||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
import forge.deck.DeckFormat;
|
import forge.deck.DeckFormat;
|
||||||
import forge.game.player.PlayerType;
|
|
||||||
import forge.util.FileSection;
|
import forge.util.FileSection;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -48,7 +47,6 @@ public class DeckFileHeader {
|
|||||||
private static final String PLAYER_TYPE = "PlayerType";
|
private static final String PLAYER_TYPE = "PlayerType";
|
||||||
|
|
||||||
private final DeckFormat deckType;
|
private final DeckFormat deckType;
|
||||||
private final PlayerType playerType;
|
|
||||||
private final boolean customPool;
|
private final boolean customPool;
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
@@ -56,6 +54,15 @@ public class DeckFileHeader {
|
|||||||
|
|
||||||
private final Set<String> tags;
|
private final Set<String> tags;
|
||||||
|
|
||||||
|
private final boolean intendedForAi;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the intendedForAi
|
||||||
|
*/
|
||||||
|
public boolean isIntendedForAi() {
|
||||||
|
return intendedForAi;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: Write javadoc for Constructor.
|
* TODO: Write javadoc for Constructor.
|
||||||
*
|
*
|
||||||
@@ -67,8 +74,7 @@ public class DeckFileHeader {
|
|||||||
this.comment = kvPairs.get(DeckFileHeader.COMMENT);
|
this.comment = kvPairs.get(DeckFileHeader.COMMENT);
|
||||||
this.deckType = DeckFormat.smartValueOf(kvPairs.get(DeckFileHeader.DECK_TYPE), DeckFormat.Constructed);
|
this.deckType = DeckFormat.smartValueOf(kvPairs.get(DeckFileHeader.DECK_TYPE), DeckFormat.Constructed);
|
||||||
this.customPool = kvPairs.getBoolean(DeckFileHeader.CSTM_POOL);
|
this.customPool = kvPairs.getBoolean(DeckFileHeader.CSTM_POOL);
|
||||||
boolean isForAi = "computer".equalsIgnoreCase(kvPairs.get(DeckFileHeader.PLAYER)) || "ai".equalsIgnoreCase(kvPairs.get(DeckFileHeader.PLAYER_TYPE));
|
this.intendedForAi = "computer".equalsIgnoreCase(kvPairs.get(DeckFileHeader.PLAYER)) || "ai".equalsIgnoreCase(kvPairs.get(DeckFileHeader.PLAYER_TYPE));
|
||||||
this.playerType = isForAi ? PlayerType.COMPUTER : PlayerType.HUMAN;
|
|
||||||
this.tags = new TreeSet<String>();
|
this.tags = new TreeSet<String>();
|
||||||
|
|
||||||
String rawTags = kvPairs.get(DeckFileHeader.TAGS);
|
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.
|
* Checks if is custom pool.
|
||||||
*
|
*
|
||||||
135
forge-core/src/main/java/forge/deck/io/DeckSerializer.java
Normal file
135
forge-core/src/main/java/forge/deck/io/DeckSerializer.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
8
forge-core/src/main/java/forge/deck/io/package-info.java
Normal file
8
forge-core/src/main/java/forge/deck/io/package-info.java
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @author Max
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package forge.deck.io;
|
||||||
@@ -20,7 +20,7 @@ package forge.item;
|
|||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
|
|
||||||
import forge.Singletons;
|
import forge.StaticData;
|
||||||
import forge.card.CardEdition;
|
import forge.card.CardEdition;
|
||||||
import forge.card.SealedProductTemplate;
|
import forge.card.SealedProductTemplate;
|
||||||
import forge.util.MyRandom;
|
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>() {
|
public static final Function<CardEdition, BoosterPack> FN_FROM_SET = new Function<CardEdition, BoosterPack>() {
|
||||||
@Override
|
@Override
|
||||||
public BoosterPack apply(final CardEdition arg1) {
|
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);
|
return new BoosterPack(arg1.getName(), d);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
public BoosterPack(final String name0, final SealedProductTemplate boosterData) {
|
public BoosterPack(final String name0, final SealedProductTemplate boosterData) {
|
||||||
super(name0, 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;
|
artIndex = MyRandom.getRandom().nextInt(maxIdx) + 1;
|
||||||
hash = super.hashCode() ^ artIndex;
|
hash = super.hashCode() ^ artIndex;
|
||||||
}
|
}
|
||||||
@@ -23,7 +23,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
|
|
||||||
import forge.Singletons;
|
import forge.StaticData;
|
||||||
import forge.card.BoosterGenerator;
|
import forge.card.BoosterGenerator;
|
||||||
import forge.card.CardEdition;
|
import forge.card.CardEdition;
|
||||||
import forge.card.FatPackTemplate;
|
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>() {
|
public static final Function<CardEdition, FatPack> FN_FROM_SET = new Function<CardEdition, FatPack>() {
|
||||||
@Override
|
@Override
|
||||||
public FatPack apply(final CardEdition arg1) {
|
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);
|
return new FatPack(arg1.getName(), d);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -40,7 +40,7 @@ public class FatPack extends OpenablePack {
|
|||||||
private final FatPackTemplate fpData;
|
private final FatPackTemplate fpData;
|
||||||
|
|
||||||
public FatPack(final String name0, final FatPackTemplate fpData0) {
|
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;
|
fpData = fpData0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -20,13 +20,11 @@ package forge.item;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.commons.lang.NullArgumentException;
|
|
||||||
|
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
import com.google.common.base.Predicates;
|
import com.google.common.base.Predicates;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
|
|
||||||
import forge.Singletons;
|
import forge.StaticData;
|
||||||
import forge.card.BoosterGenerator;
|
import forge.card.BoosterGenerator;
|
||||||
import forge.card.CardRulesPredicates;
|
import forge.card.CardRulesPredicates;
|
||||||
import forge.card.SealedProductTemplate;
|
import forge.card.SealedProductTemplate;
|
||||||
@@ -39,8 +37,8 @@ public abstract class OpenablePack implements InventoryItemFromSet {
|
|||||||
private List<PaperCard> cards = null;
|
private List<PaperCard> cards = null;
|
||||||
|
|
||||||
public OpenablePack(String name0, SealedProductTemplate boosterData) {
|
public OpenablePack(String name0, SealedProductTemplate boosterData) {
|
||||||
if (null == name0) { throw new NullArgumentException("name0"); }
|
if (null == name0) { throw new IllegalArgumentException("name0 must not be null"); }
|
||||||
if (null == boosterData) { throw new NullArgumentException("boosterData"); }
|
if (null == boosterData) { throw new IllegalArgumentException("boosterData must not be null"); }
|
||||||
contents = boosterData;
|
contents = boosterData;
|
||||||
name = name0;
|
name = name0;
|
||||||
hash = name.hashCode() ^ getClass().hashCode() ^ contents.hashCode();
|
hash = name.hashCode() ^ getClass().hashCode() ^ contents.hashCode();
|
||||||
@@ -104,6 +102,6 @@ public abstract class OpenablePack implements InventoryItemFromSet {
|
|||||||
Predicate<PaperCard> cardsRule = Predicates.and(
|
Predicate<PaperCard> cardsRule = Predicates.and(
|
||||||
IPaperCard.Predicates.printedInSet(setCode),
|
IPaperCard.Predicates.printedInSet(setCode),
|
||||||
Predicates.compose(CardRulesPredicates.Presets.IS_BASIC_LAND, PaperCard.FN_GET_RULES));
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -18,16 +18,18 @@
|
|||||||
package forge.item;
|
package forge.item;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FilenameFilter;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
|
|
||||||
import forge.Singletons;
|
import forge.StaticData;
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
import forge.quest.SellRules;
|
import forge.deck.io.DeckSerializer;
|
||||||
import forge.util.FileSection;
|
import forge.util.FileSection;
|
||||||
import forge.util.FileUtil;
|
import forge.util.FileUtil;
|
||||||
|
import forge.util.storage.StorageReaderFolder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: Write javadoc for this type.
|
* TODO: Write javadoc for this type.
|
||||||
@@ -36,11 +38,11 @@ import forge.util.FileUtil;
|
|||||||
public class PreconDeck implements InventoryItemFromSet {
|
public class PreconDeck implements InventoryItemFromSet {
|
||||||
|
|
||||||
private final Deck deck;
|
private final Deck deck;
|
||||||
private final String imageFilename;
|
|
||||||
private final String set;
|
private final String set;
|
||||||
private final String description;
|
private final String description;
|
||||||
|
private String imageFilename;
|
||||||
|
|
||||||
private final SellRules recommendedDeals;
|
// private final SellRules recommendedDeals;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
@@ -62,34 +64,12 @@ public class PreconDeck implements InventoryItemFromSet {
|
|||||||
return "Prebuilt Deck";
|
return "Prebuilt Deck";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public PreconDeck(final Deck d, String set, String description) {
|
||||||
* Instantiates a new precon deck.
|
deck = d;
|
||||||
*
|
this.set = set;
|
||||||
* @param f
|
this.description = description;
|
||||||
* 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"));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the deck.
|
|
||||||
*
|
|
||||||
* @return the deck
|
|
||||||
*/
|
|
||||||
public final Deck getDeck() {
|
public final Deck getDeck() {
|
||||||
return this.deck;
|
return this.deck;
|
||||||
}
|
}
|
||||||
@@ -99,9 +79,9 @@ public class PreconDeck implements InventoryItemFromSet {
|
|||||||
*
|
*
|
||||||
* @return the recommended deals
|
* @return the recommended deals
|
||||||
*/
|
*/
|
||||||
public final SellRules getRecommendedDeals() {
|
// public final SellRules getRecommendedDeals() {
|
||||||
return this.recommendedDeals;
|
// return this.recommendedDeals;
|
||||||
}
|
// }
|
||||||
|
|
||||||
public final String getImageFilename() {
|
public final String getImageFilename() {
|
||||||
return imageFilename;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -21,7 +21,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
|
|
||||||
import forge.Singletons;
|
import forge.StaticData;
|
||||||
import forge.card.BoosterGenerator;
|
import forge.card.BoosterGenerator;
|
||||||
import forge.card.CardEdition;
|
import forge.card.CardEdition;
|
||||||
import forge.card.SealedProductTemplate;
|
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>() {
|
public static final Function<CardEdition, TournamentPack> FN_FROM_SET = new Function<CardEdition, TournamentPack>() {
|
||||||
@Override
|
@Override
|
||||||
public TournamentPack apply(final CardEdition arg1) {
|
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);
|
return new TournamentPack(arg1.getName(), d);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
106
forge-gui/src/main/java/forge/deck/io/DeckHtmlSerializer.java
Normal file
106
forge-gui/src/main/java/forge/deck/io/DeckHtmlSerializer.java
Normal 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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -32,7 +32,6 @@ import org.apache.commons.lang3.tuple.Pair;
|
|||||||
|
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
import forge.deck.DeckGroup;
|
import forge.deck.DeckGroup;
|
||||||
import forge.game.player.PlayerType;
|
|
||||||
import forge.properties.NewConstants;
|
import forge.properties.NewConstants;
|
||||||
import forge.util.FileSection;
|
import forge.util.FileSection;
|
||||||
import forge.util.FileUtil;
|
import forge.util.FileUtil;
|
||||||
@@ -216,7 +215,6 @@ public class OldDeckParser {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case Limited:
|
case Limited:
|
||||||
final boolean isAi = dh.getPlayerType() == PlayerType.COMPUTER;
|
|
||||||
name = name.startsWith("AI_") ? name.replace("AI_", "") : name;
|
name = name.startsWith("AI_") ? name.replace("AI_", "") : name;
|
||||||
|
|
||||||
Pair<DeckGroup, MutablePair<File, File>> stored = sealedDecks.get(name);
|
Pair<DeckGroup, MutablePair<File, File>> stored = sealedDecks.get(name);
|
||||||
@@ -225,7 +223,7 @@ public class OldDeckParser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final Deck deck = Deck.fromSections(sections);
|
final Deck deck = Deck.fromSections(sections);
|
||||||
if (isAi) {
|
if (dh.isIntendedForAi()) {
|
||||||
stored.getLeft().addAiDeck(deck);
|
stored.getLeft().addAiDeck(deck);
|
||||||
stored.getRight().setRight(f);
|
stored.getRight().setRight(f);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import javax.swing.MenuElement;
|
|||||||
import javax.swing.MenuSelectionManager;
|
import javax.swing.MenuSelectionManager;
|
||||||
import javax.swing.SwingUtilities;
|
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.StringUtils;
|
||||||
import org.apache.commons.lang3.tuple.ImmutablePair;
|
import org.apache.commons.lang3.tuple.ImmutablePair;
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
@@ -188,10 +188,10 @@ public class PlayerControllerHuman extends PlayerController {
|
|||||||
int sbSize = sideboard.countAll();
|
int sbSize = sideboard.countAll();
|
||||||
int combinedDeckSize = mainSize + sbSize;
|
int combinedDeckSize = mainSize + sbSize;
|
||||||
|
|
||||||
int deckMinSize = Math.min(mainSize, gameType.getDecksFormat().getMainRange().getMinimumInteger());
|
int deckMinSize = Math.min(mainSize, gameType.getDecksFormat().getMainRange().getMinimum());
|
||||||
IntRange sbRange = gameType.getDecksFormat().getSideRange();
|
Range<Integer> sbRange = gameType.getDecksFormat().getSideRange();
|
||||||
// Limited doesn't have a sideboard max, so let the Main min take care of things.
|
// 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();
|
CardPool newSb = new CardPool();
|
||||||
List<PaperCard> newMain = null;
|
List<PaperCard> newMain = null;
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import forge.Command;
|
|||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
import forge.deck.DeckBase;
|
import forge.deck.DeckBase;
|
||||||
|
import forge.deck.io.DeckHtmlSerializer;
|
||||||
import forge.deck.io.DeckSerializer;
|
import forge.deck.io.DeckSerializer;
|
||||||
import forge.error.BugReporter;
|
import forge.error.BugReporter;
|
||||||
import forge.gui.deckeditor.CDeckEditorUI;
|
import forge.gui.deckeditor.CDeckEditorUI;
|
||||||
@@ -45,7 +46,19 @@ public enum CCurrentDeck implements ICDoc {
|
|||||||
fileChooser.removeChoosableFileFilter(defFilter);
|
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)
|
/* (non-Javadoc)
|
||||||
@@ -202,7 +215,7 @@ public enum CCurrentDeck implements ICDoc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
DeckSerializer.writeDeckHtml(
|
DeckHtmlSerializer.writeDeckHtml(
|
||||||
((DeckController<Deck>) CDeckEditorUI.SINGLETON_INSTANCE
|
((DeckController<Deck>) CDeckEditorUI.SINGLETON_INSTANCE
|
||||||
.getCurrentEditorController().getDeckController()).getModel(), filename);
|
.getCurrentEditorController().getDeckController()).getModel(), filename);
|
||||||
} catch (final Exception ex) {
|
} catch (final Exception ex) {
|
||||||
@@ -231,7 +244,7 @@ public enum CCurrentDeck implements ICDoc {
|
|||||||
final JFileChooser save = new JFileChooser(previousDirectory);
|
final JFileChooser save = new JFileChooser(previousDirectory);
|
||||||
save.setDialogTitle("Print Proxies");
|
save.setDialogTitle("Print Proxies");
|
||||||
save.setDialogType(JFileChooser.SAVE_DIALOG);
|
save.setDialogType(JFileChooser.SAVE_DIALOG);
|
||||||
save.setFileFilter(DeckSerializer.HTML_FILTER);
|
save.setFileFilter(HTML_FILTER);
|
||||||
|
|
||||||
if (save.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
|
if (save.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
|
||||||
final File file = save.getSelectedFile();
|
final File file = save.getSelectedFile();
|
||||||
@@ -244,4 +257,16 @@ public enum CCurrentDeck implements ICDoc {
|
|||||||
return null;
|
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";
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -220,7 +220,7 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
|
|||||||
} else if (card instanceof FatPack) {
|
} else if (card instanceof FatPack) {
|
||||||
value = 2365;
|
value = 2365;
|
||||||
} else if (card instanceof PreconDeck) {
|
} 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?
|
// TODO: make this changeable via a user-definable property?
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import forge.gui.framework.FScreen;
|
|||||||
import forge.gui.toolbox.FSkin;
|
import forge.gui.toolbox.FSkin;
|
||||||
import forge.net.FServer;
|
import forge.net.FServer;
|
||||||
import forge.net.Lobby;
|
import forge.net.Lobby;
|
||||||
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.quest.QuestController;
|
import forge.quest.QuestController;
|
||||||
import forge.quest.QuestEvent;
|
import forge.quest.QuestEvent;
|
||||||
import forge.quest.QuestEventChallenge;
|
import forge.quest.QuestEventChallenge;
|
||||||
@@ -374,10 +375,12 @@ public class SSubmenuQuestUtil {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String errorMessage = GameType.Quest.getDecksFormat().getDeckConformanceProblem(deck);
|
if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) {
|
||||||
if (null != errorMessage) {
|
String errorMessage = GameType.Quest.getDecksFormat().getDeckConformanceProblem(deck);
|
||||||
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid deck", JOptionPane.ERROR_MESSAGE);
|
if (null != errorMessage) {
|
||||||
return;
|
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid deck", JOptionPane.ERROR_MESSAGE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SwingUtilities.invokeLater(new Runnable() {
|
SwingUtilities.invokeLater(new Runnable() {
|
||||||
|
|||||||
@@ -268,7 +268,7 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
|
|||||||
IStorage<PreconDeck> preconDecks = QuestController.getPrecons();
|
IStorage<PreconDeck> preconDecks = QuestController.getPrecons();
|
||||||
|
|
||||||
for (PreconDeck preconDeck : preconDecks) {
|
for (PreconDeck preconDeck : preconDecks) {
|
||||||
if (preconDeck.getRecommendedDeals().getMinWins() > 0) {
|
if (QuestController.getPreconDeals(preconDeck).getMinWins() > 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
String name = preconDeck.getName();
|
String name = preconDeck.getName();
|
||||||
|
|||||||
@@ -106,16 +106,18 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String leftDeckErrorMessage = gameType.getDecksFormat().getDeckConformanceProblem(pscLeft.getOriginalDeck());
|
if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) {
|
||||||
if (null != leftDeckErrorMessage) {
|
String leftDeckErrorMessage = gameType.getDecksFormat().getDeckConformanceProblem(pscLeft.getOriginalDeck());
|
||||||
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Left-side deck " + leftDeckErrorMessage, "Invalid deck", JOptionPane.ERROR_MESSAGE);
|
if (null != leftDeckErrorMessage) {
|
||||||
return;
|
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Left-side deck " + leftDeckErrorMessage, "Invalid deck", JOptionPane.ERROR_MESSAGE);
|
||||||
}
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
String rightDeckErrorMessage = gameType.getDecksFormat().getDeckConformanceProblem(pscRight.getOriginalDeck());
|
String rightDeckErrorMessage = gameType.getDecksFormat().getDeckConformanceProblem(pscRight.getOriginalDeck());
|
||||||
if (null != rightDeckErrorMessage) {
|
if (null != rightDeckErrorMessage) {
|
||||||
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Right-side deck " + rightDeckErrorMessage, "Invalid deck", JOptionPane.ERROR_MESSAGE);
|
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Right-side deck " + rightDeckErrorMessage, "Invalid deck", JOptionPane.ERROR_MESSAGE);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Lobby lobby = FServer.instance.getLobby();
|
Lobby lobby = FServer.instance.getLobby();
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import forge.gui.framework.FScreen;
|
|||||||
import forge.gui.framework.ICDoc;
|
import forge.gui.framework.ICDoc;
|
||||||
import forge.net.FServer;
|
import forge.net.FServer;
|
||||||
import forge.net.Lobby;
|
import forge.net.Lobby;
|
||||||
|
import forge.properties.ForgePreferences.FPref;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Controls the draft submenu in the home UI.
|
* Controls the draft submenu in the home UI.
|
||||||
@@ -103,10 +104,13 @@ public enum CSubmenuDraft implements ICDoc {
|
|||||||
"No deck", JOptionPane.ERROR_MESSAGE);
|
"No deck", JOptionPane.ERROR_MESSAGE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String errorMessage = gameType.getDecksFormat().getDeckConformanceProblem(humanDeck);
|
|
||||||
if (null != errorMessage) {
|
if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) {
|
||||||
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid deck", JOptionPane.ERROR_MESSAGE);
|
String errorMessage = gameType.getDecksFormat().getDeckConformanceProblem(humanDeck);
|
||||||
return;
|
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();
|
Singletons.getModel().getGauntletMini().resetGauntletDraft();
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ import forge.gui.framework.FScreen;
|
|||||||
import forge.gui.framework.ICDoc;
|
import forge.gui.framework.ICDoc;
|
||||||
import forge.item.PaperCard;
|
import forge.item.PaperCard;
|
||||||
import forge.item.InventoryItem;
|
import forge.item.InventoryItem;
|
||||||
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.util.ItemPool;
|
import forge.util.ItemPool;
|
||||||
import forge.util.storage.IStorage;
|
import forge.util.storage.IStorage;
|
||||||
|
|
||||||
@@ -129,10 +130,12 @@ public enum CSubmenuSealed implements ICDoc {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String errorMessage = gameType.getDecksFormat().getDeckConformanceProblem(human);
|
if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) {
|
||||||
if (null != errorMessage) {
|
String errorMessage = gameType.getDecksFormat().getDeckConformanceProblem(human);
|
||||||
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid deck", JOptionPane.ERROR_MESSAGE);
|
if (null != errorMessage) {
|
||||||
return;
|
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();
|
int matches = Singletons.getModel().getDecks().getSealed().get(human.getName()).getAiDecks().size();
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import forge.gui.framework.ICDoc;
|
|||||||
import forge.gui.toolbox.FList;
|
import forge.gui.toolbox.FList;
|
||||||
import forge.net.FServer;
|
import forge.net.FServer;
|
||||||
import forge.net.Lobby;
|
import forge.net.Lobby;
|
||||||
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.util.MyRandom;
|
import forge.util.MyRandom;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -125,12 +126,14 @@ public enum CSubmenuCommander implements ICDoc {
|
|||||||
GuiDialog.message("No deck selected for player " + (i + 1));
|
GuiDialog.message("No deck selected for player " + (i + 1));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String errorMessage = GameType.Commander.getDecksFormat().getDeckConformanceProblem(d);
|
if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) {
|
||||||
if (null != errorMessage) {
|
String errorMessage = GameType.Commander.getDecksFormat().getDeckConformanceProblem(d);
|
||||||
if(!problemDecks.contains(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);
|
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);
|
playerDecks.add(d);
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
/** Forge Card Game. */
|
|
||||||
package forge.item;
|
|
||||||
|
|
||||||
@@ -21,6 +21,8 @@ import java.io.File;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
import com.google.common.base.Predicates;
|
import com.google.common.base.Predicates;
|
||||||
@@ -43,7 +45,6 @@ import forge.quest.data.QuestAchievements;
|
|||||||
import forge.quest.data.QuestAssets;
|
import forge.quest.data.QuestAssets;
|
||||||
import forge.quest.data.QuestData;
|
import forge.quest.data.QuestData;
|
||||||
import forge.quest.data.QuestPreferences.DifficultyPrefs;
|
import forge.quest.data.QuestPreferences.DifficultyPrefs;
|
||||||
import forge.quest.io.PreconReader;
|
|
||||||
import forge.quest.io.QuestChallengeReader;
|
import forge.quest.io.QuestChallengeReader;
|
||||||
import forge.util.storage.IStorage;
|
import forge.util.storage.IStorage;
|
||||||
import forge.util.storage.StorageBase;
|
import forge.util.storage.StorageBase;
|
||||||
@@ -169,18 +170,24 @@ public class QuestController {
|
|||||||
this.currentEvent = currentEvent;
|
this.currentEvent = currentEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the precons.
|
|
||||||
*
|
|
||||||
* @return QuestPreconManager
|
|
||||||
*/
|
|
||||||
public static IStorage<PreconDeck> getPrecons() {
|
public static IStorage<PreconDeck> getPrecons() {
|
||||||
if (null == preconManager) {
|
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;
|
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.
|
* TODO: Write javadoc for this method.
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ import com.google.common.collect.Iterables;
|
|||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.card.BoosterGenerator;
|
|
||||||
import forge.card.BoosterSlots;
|
import forge.card.BoosterSlots;
|
||||||
import forge.card.CardEdition;
|
import forge.card.CardEdition;
|
||||||
import forge.card.CardEditionPredicates;
|
import forge.card.CardEditionPredicates;
|
||||||
@@ -516,7 +515,7 @@ public final class QuestUtilCards {
|
|||||||
private void generatePreconsInShop(final int count) {
|
private void generatePreconsInShop(final int count) {
|
||||||
final List<PreconDeck> meetRequirements = new ArrayList<PreconDeck>();
|
final List<PreconDeck> meetRequirements = new ArrayList<PreconDeck>();
|
||||||
for (final PreconDeck deck : QuestController.getPrecons()) {
|
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()))) {
|
&& (null == qc.getFormat() || qc.getFormat().isSetLegal(deck.getEdition()))) {
|
||||||
meetRequirements.add(deck);
|
meetRequirements.add(deck);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
|
||||||
*/
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -19,7 +19,6 @@ package forge.view;
|
|||||||
|
|
||||||
|
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.card.cardfactory.CardStorageReader;
|
|
||||||
import forge.net.FServer;
|
import forge.net.FServer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
1
pom.xml
1
pom.xml
@@ -432,7 +432,6 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-deploy-plugin</artifactId>
|
<artifactId>maven-deploy-plugin</artifactId>
|
||||||
<version>2.8.1</version>
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.maven.wagon</groupId>
|
<groupId>org.apache.maven.wagon</groupId>
|
||||||
|
|||||||
Reference in New Issue
Block a user