From ab0f24d97d848d979b09c7b0d14a6a6a8a33073c Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Wed, 14 Sep 2011 09:40:34 +0000 Subject: [PATCH] cardSet's members are finalized M10-Booster added to quest cardshop (experimental and non-functional yet) BoosterGenerator uses now rare-slots together with explicit numbers for rares and mythics ItemPool has to be parametrized by Class (unfortunatelly java erases types of generics) --- .gitattributes | 3 + src/main/java/forge/BoosterGenerator.java | 163 +++++++----------- src/main/java/forge/ReadBoosterPack.java | 6 +- src/main/java/forge/ReadDraftBoosterPack.java | 4 +- src/main/java/forge/card/CardSet.java | 8 +- src/main/java/forge/deck/Deck.java | 4 +- .../forge/game/limited/BoosterDraft_1.java | 4 +- .../java/forge/game/limited/SealedDeck.java | 4 +- .../forge/gui/deckeditor/DeckDisplay.java | 1 + .../forge/gui/deckeditor/DeckEditorBase.java | 11 +- .../forge/gui/deckeditor/DeckEditorMenu.java | 4 +- .../forge/gui/deckeditor/DeckEditorQuest.java | 2 +- .../gui/deckeditor/DeckEditorQuestMenu.java | 6 +- .../forge/gui/deckeditor/DeckEditorShop.java | 6 +- .../forge/gui/deckeditor/PresetColumns.java | 5 +- .../java/forge/gui/deckeditor/TableModel.java | 5 +- .../forge/gui/deckeditor/TableWithCards.java | 2 +- src/main/java/forge/item/Booster.java | 43 +++++ src/main/java/forge/item/CardPrinted.java | 2 +- .../java/forge/item/InventoryItemFromSet.java | 14 ++ src/main/java/forge/item/ItemPool.java | 25 ++- src/main/java/forge/item/ItemPoolView.java | 5 +- src/main/java/forge/item/package-info.java | 2 + src/main/java/forge/quest/data/QuestData.java | 10 +- .../java/forge/quest/data/QuestDataIO.java | 53 ++++-- .../java/forge/quest/data/QuestUtilCards.java | 6 +- 26 files changed, 236 insertions(+), 162 deletions(-) create mode 100644 src/main/java/forge/item/Booster.java create mode 100644 src/main/java/forge/item/InventoryItemFromSet.java create mode 100644 src/main/java/forge/item/package-info.java diff --git a/.gitattributes b/.gitattributes index 41b2b660cfd..21eb8a5ffbd 100644 --- a/.gitattributes +++ b/.gitattributes @@ -9871,11 +9871,14 @@ src/main/java/forge/gui/input/Input_PayManaCostUtil.java svneol=native#text/plai src/main/java/forge/gui/input/Input_PayManaCost_Ability.java svneol=native#text/plain src/main/java/forge/gui/input/package-info.java svneol=native#text/plain src/main/java/forge/gui/package-info.java svneol=native#text/plain +src/main/java/forge/item/Booster.java -text src/main/java/forge/item/CardDb.java -text src/main/java/forge/item/CardPrinted.java -text src/main/java/forge/item/InventoryItem.java -text +src/main/java/forge/item/InventoryItemFromSet.java -text src/main/java/forge/item/ItemPool.java -text src/main/java/forge/item/ItemPoolView.java -text +src/main/java/forge/item/package-info.java -text src/main/java/forge/model/BuildInfo.java -text src/main/java/forge/model/FGameState.java -text src/main/java/forge/model/FModel.java svneol=native#text/plain diff --git a/src/main/java/forge/BoosterGenerator.java b/src/main/java/forge/BoosterGenerator.java index 27eba4d8673..0377bcdee0f 100644 --- a/src/main/java/forge/BoosterGenerator.java +++ b/src/main/java/forge/BoosterGenerator.java @@ -27,16 +27,14 @@ public class BoosterGenerator { private List mythics = new ArrayList(); private List specials = new ArrayList(); - private int iCommons = 0; - private int iUncommons = 0; - private int iRares = 0; - private int iMythics = 0; - private int iSpecials = 0; - private int numCommons = 0; private int numUncommons = 0; + // these two used when numbers of rares/myths is specified explicitly private int numRares = 0; private int numMythics = 0; + // this is used to specify number of slots for a rare - generator will decide by itself which to take + private int numRareSlots = 0; + private int numSpecials = 0; //private Random r = new Random(); @@ -44,18 +42,15 @@ public class BoosterGenerator { /** *

Constructor for BoosterGenerator.

*/ - public BoosterGenerator() { + public BoosterGenerator(Iterable cards) { numCommons = 11; numUncommons = 3; - numRares = 1; - numMythics = 0; + numRareSlots = 1; numSpecials = 0; - for (CardPrinted c : CardDb.instance().getAllUniqueCards()) { + for (CardPrinted c : cards) { addToRarity(c); } - - shuffleAll(); } /** @@ -70,13 +65,13 @@ public class BoosterGenerator { * @param ignoreRarity a boolean */ public BoosterGenerator(final String deckFile, final int nCommons, final int nUncommons, final int nRares, - final int nMythics, final int nSpecials, final boolean ignoreRarity) + final int nMythics, final int nSpecials, final boolean ignoreRarity) { numCommons = nCommons; numUncommons = nUncommons; numRares = nRares; - numMythics = nMythics; numSpecials = nSpecials; + numMythics = nMythics; //DeckManager dio = new DeckManager(ForgeProps.getFile(NewConstants.NEW_DECKS)); DeckManager dio = AllZone.getDeckManager(); @@ -91,7 +86,6 @@ public class BoosterGenerator { else { addToRarity(e.getKey()); } } - shuffleAll(); } /** @@ -103,7 +97,6 @@ public class BoosterGenerator { numCommons = 0; numUncommons = 0; numRares = 0; - numMythics = 0; numSpecials = 0; List setsList = Arrays.asList(new String[]{setCode}); @@ -114,8 +107,6 @@ public class BoosterGenerator { addToRarity(c); } - shuffleAll(); - ArrayList bpData = FileUtil.readFile("res/boosterdata/" + setCode + ".pack"); for (String line : bpData) { @@ -124,9 +115,7 @@ public class BoosterGenerator { } else if (line.startsWith("Uncommons:")) { numUncommons = Integer.parseInt(line.substring(10)); } else if (line.startsWith("Rares:")) { - numRares = Integer.parseInt(line.substring(6)); - } else if (line.startsWith("Mythics:")) { - numMythics = Integer.parseInt(line.substring(8)); + numRareSlots = Integer.parseInt(line.substring(6)); } else if (line.startsWith("Specials:")) { numSpecials = Integer.parseInt(line.substring(9)); } @@ -137,32 +126,61 @@ public class BoosterGenerator { System.out.println("numCommons: " + numCommons); System.out.println("numUncommons: " + numUncommons); System.out.println("numRares: " + numRares); - System.out.println("numMythics: " + numMythics); System.out.println("numSpecials: " + numSpecials); } } - /** - *

shuffleAll.

- */ - private void shuffleAll() { - - if (!commons.isEmpty()) { Collections.shuffle(commons, MyRandom.random); } - if (!uncommons.isEmpty()) { Collections.shuffle(uncommons, MyRandom.random); } - if (!rares.isEmpty()) { Collections.shuffle(rares, MyRandom.random); } - if (!mythics.isEmpty()) { Collections.shuffle(mythics, MyRandom.random); } - if (!specials.isEmpty()) { Collections.shuffle(specials, MyRandom.random); } - - if (Constant.Runtime.DevMode[0]) { - System.out.println("commons.size: " + commons.size()); - System.out.println("uncommons.size: " + uncommons.size()); - System.out.println("rares.size: " + rares.size()); - System.out.println("mythics.size: " + mythics.size()); - System.out.println("specials.size: " + specials.size()); + private List pickRandomCards(List source, int count) + { + List result = new ArrayList(count); + if (count <= 0 || source == null || source.isEmpty()) { return result; } + + int listSize = source.size(); + int index = Integer.MAX_VALUE; + for (int iCard = 0; iCard < count; iCard++) { + if (index >= listSize) { + Collections.shuffle(source, MyRandom.random); + index = 0; + } + result.add(source.get(index)); + index++; } + return result; } + private List pickRandomRaresOrMythics(List rares, List mythics, int count) + { + List result = new ArrayList(count); + int raresSize = rares == null ? 0 : rares.size(); + int mythicsSize = mythics == null ? 0 : mythics.size(); + if (count <= 0 || raresSize == 0) { return result; } + + int indexRares = Integer.MAX_VALUE; + int indexMythics = Integer.MAX_VALUE; + for (int iCard = 0; iCard < count; iCard++) { + boolean takeMythic = mythicsSize > 0 && MyRandom.random.nextInt(8) <= 1; + if (takeMythic) { + if (indexRares >= raresSize) { + Collections.shuffle(mythics, MyRandom.random); + indexMythics = 0; + } + result.add(mythics.get(indexMythics)); + indexMythics++; + } + else + { + if (indexRares >= raresSize) { + Collections.shuffle(rares, MyRandom.random); + indexRares = 0; + } + result.add(rares.get(indexRares)); + indexRares++; + } + } + return result; + } + /** *

getBoosterPack.

* @@ -171,65 +189,18 @@ public class BoosterGenerator { public final List getBoosterPack() { List temp = new ArrayList(); - int i = 0; - - if (commons.size() > numCommons) { - for (i = 0; i < numCommons; i++) { - if (iCommons >= commons.size()) { - iCommons = 0; - } - - temp.add(commons.get(iCommons++)); - } + temp.addAll(pickRandomCards(commons, numCommons)); + temp.addAll(pickRandomCards(uncommons, numUncommons)); + // You can specify number of rare-slots or number of rares and mythics explicitly... or both, but they'll sum up + if (numRareSlots > 0) { + temp.addAll(pickRandomRaresOrMythics(rares, mythics, numRareSlots)); } - - if (uncommons.size() > numUncommons) { - for (i = 0; i < numUncommons; i++) { - if (iUncommons >= uncommons.size()) { - iUncommons = 0; - } - - temp.add(uncommons.get(iUncommons++)); - } - } - - for (i = 0; i < numRares; i++) { - if (numMythics > 0) { - if (mythics.size() > numMythics) { - if (MyRandom.random.nextInt(8) <= 1) { - if (iMythics >= mythics.size()) { - iMythics = 0; - } - - temp.add(mythics.get(iMythics++)); - } else { - if (iRares >= rares.size()) { - iRares = 0; - } - - temp.add(rares.get(iRares++)); - } - } - } else { - if (rares.size() > numRares) { - if (iRares >= rares.size()) { - iRares = 0; - } - - temp.add(rares.get(iRares++)); - } - } - } - - if (specials.size() > numSpecials) { - for (i = 0; i < numSpecials; i++) { - if (iSpecials >= specials.size()) { - iSpecials = 0; - } - - temp.add(specials.get(iSpecials++)); - } + if (numRares > 0 || numMythics > 0) { + temp.addAll(pickRandomCards(rares, numRares)); + temp.addAll(pickRandomCards(mythics, numMythics)); } + + temp.addAll(pickRandomCards(specials, numSpecials)); return temp; } diff --git a/src/main/java/forge/ReadBoosterPack.java b/src/main/java/forge/ReadBoosterPack.java index 93bbb7041bb..4505025ac4b 100644 --- a/src/main/java/forge/ReadBoosterPack.java +++ b/src/main/java/forge/ReadBoosterPack.java @@ -55,7 +55,7 @@ public class ReadBoosterPack implements NewConstants { * @return a {@link forge.CardList} object. */ public ItemPoolView getBoosterPack5() { - ItemPool list = new ItemPool(); + ItemPool list = new ItemPool(CardPrinted.class); for (int i = 0; i < 5; i++) { list.addAll(getBoosterPack()); } addBasicLands(list, 20); @@ -92,7 +92,7 @@ public class ReadBoosterPack implements NewConstants { * @return a {@link forge.CardList} object. */ public ItemPoolView getBoosterPack() { - ItemPool pack = new ItemPool(); + ItemPool pack = new ItemPool(CardPrinted.class); pack.add(getRandomCard(rares)); @@ -126,7 +126,7 @@ public class ReadBoosterPack implements NewConstants { * @return a {@link forge.CardList} object. */ public ItemPoolView getShopCards(int totalPacks) { - ItemPool list = new ItemPool(); + ItemPool list = new ItemPool(CardPrinted.class); // Number of Packs granted diff --git a/src/main/java/forge/ReadDraftBoosterPack.java b/src/main/java/forge/ReadDraftBoosterPack.java index df76c94c431..111882ca942 100644 --- a/src/main/java/forge/ReadDraftBoosterPack.java +++ b/src/main/java/forge/ReadDraftBoosterPack.java @@ -46,7 +46,7 @@ public class ReadDraftBoosterPack implements NewConstants { } public ItemPoolView getBoosterPack5() { - ItemPool list = new ItemPool(); + ItemPool list = new ItemPool(CardPrinted.class); for (int i = 0; i < 5; i++) { list.addAll(getBoosterPack()); } addBasicLands(list, 20); @@ -82,7 +82,7 @@ public class ReadDraftBoosterPack implements NewConstants { * @return a {@link forge.CardList} object. */ public final ItemPoolView getBoosterPack() { - ItemPool pack = new ItemPool(); + ItemPool pack = new ItemPool(CardPrinted.class); pack.add(getRandomCard(rareList)); diff --git a/src/main/java/forge/card/CardSet.java b/src/main/java/forge/card/CardSet.java index 05aa7f567d5..282e1aa765e 100644 --- a/src/main/java/forge/card/CardSet.java +++ b/src/main/java/forge/card/CardSet.java @@ -9,10 +9,10 @@ import net.slightlymagic.braids.util.lambda.Lambda1; * @version $Id: CardSet.java 9708 2011-08-09 19:34:12Z jendave $ */ public final class CardSet implements Comparable { // immutable - private int index; - private String code; - private String code2; - private String name; + private final int index; + private final String code; + private final String code2; + private final String name; public CardSet(final int index, final String name, final String code, final String code2) { this.code = code; diff --git a/src/main/java/forge/deck/Deck.java b/src/main/java/forge/deck/Deck.java index bbc8d6acd38..3db7883be34 100644 --- a/src/main/java/forge/deck/Deck.java +++ b/src/main/java/forge/deck/Deck.java @@ -41,8 +41,8 @@ public final class Deck implements Comparable, Serializable { *

Constructor for Deck.

*/ public Deck() { - main = new ItemPool(); - sideboard = new ItemPool(); + main = new ItemPool(CardPrinted.class); + sideboard = new ItemPool(CardPrinted.class); } /** diff --git a/src/main/java/forge/game/limited/BoosterDraft_1.java b/src/main/java/forge/game/limited/BoosterDraft_1.java index fce6ed6cdcf..869bf45132b 100644 --- a/src/main/java/forge/game/limited/BoosterDraft_1.java +++ b/src/main/java/forge/game/limited/BoosterDraft_1.java @@ -10,7 +10,9 @@ import forge.SetUtils; import forge.card.CardBlock; import forge.card.CardSet; import forge.deck.Deck; +import forge.deck.DeckManager; import forge.gui.GuiUtils; +import forge.item.CardDb; import forge.item.CardPrinted; import forge.item.ItemPool; import forge.item.ItemPoolView; @@ -70,7 +72,7 @@ public class BoosterDraft_1 implements BoosterDraft { draftFormat[0] = draftType; if (draftType.equals("Full")) { // Draft from all cards in Forge - BoosterGenerator bpFull = new BoosterGenerator(); + BoosterGenerator bpFull = new BoosterGenerator(CardDb.instance().getAllUniqueCards()); for (int i = 0; i < 3; i++) { packs.add(bpFull); } diff --git a/src/main/java/forge/game/limited/SealedDeck.java b/src/main/java/forge/game/limited/SealedDeck.java index 3a47e26ac9b..e1a947cb090 100644 --- a/src/main/java/forge/game/limited/SealedDeck.java +++ b/src/main/java/forge/game/limited/SealedDeck.java @@ -44,7 +44,7 @@ public class SealedDeck { public SealedDeck(String sealedType) { if (sealedType.equals("Full")) { - BoosterGenerator bpFull = new BoosterGenerator(); + BoosterGenerator bpFull = new BoosterGenerator(CardDb.instance().getAllUniqueCards()); for (int i = 0; i < 6; i++) packs.add(bpFull); @@ -182,7 +182,7 @@ public class SealedDeck { * @return a {@link forge.CardList} object. */ public ItemPool getCardpool() { - ItemPool pool = new ItemPool(); + ItemPool pool = new ItemPool(CardPrinted.class); for (int i = 0; i < packs.size(); i++) pool.addAllCards(packs.get(i).getBoosterPack()); diff --git a/src/main/java/forge/gui/deckeditor/DeckDisplay.java b/src/main/java/forge/gui/deckeditor/DeckDisplay.java index 37b719241c8..2421cb9b1f2 100644 --- a/src/main/java/forge/gui/deckeditor/DeckDisplay.java +++ b/src/main/java/forge/gui/deckeditor/DeckDisplay.java @@ -16,6 +16,7 @@ import forge.item.ItemPoolView; */ public interface DeckDisplay { void setDeck(ItemPoolView top, ItemPoolView bottom, GameType gameType); + void setItems(ItemPoolView topParam, ItemPoolView bottomParam, GameType gt); //top shows available card pool //if constructed, top shows all cards diff --git a/src/main/java/forge/gui/deckeditor/DeckEditorBase.java b/src/main/java/forge/gui/deckeditor/DeckEditorBase.java index af5b678495f..cd7245a862b 100644 --- a/src/main/java/forge/gui/deckeditor/DeckEditorBase.java +++ b/src/main/java/forge/gui/deckeditor/DeckEditorBase.java @@ -62,18 +62,24 @@ public abstract class DeckEditorBase extends JFrame implements DeckDisplay { g.setEnabled(false); } } - + public DeckEditorBase(GameType gametype) { gameType = gametype; } - + public void setDeck(ItemPoolView topParam, ItemPoolView bottomParam, GameType gt) { gameType = gt; top.setDeck(topParam); bottom.setDeck(bottomParam); } + public void setItems(ItemPoolView topParam, ItemPoolView bottomParam, GameType gt) { + gameType = gt; + top.setDeck(topParam); + bottom.setDeck(bottomParam); + } + public void updateDisplay() { top.setFilter(buildFilter()); } @@ -84,6 +90,7 @@ public abstract class DeckEditorBase extends JFrame implements DeckDisplay { } }; + /** This class is used for a feature: when you start typing card name, the list gets auto-filtered. */ protected class OnChangeTextUpdateDisplay implements DocumentListener { private void onChange() { if (isFiltersChangeFiringUpdate) { updateDisplay(); } } @Override public void insertUpdate(DocumentEvent e) { onChange(); } diff --git a/src/main/java/forge/gui/deckeditor/DeckEditorMenu.java b/src/main/java/forge/gui/deckeditor/DeckEditorMenu.java index 6a160441e74..abdb8f8fd46 100644 --- a/src/main/java/forge/gui/deckeditor/DeckEditorMenu.java +++ b/src/main/java/forge/gui/deckeditor/DeckEditorMenu.java @@ -147,7 +147,7 @@ public final class DeckEditorMenu extends JMenuBar implements NewConstants { // The only remaining reference to global variable! CardList random = new CardList(forge.AllZone.getCardFactory().getRandomCombinationWithoutRepetition(15 * 5)); - ItemPool cpRandom = new ItemPool(); + ItemPool cpRandom = new ItemPool(CardPrinted.class); for (Card c : random) { cpRandom.add(CardDb.instance().getCard(c)); } cpRandom.add(CardDb.instance().getCard("Forest")); cpRandom.add(CardDb.instance().getCard("Island")); @@ -166,7 +166,7 @@ public final class DeckEditorMenu extends JMenuBar implements NewConstants { GenerateConstructedDeck gen = new GenerateConstructedDeck(); - ItemPool generated = new ItemPool(); + ItemPool generated = new ItemPool(CardPrinted.class); for (Card c : gen.generateDeck()) { generated.add(CardDb.instance().getCard(c)); } deckDisplay.setDeck(null, generated, GameType.Constructed); } diff --git a/src/main/java/forge/gui/deckeditor/DeckEditorQuest.java b/src/main/java/forge/gui/deckeditor/DeckEditorQuest.java index cac7d081c23..c9655053465 100644 --- a/src/main/java/forge/gui/deckeditor/DeckEditorQuest.java +++ b/src/main/java/forge/gui/deckeditor/DeckEditorQuest.java @@ -99,7 +99,7 @@ public final class DeckEditorQuest extends DeckEditorBase implements NewConstant customMenu.setPlayerDeckName(deck.getName()); ItemPoolView bottomPool = deck.getMain(); - ItemPool cardpool = new ItemPool(); + ItemPool cardpool = new ItemPool(CardPrinted.class); cardpool.addAll(questData.getCards().getCardpool()); // remove bottom cards that are in the deck from the card pool diff --git a/src/main/java/forge/gui/deckeditor/DeckEditorQuestMenu.java b/src/main/java/forge/gui/deckeditor/DeckEditorQuestMenu.java index 3f89b557e49..50ef6ea4578 100644 --- a/src/main/java/forge/gui/deckeditor/DeckEditorQuestMenu.java +++ b/src/main/java/forge/gui/deckeditor/DeckEditorQuestMenu.java @@ -271,7 +271,7 @@ public class DeckEditorQuestMenu extends JMenuBar { questData.addDeck(newDeck); ItemPool cardpool = ItemPool.createFrom(questData.getCards().getCardpool(), CardPrinted.class); - ItemPool decklist = new ItemPool(); + ItemPool decklist = new ItemPool(CardPrinted.class); for (Entry s : newDeck.getMain()) { CardPrinted cp = s.getKey(); decklist.add(cp, s.getValue()); @@ -348,7 +348,7 @@ public class DeckEditorQuestMenu extends JMenuBar { private final ActionListener newDeckActionListener = new ActionListener() { public void actionPerformed(final ActionEvent a) { - deckDisplay.setDeck(questData.getCards().getCardpool().getView(), null, GameType.Quest); + deckDisplay.setItems(questData.getCards().getCardpool().getView(), null, GameType.Quest); setPlayerDeckName(""); } }; @@ -431,7 +431,7 @@ public class DeckEditorQuestMenu extends JMenuBar { questData.removeDeck(currentDeck.getName()); //show card pool - deckDisplay.setDeck(questData.getCards().getCardpool().getView(), null, GameType.Quest); + deckDisplay.setItems(questData.getCards().getCardpool().getView(), null, GameType.Quest); setPlayerDeckName(""); } diff --git a/src/main/java/forge/gui/deckeditor/DeckEditorShop.java b/src/main/java/forge/gui/deckeditor/DeckEditorShop.java index c7cfcd63e8d..70925cc6a29 100644 --- a/src/main/java/forge/gui/deckeditor/DeckEditorShop.java +++ b/src/main/java/forge/gui/deckeditor/DeckEditorShop.java @@ -88,15 +88,15 @@ public final class DeckEditorShop extends DeckEditorBase { multiplier = questData.getCards().getSellMutliplier(); - ItemPoolView forSale = questData.getCards().getShopList(); + ItemPoolView forSale = questData.getCards().getShopList(); if (forSale.isEmpty()) { questData.getCards().generateCardsInShop(); forSale = questData.getCards().getShopList(); } - ItemPoolView owned = questData.getCards().getCardpool().getView(); + ItemPoolView owned = questData.getCards().getCardpool().getView(); //newCardsList = questData.getCards().getNewCards(); - setDeck(forSale, owned, GameType.Quest); + setItems(forSale, owned, GameType.Quest); double multiPercent = multiplier * 100; NumberFormat formatter = new DecimalFormat("#0.00"); diff --git a/src/main/java/forge/gui/deckeditor/PresetColumns.java b/src/main/java/forge/gui/deckeditor/PresetColumns.java index 72188b64e83..26eeceb48dc 100644 --- a/src/main/java/forge/gui/deckeditor/PresetColumns.java +++ b/src/main/java/forge/gui/deckeditor/PresetColumns.java @@ -10,6 +10,7 @@ import forge.card.CardRarity; import forge.card.CardSet; import forge.item.CardPrinted; import forge.item.InventoryItem; +import forge.item.InventoryItemFromSet; /** * TODO: Write javadoc for this type. @@ -22,8 +23,8 @@ public abstract class PresetColumns { private static String toType(InventoryItem i) { return i instanceof CardPrinted ? ((CardPrinted) i).getCard().getType().toString() : i.getClass().toString(); } private static String toPTL(InventoryItem i) { return i instanceof CardPrinted ? ((CardPrinted) i).getCard().getPTorLoyalty() : ""; } private static CardRarity toRarity(InventoryItem i) { return i instanceof CardPrinted ? ((CardPrinted) i).getRarity() : CardRarity.Unknown; } - private static CardSet toSetCmp(InventoryItem i) { return i instanceof CardPrinted ? SetUtils.getSetByCode(((CardPrinted) i).getSet()) : CardSet.unknown; } - private static String toSetStr(InventoryItem i) { return i instanceof CardPrinted ? ((CardPrinted) i).getSet() : "n/a"; } + private static CardSet toSetCmp(InventoryItem i) { return i instanceof InventoryItemFromSet ? SetUtils.getSetByCode(((InventoryItemFromSet) i).getSet()) : CardSet.unknown; } + private static String toSetStr(InventoryItem i) { return i instanceof InventoryItemFromSet ? ((InventoryItemFromSet) i).getSet() : "n/a"; } private static Integer toAiCmp(InventoryItem i) { return i instanceof CardPrinted ? ((CardPrinted) i).getCard().getAiStatusComparable() : Integer.valueOf(-1); } private static String toAiStr(InventoryItem i) { return i instanceof CardPrinted ? ((CardPrinted) i).getCard().getAiStatus() : "n/a"; } diff --git a/src/main/java/forge/gui/deckeditor/TableModel.java b/src/main/java/forge/gui/deckeditor/TableModel.java index cec372d68f9..a5ea4a7fb94 100644 --- a/src/main/java/forge/gui/deckeditor/TableModel.java +++ b/src/main/java/forge/gui/deckeditor/TableModel.java @@ -91,12 +91,13 @@ public final class TableModel extends AbstractTableMode } } - private ItemPool data = new ItemPool(); + private ItemPool data; private final CardPanelBase cardDisplay; private final List> columns; private final SortOrders sortOrders = new SortOrders(); - public TableModel(final CardPanelBase cd, final List> columnsToShow) { + public TableModel(final CardPanelBase cd, final List> columnsToShow, Class cls) { + data = new ItemPool(cls); cardDisplay = cd; columns = columnsToShow; columns.get(4).isMinMaxApplied = false; diff --git a/src/main/java/forge/gui/deckeditor/TableWithCards.java b/src/main/java/forge/gui/deckeditor/TableWithCards.java index e8f8475b97c..fa77f32fd70 100644 --- a/src/main/java/forge/gui/deckeditor/TableWithCards.java +++ b/src/main/java/forge/gui/deckeditor/TableWithCards.java @@ -66,7 +66,7 @@ public final class TableWithCards { public void setup(final List> columns, final CardPanelBase cardView) { - model = new TableModel(cardView, columns); + model = new TableModel(cardView, columns, InventoryItem.class); model.addListeners(table); table.setModel(model); model.resizeCols(table); diff --git a/src/main/java/forge/item/Booster.java b/src/main/java/forge/item/Booster.java new file mode 100644 index 00000000000..1d27e6fa1a1 --- /dev/null +++ b/src/main/java/forge/item/Booster.java @@ -0,0 +1,43 @@ +package forge.item; + +import java.util.List; + +import forge.BoosterGenerator; +import forge.SetUtils; + +/** + * TODO: Write javadoc for this type. + * + */ +public class Booster implements InventoryItemFromSet { + + private final String cardSet; + private final String name; + + private List cards = null; + + public Booster(String set) { + cardSet = set; + name = SetUtils.getSetByCodeOrThrow(set).getName() + " booster"; + } + + @Override public String getSet() { return cardSet; } + @Override public String getName() { return name; } + + @Override public String getImageFilename() { + // TODO: images for boosters + return null; + } + + public List getCards() { + if (null == cards) + { + BoosterGenerator gen = new BoosterGenerator(cardSet); + cards = gen.getBoosterPack(); + // TODO: Add land here! + } + return cards; + } + + +} diff --git a/src/main/java/forge/item/CardPrinted.java b/src/main/java/forge/item/CardPrinted.java index 5241588370e..bed2f55f1ff 100644 --- a/src/main/java/forge/item/CardPrinted.java +++ b/src/main/java/forge/item/CardPrinted.java @@ -20,7 +20,7 @@ import forge.card.CardRules; * @author Forge * @version $Id: CardReference.java 9708 2011-08-09 19:34:12Z jendave $ */ -public final class CardPrinted implements Comparable, InventoryItem { +public final class CardPrinted implements Comparable, InventoryItemFromSet { // Reference to rules private final transient CardRules card; diff --git a/src/main/java/forge/item/InventoryItemFromSet.java b/src/main/java/forge/item/InventoryItemFromSet.java new file mode 100644 index 00000000000..b139a3e5b5a --- /dev/null +++ b/src/main/java/forge/item/InventoryItemFromSet.java @@ -0,0 +1,14 @@ +package forge.item; + +/** + * Interface to define a player's inventory may hold. + * Should include CardPrinted, Booster, Pets, Plants... etc + */ +public interface InventoryItemFromSet extends InventoryItem { + /** An inventory item has to provide a name. */ + String getName(); + /** An inventory item has to provide a picture. */ + String getImageFilename(); + /** An item belonging to a set should return its set as well*/ + String getSet(); +} diff --git a/src/main/java/forge/item/ItemPool.java b/src/main/java/forge/item/ItemPool.java index 6bfbff442bb..127a92383e9 100644 --- a/src/main/java/forge/item/ItemPool.java +++ b/src/main/java/forge/item/ItemPool.java @@ -12,16 +12,16 @@ import java.util.Map.Entry; public final class ItemPool extends ItemPoolView { // Constructors here - public ItemPool() { super(); } + public ItemPool(final Class cls) { super(cls); } @SuppressWarnings("unchecked") // conversion here must be safe - public ItemPool(final List names) { super(); addAllCards((Iterable) CardDb.instance().getCards(names)); } + public ItemPool(final List names, final Class cls) { super(cls); addAllCards((Iterable) CardDb.instance().getCards(names)); } @SuppressWarnings("unchecked") public static ItemPool createFrom(ItemPoolView from, Class clsHint) { - ItemPool result = new ItemPool(); + ItemPool result = new ItemPool(clsHint); if (from != null) { for (Entry e : from) { Tin srcKey = e.getKey(); @@ -35,8 +35,9 @@ public final class ItemPool extends ItemPoolView { @SuppressWarnings("unchecked") public static ItemPool - createFrom(Iterable from, Class clsHint) { - ItemPool result = new ItemPool(); + createFrom(Iterable from, Class clsHint) + { + ItemPool result = new ItemPool(clsHint); if (from != null) { for (Tin srcKey : from) { if (clsHint.isInstance(srcKey)) { @@ -48,7 +49,7 @@ public final class ItemPool extends ItemPoolView { } // get - public ItemPoolView getView() { return new ItemPoolView(Collections.unmodifiableMap(cards)); } + public ItemPoolView getView() { return new ItemPoolView(Collections.unmodifiableMap(cards), myClass); } // Cards manipulation public void add(final T card) { add(card, 1); } @@ -65,11 +66,17 @@ public final class ItemPool extends ItemPoolView { for (T cr : cards) { add(cr); } isListInSync = false; } - public void addAll(final Iterable> map) { - for (Entry e : map) { add(e.getKey(), e.getValue()); } + + @SuppressWarnings("unchecked") + public void addAll(final Iterable> map) { + for (Entry e : map) { + if (myClass.isInstance(e.getKey())) { + add((T) e.getKey(), e.getValue()); + } + } isListInSync = false; } - + public void remove(final T card) { remove(card, 1); } public void remove(final T card, final int amount) { int count = count(card); diff --git a/src/main/java/forge/item/ItemPoolView.java b/src/main/java/forge/item/ItemPoolView.java index 55e23d33685..8a65e160bce 100644 --- a/src/main/java/forge/item/ItemPoolView.java +++ b/src/main/java/forge/item/ItemPoolView.java @@ -42,11 +42,12 @@ public class ItemPoolView implements Iterable(); } - public ItemPoolView(final Map inMap) { cards = inMap; } + public ItemPoolView(final Class cls) { cards = new Hashtable(); myClass = cls; } + public ItemPoolView(final Map inMap, final Class cls) { cards = inMap; myClass = cls; } // Data members protected Map cards; + protected final Class myClass; // class does not keep this in runtime by itself // same thing as above, it was copied to provide sorting (needed by table views in deck editors) protected List> cardsListOrdered = new ArrayList>(); diff --git a/src/main/java/forge/item/package-info.java b/src/main/java/forge/item/package-info.java new file mode 100644 index 00000000000..72766023122 --- /dev/null +++ b/src/main/java/forge/item/package-info.java @@ -0,0 +1,2 @@ +/** Forge Card Game */ +package forge.item; diff --git a/src/main/java/forge/quest/data/QuestData.java b/src/main/java/forge/quest/data/QuestData.java index 11caa179ab9..09c1d82bc20 100644 --- a/src/main/java/forge/quest/data/QuestData.java +++ b/src/main/java/forge/quest/data/QuestData.java @@ -68,9 +68,9 @@ public final class QuestData { Map myDecks = new HashMap(); // Cards associated with quest - ItemPool cardPool = new ItemPool(); // player's belonging - ItemPool shopList = new ItemPool(); // the current shop list - ItemPool newCardList = new ItemPool(); // cards acquired since last game-win/loss + ItemPool cardPool = new ItemPool(InventoryItem.class); // player's belonging + ItemPool shopList = new ItemPool(InventoryItem.class); // the current shop list + ItemPool newCardList = new ItemPool(InventoryItem.class); // cards acquired since last game-win/loss // Quests history int questsPlayed; @@ -116,8 +116,8 @@ public final class QuestData { myRewards = new QuestUtilRewards(this); // to avoid NPE some pools will be created here if they are null - if (null == newCardList) { newCardList = new ItemPool(); } - if (null == shopList) { shopList = new ItemPool(); } + if (null == newCardList) { newCardList = new ItemPool(InventoryItem.class); } + if (null == shopList) { shopList = new ItemPool(InventoryItem.class); } } diff --git a/src/main/java/forge/quest/data/QuestDataIO.java b/src/main/java/forge/quest/data/QuestDataIO.java index 3e5d6f497d2..b8319862ce2 100644 --- a/src/main/java/forge/quest/data/QuestDataIO.java +++ b/src/main/java/forge/quest/data/QuestDataIO.java @@ -10,6 +10,7 @@ import com.thoughtworks.xstream.converters.UnmarshallingContext; import forge.error.ErrorViewer; import forge.game.GameType; +import forge.item.Booster; import forge.item.CardDb; import forge.item.CardPrinted; import forge.item.InventoryItem; @@ -222,50 +223,68 @@ public class QuestDataIO { return clasz.equals(ItemPool.class); } - private void writeCardRef(CardPrinted cref, HierarchicalStreamWriter writer) + private void write(CardPrinted cref, Integer count, HierarchicalStreamWriter writer) { + writer.startNode("card"); writer.addAttribute("c", cref.getName()); writer.addAttribute("s", cref.getSet()); if (cref.isFoil()) { writer.addAttribute("foil", "1"); } if (cref.getArtIndex() > 0) { writer.addAttribute("i", Integer.toString(cref.getArtIndex())); } - + writer.addAttribute("n", count.toString()); + writer.endNode(); } + + private void write(Booster booster, Integer count, HierarchicalStreamWriter writer) + { + writer.startNode("booster"); + writer.addAttribute("s", booster.getSet()); + writer.addAttribute("n", count.toString()); + writer.endNode(); + } + @Override public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) { @SuppressWarnings("unchecked") ItemPool pool = (ItemPool) source; for (Entry e : pool) { - if ( e.getKey() instanceof CardPrinted) - { - writer.startNode("card"); - writeCardRef((CardPrinted) e.getKey(), writer); - writer.addAttribute("n", e.getValue().toString()); - writer.endNode(); - } + InventoryItem item = e.getKey(); + Integer count = e.getValue(); + if (item instanceof CardPrinted) { + write((CardPrinted) item, count, writer); + } else if (item instanceof Booster) { + write((Booster) item, count, writer); + } } } @Override public Object unmarshal(final HierarchicalStreamReader reader, final UnmarshallingContext context) { - ItemPool result = new ItemPool(); + ItemPool result = new ItemPool(InventoryItem.class); while (reader.hasMoreChildren()) { reader.moveDown(); + String sCnt = reader.getAttribute("n"); + int cnt = StringUtils.isNumeric(sCnt) ? Integer.parseInt(sCnt) : 1; String nodename = reader.getNodeName(); + if("string".equals(nodename)) { - CardPrinted cp = CardDb.instance().getCard(reader.getValue()); - result.add(cp); - } else { // new format - CardPrinted cp = readCardPrinted(reader); - String sCnt = reader.getAttribute("n"); - int cnt = StringUtils.isNumeric(sCnt) ? Integer.parseInt(sCnt) : 1; - result.add(cp, cnt); + result.add(CardDb.instance().getCard(reader.getValue())); + } else if ("card".equals(nodename)) { // new format + result.add(readCardPrinted(reader), cnt); + } else if ("booster".equals(nodename)) { + result.add(readBooster(reader), cnt); } reader.moveUp(); } return result; } + + private Booster readBooster(final HierarchicalStreamReader reader) + { + String set = reader.getAttribute("s"); + return new Booster(set); + } private CardPrinted readCardPrinted(final HierarchicalStreamReader reader) { diff --git a/src/main/java/forge/quest/data/QuestUtilCards.java b/src/main/java/forge/quest/data/QuestUtilCards.java index 6c026969f96..d499e81542a 100644 --- a/src/main/java/forge/quest/data/QuestUtilCards.java +++ b/src/main/java/forge/quest/data/QuestUtilCards.java @@ -10,6 +10,7 @@ import net.slightlymagic.maxmtg.Predicate; import forge.ReadBoosterPack; import forge.card.CardRarity; import forge.deck.Deck; +import forge.item.Booster; import forge.item.CardDb; import forge.item.CardPrinted; import forge.item.InventoryItem; @@ -149,13 +150,14 @@ public final class QuestUtilCards { ItemPoolView fromBoosters = pack.getShopCards(totalPacks); q.shopList.clear(); q.shopList.addAll(fromBoosters); + q.shopList.add(new Booster("M10")); } - public ItemPool getCardpool() { + public ItemPool getCardpool() { return q.cardPool; } - public ItemPoolView getShopList() { + public ItemPoolView getShopList() { if (q.shopList.isEmpty()) { generateCardsInShop(); }