All deckeditors, decks, boosterdraft, quest switched to lightweight cardPrinted objects, have fun :)

Features dropped: glassPane on deckeditors, separate filter window in deckeditors.
This commit is contained in:
Maxmtg
2011-09-01 18:11:00 +00:00
parent 787b5059b5
commit 54c1b987d2
72 changed files with 4095 additions and 9524 deletions

34
.gitattributes vendored
View File

@@ -9514,7 +9514,6 @@ src/main/java/forge/CardListFilter.java svneol=native#text/plain
src/main/java/forge/CardListUtil.java svneol=native#text/plain
src/main/java/forge/CardPowerToughness.java svneol=native#text/plain
src/main/java/forge/CardReader.java svneol=native#text/plain
src/main/java/forge/CardShopTableModel.java svneol=native#text/plain
src/main/java/forge/CardUtil.java svneol=native#text/plain
src/main/java/forge/Card_Color.java svneol=native#text/plain
src/main/java/forge/Card_Type.java svneol=native#text/plain
@@ -9539,7 +9538,6 @@ src/main/java/forge/CopyFiles.java svneol=native#text/plain
src/main/java/forge/Counters.java svneol=native#text/plain
src/main/java/forge/CustomDraft.java svneol=native#text/plain
src/main/java/forge/DeckColors.java svneol=native#text/plain
src/main/java/forge/DeckDisplay.java svneol=native#text/plain
src/main/java/forge/DefaultPlayerZone.java svneol=native#text/plain
src/main/java/forge/Display.java svneol=native#text/plain
src/main/java/forge/EndOfCombat.java svneol=native#text/plain
@@ -9554,15 +9552,7 @@ src/main/java/forge/GameActionUtil.java svneol=native#text/plain
src/main/java/forge/GameEntity.java -text
src/main/java/forge/GuiDisplay4.java svneol=native#text/plain
src/main/java/forge/GuiDisplayUtil.java svneol=native#text/plain
src/main/java/forge/GuiFilter.java svneol=native#text/plain
src/main/java/forge/GuiFilterCheckBox.java svneol=native#text/plain
src/main/java/forge/GuiInput.java svneol=native#text/plain
src/main/java/forge/GuiQuestFilter.java svneol=native#text/plain
src/main/java/forge/Gui_BoosterDraft.java svneol=native#text/plain
src/main/java/forge/Gui_CardShop.java svneol=native#text/plain
src/main/java/forge/Gui_DeckEditor.java svneol=native#text/plain
src/main/java/forge/Gui_DeckEditorBase.java -text
src/main/java/forge/Gui_DeckEditor_Menu.java svneol=native#text/plain
src/main/java/forge/Gui_DownloadPictures_LQ.java svneol=native#text/plain
src/main/java/forge/Gui_DownloadPrices.java svneol=native#text/plain
src/main/java/forge/Gui_DownloadSetPictures_LQ.java svneol=native#text/plain
@@ -9571,8 +9561,6 @@ src/main/java/forge/Gui_MultipleBlockers4.java svneol=native#text/plain
src/main/java/forge/Gui_NewGame.java svneol=native#text/plain
src/main/java/forge/Gui_ProgressBarWindow.java svneol=native#text/plain
src/main/java/forge/Gui_QuestOptions.java svneol=native#text/plain
src/main/java/forge/Gui_Quest_DeckEditor.java svneol=native#text/plain
src/main/java/forge/Gui_Quest_DeckEditor_Menu.java svneol=native#text/plain
src/main/java/forge/Gui_WinLose.java svneol=native#text/plain
src/main/java/forge/HandSizeOp.java svneol=native#text/plain
src/main/java/forge/HttpUtil.java svneol=native#text/plain
@@ -9606,8 +9594,6 @@ src/main/java/forge/SimpleCombat.java svneol=native#text/plain
src/main/java/forge/Singletons.java svneol=native#text/plain
src/main/java/forge/StaticEffect.java svneol=native#text/plain
src/main/java/forge/StaticEffects.java svneol=native#text/plain
src/main/java/forge/TableModel.java svneol=native#text/plain
src/main/java/forge/TableSorter.java svneol=native#text/plain
src/main/java/forge/Time.java svneol=native#text/plain
src/main/java/forge/UndoCommand.java svneol=native#text/plain
src/main/java/forge/Upkeep.java svneol=native#text/plain
@@ -9781,6 +9767,24 @@ src/main/java/forge/gui/ListChooser.java svneol=native#text/plain
src/main/java/forge/gui/MultiLineLabel.java svneol=native#text/plain
src/main/java/forge/gui/MultiLineLabelUI.java svneol=native#text/plain
src/main/java/forge/gui/MultiPhaseProgressMonitorWithETA.java svneol=native#text/plain
src/main/java/forge/gui/deckeditor/CardColumnPresets.java -text
src/main/java/forge/gui/deckeditor/CardDisplay.java -text
src/main/java/forge/gui/deckeditor/CardShop.java svneol=native#text/plain
src/main/java/forge/gui/deckeditor/CardViewPanel.java -text
src/main/java/forge/gui/deckeditor/CardViewPanelLite.java -text
src/main/java/forge/gui/deckeditor/DeckDisplay.java svneol=native#text/plain
src/main/java/forge/gui/deckeditor/DeckEditor.java svneol=native#text/plain
src/main/java/forge/gui/deckeditor/DeckEditorBase.java -text
src/main/java/forge/gui/deckeditor/DeckEditorMenu.java svneol=native#text/plain
src/main/java/forge/gui/deckeditor/DeckEditorQuest.java svneol=native#text/plain
src/main/java/forge/gui/deckeditor/DeckEditorQuestMenu.java svneol=native#text/plain
src/main/java/forge/gui/deckeditor/FilterCheckBoxes.java -text
src/main/java/forge/gui/deckeditor/GuiFilterCheckBox.java svneol=native#text/plain
src/main/java/forge/gui/deckeditor/Gui_BoosterDraft.java svneol=native#text/plain
src/main/java/forge/gui/deckeditor/TableColumnInfo.java -text
src/main/java/forge/gui/deckeditor/TableModel.java svneol=native#text/plain
src/main/java/forge/gui/deckeditor/TableSorter.java svneol=native#text/plain
src/main/java/forge/gui/deckeditor/package-info.java -text
src/main/java/forge/gui/game/CardDetailPanel.java svneol=native#text/plain
src/main/java/forge/gui/game/CardPanel.java svneol=native#text/plain
src/main/java/forge/gui/game/CardPicturePanel.java svneol=native#text/plain
@@ -9899,11 +9903,9 @@ src/test/java/forge/GameActionTest.java svneol=native#text/plain
src/test/java/forge/GuiBoosterDraftTest.java svneol=native#text/plain
src/test/java/forge/GuiDownloadPicturesLQTest.java svneol=native#text/plain
src/test/java/forge/GuiDownloadSetPicturesLQTest.java svneol=native#text/plain
src/test/java/forge/GuiFilterTest.java svneol=native#text/plain
src/test/java/forge/GuiMigrateLocalMWSSetPicturesHQTest.java svneol=native#text/plain
src/test/java/forge/GuiMultipleBlockers4Test.java svneol=native#text/plain
src/test/java/forge/GuiProgressBarWindowTest.java svneol=native#text/plain
src/test/java/forge/GuiQuestFilterTest.java svneol=native#text/plain
src/test/java/forge/GuiQuestOptionsTest.java svneol=native#text/plain
src/test/java/forge/GuiWinLoseTest.java svneol=native#text/plain
src/test/java/forge/PanelTest.java svneol=native#text/plain

View File

@@ -1,5 +1,7 @@
package forge;
import forge.card.CardPoolView;
import forge.card.CardPrinted;
import forge.deck.Deck;
import java.util.Map;
import java.util.TreeMap;
@@ -16,14 +18,14 @@ public interface BoosterDraft {
*
* @return a {@link forge.CardList} object.
*/
public CardList nextChoice();
public CardPoolView nextChoice();
/**
* <p>setChoice.</p>
*
* @param c a {@link forge.Card} object.
*/
public void setChoice(Card c);
public void setChoice(CardPrinted c);
/**
* <p>hasNextChoice.</p>

View File

@@ -37,22 +37,22 @@ public class BoosterDraftAI {
/**
* <p>choose.</p>
*
* @param in_choose a {@link forge.CardList} object.
* @param chooseFrom a {@link forge.CardList} object.
* @param player a int.
* @return a {@link forge.CardList} object.
*/
public CardList choose(final CardList in_choose, int player) {
public Card choose(final CardList chooseFrom, int player) {
//in_choose should ONLY be on the RIGHT side of any equal sign
//only 1 card should be removed from in_choose
if (Constant.Runtime.DevMode[0])
System.out.println("Player[" + player + "] pack: " + in_choose.toString());
System.out.println("Player[" + player + "] pack: " + chooseFrom.toString());
CardList list = new CardList();
CardList wouldPick = new CardList();
boolean hasPicked = false;
Card pickedCard = new Card();
CardList AIPlayables = in_choose.filter(new CardListFilter() {
CardList AIPlayables = chooseFrom.filter(new CardListFilter() {
public boolean addCard(Card c) {
if (c.getSVar("RemAIDeck").equals("True") || c.getSVar("RemRandomDeck").equals("True"))
return false;
@@ -112,32 +112,32 @@ public class BoosterDraftAI {
if (typeList.size() > 0) {
typeList.sort(bestCreature);
typeList.reverse();
list.add(typeList.get(0));
wouldPick.add(typeList.get(0));
if (typeList.size() > 1)
list.add(typeList.get(1));
wouldPick.add(typeList.get(1));
}
typeList = colorList.getType("Instant");
typeList.addAll(colorList.getType("Sorcery"));
if (typeList.size() > 0) {
CardListUtil.sortCMC(typeList);
list.add(typeList.get(typeList.size() / 2));
wouldPick.add(typeList.get(typeList.size() / 2));
}
typeList = colorList.getType("Enchantment");
if (typeList.size() > 0) {
CardListUtil.sortCMC(typeList);
list.add(typeList.get(0));
wouldPick.add(typeList.get(0));
}
typeList = colorList.getType("Planeswalker");
if (typeList.size() > 0)
list.add(typeList.get(0));
wouldPick.add(typeList.get(0));
typeList = colorList.getType("Artifact");
if (typeList.size() > 0) {
CardListUtil.sortCMC(typeList);
list.add(typeList.get(0));
wouldPick.add(typeList.get(0));
}
} else {
@@ -177,7 +177,7 @@ public class BoosterDraftAI {
ArrayList<Ability_Mana> maList = typeList.get(i).getManaAbility();
for (int j = 0; j < maList.size(); j++) {
if (maList.get(j).canProduce(playerColors.get(player).Mana1) || maList.get(j).canProduce(playerColors.get(player).Mana2)) //|| maList.get(j).canProduce(playerColors.get(player).ManaS))
list.add(typeList.get(i));
wouldPick.add(typeList.get(i));
}
}
}
@@ -188,28 +188,27 @@ public class BoosterDraftAI {
if (!hasPicked) {
Random r = new Random();
if (list.size() > 0) {
list.shuffle();
pickedCard = list.get(r.nextInt(list.size()));
hasPicked = true;
if (wouldPick.size() > 0) {
wouldPick.shuffle();
pickedCard = wouldPick.get(r.nextInt(wouldPick.size()));
} else {
in_choose.shuffle();
pickedCard = in_choose.get(r.nextInt(in_choose.size()));
hasPicked = true;
chooseFrom.shuffle();
pickedCard = chooseFrom.get(r.nextInt(chooseFrom.size()));
}
hasPicked = true;
}
if (hasPicked) {
in_choose.remove(pickedCard);
chooseFrom.remove(pickedCard);
deck[player].add(pickedCard);
if (Constant.Runtime.DevMode[0])
System.out.println("Player[" + player + "] picked " + pickedCard.getName() + " (" + pickedCard.getManaCost() + ") " + pickedCard.getType().toString() + "\n");
}
return in_choose;
}//choose()
return pickedCard;
}
/*
I get some wierd error when I have this method, I don't know whats wrong

View File

@@ -1,11 +1,16 @@
package forge;
import forge.card.CardPool;
import forge.card.CardPoolView;
import forge.card.CardPrinted;
import forge.deck.Deck;
import forge.gui.GuiUtils;
import javax.swing.*;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class BoosterDraft_1 implements BoosterDraft {
private final BoosterDraftAI draftAI = new BoosterDraftAI();
@@ -14,7 +19,7 @@ public class BoosterDraft_1 implements BoosterDraft {
private static int stopCount = 45; //boosterPackSize * 3;//should total of 45
private int currentCount = 0;
private CardList[] pack;//size 8
private List<List<CardPrinted>> pack;//size 8
//private BoosterGenerator packs[] = {new BoosterGenerator(), new BoosterGenerator(), new BoosterGenerator()};
private ArrayList<BoosterGenerator> packs = new ArrayList<BoosterGenerator>();
private int packNum = 0;
@@ -206,13 +211,12 @@ public class BoosterDraft_1 implements BoosterDraft {
*
* @return a {@link forge.CardList} object.
*/
public CardList nextChoice() {
if (pack[getMod()].size() == 0)
public CardPoolView nextChoice() {
if (pack.get(getCurrentBoosterIndex()).size() == 0)
pack = get8BoosterPack();
computerChoose();
CardList list = pack[getMod()];
return list;
return new CardPool(pack.get(getCurrentBoosterIndex()));
}
/**
@@ -220,25 +224,12 @@ public class BoosterDraft_1 implements BoosterDraft {
*
* @return an array of {@link forge.CardList} objects.
*/
public CardList[] get8BoosterPack() {
CardList[] list = new CardList[]
{//nPlayers is 8
new CardList(),
new CardList(),
new CardList(),
new CardList(),
new CardList(),
new CardList(),
new CardList(),
new CardList(),
};
//ReadDraftBoosterPack pack = new ReadDraftBoosterPack();
public List<List<CardPrinted>> get8BoosterPack() {
List<List<CardPrinted>> list = new ArrayList<List<CardPrinted>>();
if (packNum < packs.size()) {
for (int i = 0; i < list.length; i++)
//list[i].addAll(pack.getBoosterPack());
list[i].addAll(packs.get(packNum).getBoosterPack());
for (int i = 0; i < 8; i++)
list.add(packs.get(packNum).getBoosterPack());
}
packNum++;
@@ -258,13 +249,29 @@ public class BoosterDraft_1 implements BoosterDraft {
}
private void computerChoose() {
int row[] = computerChoose[getMod()];
int row[] = computerChoose[getCurrentBoosterIndex()];
for (int i = 0; i < row.length; i++)
draftAI.choose(pack[row[i]], i);
for (int i = 0; i < row.length; i++) {
CardList forAi = new CardList();
List<CardPrinted> booster = pack.get(row[i]);
for (CardPrinted cr : booster) {
forAi.add(cr.toForgeCard());
}
// TODO: Please write this drafting code to work without heavy cards
Card aiPick = draftAI.choose(forAi, i);
String pickedName = aiPick.getName();
for (int pick = booster.size()-1; pick >= 0; pick--) {
CardPrinted cp = booster.get(pick);
if (cp.getName().equalsIgnoreCase(pickedName)) {
booster.remove(pick);
break;
}
}
}
}//computerChoose()
private int getMod() {
private int getCurrentBoosterIndex() {
return currentCount % nPlayers;
}
@@ -278,20 +285,20 @@ public class BoosterDraft_1 implements BoosterDraft {
}
/** {@inheritDoc} */
public void setChoice(Card c) {
CardList list = pack[getMod()];
public void setChoice(CardPrinted c) {
List<CardPrinted> thisBooster = pack.get(getCurrentBoosterIndex());
if (!list.contains(c))
throw new RuntimeException("BoosterDraft : setChoice() error - card not found - " + c + " - booster pack = " + list);
if (!thisBooster.contains(c))
throw new RuntimeException("BoosterDraft : setChoice() error - card not found - " + c + " - booster pack = " + thisBooster);
if (Constant.Runtime.UpldDrft[0]) {
for (int i = 0; i < list.size(); i++) {
Card cc = list.get(i);
String CnBk = cc.getName() + "|" + cc.getCurSetCode();
for (int i = 0; i < thisBooster.size(); i++) {
CardPrinted cc = thisBooster.get(i);
String CnBk = cc.getName() + "|" + cc.getSet();
float pickValue = 0;
if (cc.equals(c))
pickValue = (float)list.size() * (((((float)stopCount - (float)currentCount) * 100) / (float)stopCount) / 50);
pickValue = thisBooster.size() * (1f - ((float) currentCount) / stopCount) * 2f;
else
pickValue = 0;
@@ -305,7 +312,7 @@ public class BoosterDraft_1 implements BoosterDraft {
}
}
list.remove(c);
thisBooster.remove(c);
currentCount++;
}//setChoice()
}

View File

@@ -1,12 +1,20 @@
package forge;
import forge.card.CardDb;
import forge.card.CardPoolView;
import forge.card.CardPrinted;
import forge.deck.Deck;
import forge.deck.DeckManager;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map.Entry;
import java.util.Random;
import net.slightlymagic.maxmtg.Predicate;
/**
* <p>BoosterGenerator class.</p>
*
@@ -14,11 +22,11 @@ import java.util.Random;
* @version $Id$
*/
public class BoosterGenerator {
private CardList commons = new CardList();
private CardList uncommons = new CardList();
private CardList rares = new CardList();
private CardList mythics = new CardList();
private CardList specials = new CardList();
private List<CardPrinted> commons = new ArrayList<CardPrinted>();
private List<CardPrinted> uncommons = new ArrayList<CardPrinted>();
private List<CardPrinted> rares = new ArrayList<CardPrinted>();
private List<CardPrinted> mythics = new ArrayList<CardPrinted>();
private List<CardPrinted> specials = new ArrayList<CardPrinted>();
private int iCommons = 0;
private int iUncommons = 0;
@@ -44,47 +52,14 @@ public class BoosterGenerator {
numMythics = 0;
numSpecials = 0;
for (Card c : AllZone.getCardFactory()) {
SetInfo si = SetInfoUtil.getSetInfo_Code(c.getSets(), SetInfoUtil.getMostRecentSet(c.getSets()));
addToRarity(c, si);
for (CardPrinted c : CardDb.instance().getAllUniqueCards()) {
addToRarity(c);
}
shuffleAll();
}
/* //reduce cardpool to approximate the size of a small set (175) for better drafting in full mode
tList.clear();
for (int i=0; i<100; i++) // 8 x 11 x 3 commons = 264 cards with each card showing up about once per round
tList.add(commons.get(i));
commons.clear();
commons.addAll(tList);
tList.clear();
for (int i=0; i<50; i++) // 8 x 3 x 3 uncommons = 72 cards with some cards showing up twice
tList.add(uncommons.get(i));
uncommons.clear();
uncommons.addAll(tList);
tList.clear();
for (int i=0; i<25; i++) // 8 x 1 x 3 rares = 24 cards with no cards
tList.add(rares.get(i));
rares.clear();
rares.addAll(tList);
// don't worry about reducing the mythics
*/ }
/**
* <p>Constructor for BoosterGenerator.</p>
*
* @param DeckFile a {@link java.lang.String} object.
* @param nCommons a int.
* @param nUncommons a int.
* @param nRares a int.
* @param nMythics a int.
* @param nSpecials a int.
* @param ignoreRarity a boolean.
*/
public BoosterGenerator(String DeckFile, int nCommons, int nUncommons, int nRares, int nMythics, int nSpecials, boolean ignoreRarity) {
numCommons = nCommons;
numUncommons = nUncommons;
@@ -98,41 +73,10 @@ public class BoosterGenerator {
if (dPool == null)
throw new RuntimeException("BoosterGenerator : deck not found - " + DeckFile);
CardList cList = new CardList();
List<String> tList = dPool.getMain();
for (int i = 0; i < tList.size(); i++) {
String cardName = tList.get(i);
String setCode = "";
if (cardName.contains("|")) {
String s[] = cardName.split("\\|", 2);
cardName = s[0];
setCode = s[1];
}
Card c = AllZone.getCardFactory().getCard(cardName, AllZone.getHumanPlayer());
if (!setCode.equals(""))
c.setCurSetCode(setCode);
else if ((c.getSets().size() > 0)) // && card.getCurSetCode().equals(""))
c.setRandomSetCode();
cList.add(c);
}
for (int i = 0; i < cList.size(); i++) {
Card c = cList.get(i);
SetInfo si = null;
if (c.getCurSetCode().equals(""))
si = SetInfoUtil.getSetInfo_Code(c.getSets(), SetInfoUtil.getMostRecentSet(c.getSets()));
else
si = SetInfoUtil.getSetInfo_Code(c.getSets(), c.getCurSetCode());
if (ignoreRarity)
commons.add(c);
else
addToRarity(c, si);
CardPoolView tList = dPool.getMain();
for (Entry<CardPrinted, Integer> e : tList) {
if (ignoreRarity) { commons.add(e.getKey()); }
else { addToRarity(e.getKey()); }
}
shuffleAll();
@@ -143,31 +87,24 @@ public class BoosterGenerator {
*
* @param SetCode a {@link java.lang.String} object.
*/
public BoosterGenerator(final String SetCode) {
public BoosterGenerator(final String setCode) {
numCommons = 0;
numUncommons = 0;
numRares = 0;
numMythics = 0;
numSpecials = 0;
for (Card c : AllZone.getCardFactory()) {
SetInfo si = SetInfoUtil.getSetInfo_Code(c.getSets(), SetCode);
List<String> setsList = Arrays.asList(new String[]{ setCode });
Predicate<CardPrinted> filter = CardPrinted.Predicates.printedInSets(setsList, true);
List<CardPrinted> cardsInThisSet = filter.select(CardDb.instance().getAllCards());
if (si != null) {
c.setCurSetCode(SetCode);
Random r = new Random();
int n = si.PicCount;
if (n > 1)
c.setRandomPicture(r.nextInt(n - 1) + 1);
addToRarity(c, si);
}
for (CardPrinted c : cardsInThisSet) {
addToRarity(c);
}
shuffleAll();
ArrayList<String> bpData = FileUtil.readFile("res/boosterdata/" + SetCode + ".pack");
ArrayList<String> bpData = FileUtil.readFile("res/boosterdata/" + setCode + ".pack");
for (String line : bpData) {
if (line.startsWith("Commons:")) {
@@ -194,46 +131,16 @@ public class BoosterGenerator {
}
/**
* <p>addToRarity.</p>
*
* @param c a {@link forge.Card} object.
* @param si a {@link forge.SetInfo} object.
*/
private void addToRarity(Card c, SetInfo si) {
if (si != null) {
if (si.Rarity.equals("Common"))
commons.add(c);
else if (si.Rarity.equals("Uncommon"))
uncommons.add(c);
else if (si.Rarity.equals("Rare"))
rares.add(c);
else if (si.Rarity.equals("Mythic"))
mythics.add(c);
else if (si.Rarity.equals("Special"))
specials.add(c);
}
}
/**
* <p>shuffleAll.</p>
*/
private void shuffleAll() {
if (commons.size() > 0)
commons.shuffle();
if (uncommons.size() > 0)
uncommons.shuffle();
if (rares.size() > 0)
rares.shuffle();
if (mythics.size() > 0)
mythics.shuffle();
if (specials.size() > 0)
specials.shuffle();
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());
@@ -249,8 +156,8 @@ public class BoosterGenerator {
*
* @return a {@link forge.CardList} object.
*/
public CardList getBoosterPack() {
CardList temp = new CardList();
public List<CardPrinted> getBoosterPack() {
List<CardPrinted> temp = new ArrayList<CardPrinted>();
int i = 0;
@@ -317,4 +224,16 @@ public class BoosterGenerator {
public int getBoosterPackSize() {
return numCommons + numUncommons + numRares + numSpecials;
}
private void addToRarity(CardPrinted c) {
switch(c.getRarity()) {
case Common: commons.add(c); break;
case Uncommon: uncommons.add(c); break;
case Rare: rares.add(c); break;
case MythicRare: mythics.add(c); break;
case Special: specials.add(c); break;
default: return;
}
}
}

View File

@@ -1,398 +0,0 @@
package forge;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import java.awt.event.*;
import java.util.Arrays;
/**
* <p>CardShopTableModel class.</p>
*
* @author Forge
* @version $Id$
*/
class CardShopTableModel extends AbstractTableModel {
/** Constant <code>serialVersionUID=1L</code> */
private static final long serialVersionUID = 1L;
//holds 1 copy of each card, DOES NOT HOLD multiple cards with the same name
private CardList dataNoCopies = new CardList();
//holds multiple card
//example: if there are 4 Elvish Pipers, dataNoCopies has 1 copy, and dataCopies has 3
private CardList dataCopies = new CardList();
//used by sort(), holds old data to compare with sorted data, to see if any change was made
//private CardList oldList = new CardList();
private CardContainer cardDetail;
private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "R", "Value"};
//used to resort(), used when addCard(Card) is called
private int recentSortedColumn;
private boolean recentAscending;
/**
* <p>Constructor for CardShopTableModel.</p>
*
* @param cd a {@link forge.CardContainer} object.
*/
public CardShopTableModel(CardContainer cd) {
this(new CardList(), cd);
}
/**
* <p>Constructor for CardShopTableModel.</p>
*
* @param inData a {@link forge.CardList} object.
* @param in_cardDetail a {@link forge.CardContainer} object.
*/
public CardShopTableModel(CardList inData, CardContainer in_cardDetail) {
cardDetail = in_cardDetail;
//intialize dataNoCopies and dataCopies
addCard(inData);
}
/**
* <p>resizeCols.</p>
*
* @param table a {@link javax.swing.JTable} object.
*/
public void resizeCols(final JTable table) {
TableColumn column = null;
for (int i = 0; i < table.getColumnCount(); i++) {
column = table.getColumnModel().getColumn(i);
if (i == 0) {
column.setPreferredWidth(25); //make first column small
column.setMaxWidth(25);
} else if (i == 1) {
column.setPreferredWidth(190);
column.setMinWidth(190);
column.setMaxWidth(190);
} else if (i == 2) {
column.setPreferredWidth(85);
column.setMinWidth(85);
column.setMaxWidth(126);
} else if (i == 3) {
column.setPreferredWidth(58);
column.setMaxWidth(58);
} else if (i == 4) column.setPreferredWidth(130);
else if (i == 5) {
column.setPreferredWidth(32);
column.setMaxWidth(42);
} else if (i == 6) {
column.setPreferredWidth(20);
column.setMaxWidth(20);
} else if (i == 7) {
column.setPreferredWidth(40);
column.setMaxWidth(40);
}
}//for
/*for(int j = 0; j < table.getColumnCount(); j++) {
column = table.getColumnModel().getColumn(j);
//System.out.println("col Width:" + column.getPreferredWidth());
}*/
}
/**
* <p>clear.</p>
*/
public void clear() {
dataNoCopies.clear();
dataCopies.clear();
//fireTableDataChanged();
}
/**
* <p>getCards.</p>
*
* @return a {@link forge.CardList} object.
*/
public CardList getCards() {
CardList all = new CardList();
all.addAll(dataCopies);
all.addAll(dataNoCopies);
return all;
}
/**
* <p>removeCard.</p>
*
* @param c a {@link forge.Card} object.
*/
public void removeCard(Card c) {
//remove card from "dataCopies",
//if not found there, remove card from "dataNoCopies"
int index = findCardName(c.getName(), dataCopies);
if (index != -1) //found card name
dataCopies.remove(index);
else {
index = findCardName(c.getName(), dataNoCopies);
dataNoCopies.remove(index);
}
fireTableDataChanged();
}
/**
* <p>findCardName.</p>
*
* @param name a {@link java.lang.String} object.
* @param list a {@link forge.CardList} object.
* @return a int.
*/
private int findCardName(String name, CardList list) {
for (int i = 0; i < list.size(); i++)
if (list.get(i).getName().equals(name)) return i;
return -1;
}
/**
* <p>addCard.</p>
*
* @param c a {@link forge.Card} object.
*/
public void addCard(Card c) {
if (0 == countQuantity(c, dataNoCopies)) dataNoCopies.add(c);
else dataCopies.add(c);
}
/**
* <p>addCard.</p>
*
* @param c a {@link forge.CardList} object.
*/
public void addCard(CardList c) {
for (int i = 0; i < c.size(); i++)
addCard(c.get(i));
fireTableDataChanged();
}
/**
* <p>rowToCard.</p>
*
* @param row a int.
* @return a {@link forge.Card} object.
*/
public Card rowToCard(int row) {
return dataNoCopies.get(row);
}
/**
* <p>countQuantity.</p>
*
* @param c a {@link forge.Card} object.
* @return a int.
*/
private int countQuantity(Card c) {
return countQuantity(c, dataNoCopies) + countQuantity(c, dataCopies);
}
//CardList data is either class members "dataNoCopies" or "dataCopies"
/**
* <p>countQuantity.</p>
*
* @param c a {@link forge.Card} object.
* @param data a {@link forge.CardList} object.
* @return a int.
*/
private int countQuantity(Card c, CardList data) {
int count = 0;
for (int i = 0; i < data.size(); i++)
//are the card names the same?
if (data.get(i).getName().equals(c.getName())) count++;
return count;
}
/**
* <p>getRowCount.</p>
*
* @return a int.
*/
public int getRowCount() {
return dataNoCopies.size();
}
/**
* <p>getColumnCount.</p>
*
* @return a int.
*/
public int getColumnCount() {
return column.length;
}
/** {@inheritDoc} */
@Override
public String getColumnName(int n) {
return column[n];
}
/** {@inheritDoc} */
public Object getValueAt(int row, int column) {
return getColumn(dataNoCopies.get(row), column);
}
/**
* <p>Getter for the field <code>column</code>.</p>
*
* @param c a {@link forge.Card} object.
* @param column a int.
* @param column a int.
* @return a {@link java.lang.Object} object.
*/
private Object getColumn(Card c, int column) {
switch (column) {
case 0:
return Integer.valueOf(countQuantity(c));
case 1:
return c.getName();
case 2:
return c.getManaCost();
case 3:
return TableSorter.getColor(c);
case 4:
return GuiDisplayUtil.formatCardType(c);
case 5:
return c.isCreature() ? c.getBaseAttack() + "/" + c.getBaseDefense() : "";
case 6:
String rarity = c.getRarity();
if (rarity.length() > 0) rarity = rarity.substring(0, 1);
return rarity;
case 7:
long value = c.getValue();
return value;
default:
return "error";
}
}
/**
* <p>addListeners.</p>
*
* @param table a {@link javax.swing.JTable} object.
*/
public void addListeners(final JTable table) {
//updates card detail, listens to any key strokes
table.getSelectionModel().addListSelectionListener( new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent arg0) {
int row = table.getSelectedRow();
if (row != -1) {
cardDetail.setCard(dataNoCopies.get(row));
}
}
});
//sorts
MouseListener mouse = new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
TableColumnModel columnModel = table.getColumnModel();
int viewColumn = columnModel.getColumnIndexAtX(e.getX());
int column = table.convertColumnIndexToModel(viewColumn);
if (column != -1) {
//sort ascending
@SuppressWarnings("unused")
boolean change = sort(column, true);
//if(! change)
// sort(column, false);//sort descending
//fireTableDataChanged();
}
}//mousePressed()
};//MouseListener
table.getTableHeader().addMouseListener(mouse);
}//addCardListener()
//called by the GUI when a card is added to re-sort
/**
* <p>resort.</p>
*/
public void resort() {
sort(recentSortedColumn, recentAscending);
//this.fireTableDataChanged();
}
//returns true if any data changed positions
// @SuppressWarnings("unchecked")
// Arrays.sort
/**
* <p>sort.</p>
*
* @param column a int.
* @param ascending a boolean.
* @return a boolean.
*/
public boolean sort(int column, boolean ascending) {
//used by addCard() to resort the cards
recentSortedColumn = column;
recentAscending = ascending;
CardList all = new CardList();
all.addAll(dataNoCopies);
all.addAll(dataCopies);
TableSorter sorter = new TableSorter(all, column, ascending);
Card[] array = all.toArray();
Arrays.sort(array, sorter);
/*
//determine if any data changed position
boolean hasChanged = false;
CardList check = removeDuplicateNames(array);
for(int i = 0; i < check.size(); i++)
//do the card names match?
if(! check.get(i).getName().equals(dataNoCopies.get(i).getName()))
hasChanged = true;
*/
//clear everything, and add sorted data back into the model
dataNoCopies.clear();
dataCopies.clear();
addCard(new CardList(array));
//this value doesn't seem to matter:
//return hasChanged;
return true;
}//sort()
/*
private CardList removeDuplicateNames(Card[] c)
{
TreeSet check = new TreeSet();
CardList list = new CardList();
for(int i = 0; i < c.length; i++)
{
if(! check.contains(c[i].getName()))
{
check.add(c[i].getName());
list.add(c[i]);
}
}
return list;
}
*/
}//CardTableModel

View File

@@ -8,6 +8,9 @@ import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map.Entry;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
@@ -25,6 +28,13 @@ import javax.swing.border.BevelBorder;
import javax.swing.event.MouseInputAdapter;
import javax.swing.table.DefaultTableModel;
import forge.card.CardManaCost;
import forge.card.CardRules;
import forge.card.CardPoolView;
import forge.card.CardPrinted;
import forge.card.CardType;
import forge.gui.deckeditor.TableModel;
import net.miginfocom.swing.MigLayout;
/**
@@ -100,7 +110,7 @@ public class GUI_DeckAnalysis extends javax.swing.JDialog {
* @param g
* a {@link javax.swing.JFrame} object.
* @param tb
* a {@link forge.TableModel} object.
* a {@link forge.gui.deckeditor.TableModel} object.
*/
public GUI_DeckAnalysis(JFrame g, TableModel tb) {
super(g);
@@ -146,7 +156,7 @@ public class GUI_DeckAnalysis extends javax.swing.JDialog {
int cArtifact, cCreature, cEnchant, cInstant, cLandType, cPlaneswalker, cSorcery;
int mZero, mOne, mTwo, mThree, mFour, mFive, mSixMore;
float tManaCost;
Card c;
CardRules c;
cBlack = 0;
cBlue = 0;
cGreen = 0;
@@ -170,188 +180,103 @@ public class GUI_DeckAnalysis extends javax.swing.JDialog {
mFive = 0;
mSixMore = 0;
tManaCost = 0;
CardList cList;
cList = tModel.getCards();
for (int i = 0; i < cList.size(); i++) {
c = cList.getCard(i);
if (CardUtil.getColors(c).size() > 1) {
cMulticolor = cMulticolor + 1;
CardPoolView cardList = tModel.getCards();
for (Entry<CardPrinted, Integer> e : cardList) {
c = e.getKey().getCard();
int cnt = e.getValue();
if (c.getColor().isMulticolor()) {
cMulticolor = cMulticolor + cnt;
} else {
if (CardUtil.getColors(c).contains(Constant.Color.Black)) {
cBlack = cBlack + 1;
}
if (CardUtil.getColors(c).contains(Constant.Color.Blue)) {
cBlue = cBlue + 1;
}
if (CardUtil.getColors(c).contains(Constant.Color.Green)) {
cGreen = cGreen + 1;
}
if (CardUtil.getColors(c).contains(Constant.Color.Red)) {
cRed = cRed + 1;
}
if (CardUtil.getColors(c).contains(Constant.Color.White)) {
cWhite = cWhite + 1;
}
if (CardUtil.getColors(c).contains(Constant.Color.Colorless)) {
if (c.isLand()) {
cLand = cLand + 1;
} else {
cColorless = cColorless + 1;
}
}
}
}
for (int i = 0; i < cList.size(); i++) {
c = cList.getCard(i);
if (c.isArtifact()) {
cArtifact = cArtifact + 1;
}
if (c.isCreature()) {
cCreature = cCreature + 1;
}
if (c.isEnchantment()) {
cEnchant = cEnchant + 1;
}
if (c.isInstant()) {
cInstant = cInstant + 1;
}
if (c.isLand()) {
cLandType = cLandType + 1;
}
if (c.isPlaneswalker()) {
cPlaneswalker = cPlaneswalker + 1;
}
if (c.isSorcery()) {
cSorcery = cSorcery + 1;
if (c.getColor().isBlack()) { cBlack = cBlack + cnt; }
if (c.getColor().isBlue()) { cBlue = cBlue + cnt; }
if (c.getColor().isGreen()) { cGreen = cGreen + cnt; }
if (c.getColor().isRed()) { cRed = cRed + cnt; }
if (c.getColor().isWhite()) { cWhite = cWhite + cnt; }
if (c.getColor().isColorless()) {
if (c.getType().isLand()) { cLand = cLand + cnt; }
else { cColorless = cColorless + cnt; }
}
}
for (int i = 0; i < cList.size(); i++) {
c = cList.getCard(i);
if (CardUtil.getConvertedManaCost(c.getManaCost()) == 0) {
mZero = mZero + 1;
}
if (CardUtil.getConvertedManaCost(c.getManaCost()) == 1) {
mOne = mOne + 1;
}
if (CardUtil.getConvertedManaCost(c.getManaCost()) == 2) {
mTwo = mTwo + 1;
}
if (CardUtil.getConvertedManaCost(c.getManaCost()) == 3) {
mThree = mThree + 1;
}
if (CardUtil.getConvertedManaCost(c.getManaCost()) == 4) {
mFour = mFour + 1;
}
if (CardUtil.getConvertedManaCost(c.getManaCost()) == 5) {
mFive = mFive + 1;
}
if (CardUtil.getConvertedManaCost(c.getManaCost()) >= 6) {
mSixMore = mSixMore + 1;
}
// count card types
CardType cType = c.getType();
if (cType.isArtifact()) { cArtifact = cArtifact + cnt; }
if (cType.isCreature()) { cCreature = cCreature + cnt; }
if (cType.isEnchantment()) { cEnchant = cEnchant + cnt; }
if (cType.isInstant()) { cInstant = cInstant + cnt; }
if (cType.isLand()) { cLandType = cLandType + cnt; }
if (cType.isPlaneswalker()) { cPlaneswalker = cPlaneswalker + cnt; }
if (cType.isSorcery()) { cSorcery = cSorcery + cnt; }
int cmc = c.getManaCost().getCMC();
if (cmc == 0) { mZero = mZero + cnt;
} else if (cmc == 1) { mOne = mOne + cnt;
} else if (cmc == 2) { mTwo = mTwo + cnt;
} else if (cmc == 3) { mThree = mThree + cnt;
} else if (cmc == 4) { mFour = mFour + cnt;
} else if (cmc == 5) { mFive = mFive + 1;
} else if (cmc >= 6) { mSixMore = mSixMore + 1;
}
for (int i = 0; i < cList.size(); i++) {
c = cList.getCard(i);
tManaCost = tManaCost + CardUtil.getConvertedManaCost(c.getManaCost());
tManaCost = tManaCost + cmc * cnt;
}
BigDecimal aManaCost = new BigDecimal(tManaCost / cList.size());
int total = cardList.countAll();
BigDecimal aManaCost = new BigDecimal(tManaCost / total);
aManaCost = aManaCost.setScale(2, BigDecimal.ROUND_HALF_UP);
jLabelTotal.setText("Information about deck (total cards: " + cList.size() + "):");
jLabelTotal.setText("Information about deck (total cards: " + total + "):");
jLabelManaCost.setText("Mana cost (ACC:" + aManaCost + ")");
Color cr = new Color(100, 100, 100);
if (cBlack == 0) {
jLabelBlack.setForeground(cr);
}
jLabelBlack.setText("Black: " + cBlack + " (" + cBlack * 100 / cList.size() + "%)");
if (cBlue == 0) {
jLabelBlue.setForeground(cr);
}
jLabelBlue.setText("Blue: " + cBlue + " (" + cBlue * 100 / cList.size() + "%)");
if (cGreen == 0) {
jLabelGreen.setForeground(cr);
}
jLabelGreen.setText("Green: " + cGreen + " (" + cGreen * 100 / cList.size() + "%)");
if (cRed == 0) {
jLabelRed.setForeground(cr);
}
jLabelRed.setText("Red: " + cRed + " (" + cRed * 100 / cList.size() + "%)");
if (cWhite == 0) {
jLabelWhite.setForeground(cr);
}
jLabelWhite.setText("White: " + cWhite + " (" + cWhite * 100 / cList.size() + "%)");
if (cMulticolor == 0) {
jLabelMultiColor.setForeground(cr);
}
jLabelMultiColor.setText("Multicolor: " + cMulticolor + " (" + cMulticolor * 100 / cList.size()
+ "%)");
if (cColorless == 0) {
jLabelColorless.setForeground(cr);
}
jLabelColorless.setText("Colorless: " + cColorless + " (" + cColorless * 100 / cList.size() + "%)");
if (cLand == 0) {
jLabelLand.setForeground(cr);
}
jLabelLand.setText("Land: " + cLand + " (" + cLand * 100 / cList.size() + "%)");
if (cArtifact == 0) {
jLabelArtifact.setForeground(cr);
}
jLabelArtifact.setText("Artifact: " + cArtifact + " (" + cArtifact * 100 / cList.size() + "%)");
if (cCreature == 0) {
jLabelCreature.setForeground(cr);
}
jLabelCreature.setText("Creature: " + cCreature + " (" + cCreature * 100 / cList.size() + "%)");
if (cEnchant == 0) {
jLabelEnchant.setForeground(cr);
}
jLabelEnchant.setText("Enchant: " + cEnchant + " (" + cEnchant * 100 / cList.size() + "%)");
if (cInstant == 0) {
jLabelInstant.setForeground(cr);
}
jLabelInstant.setText("Instant: " + cInstant + " (" + cInstant * 100 / cList.size() + "%)");
if (cLandType == 0) {
jLabelLandType.setForeground(cr);
}
jLabelLandType.setText("Land: " + cLandType + " (" + cLandType * 100 / cList.size() + "%)");
if (cPlaneswalker == 0) {
jLabelPlaneswalker.setForeground(cr);
}
jLabelPlaneswalker.setText("Planeswalker: " + cPlaneswalker + " (" + cPlaneswalker * 100
/ cList.size() + "%)");
if (cSorcery == 0) {
jLabelSorcery.setForeground(cr);
}
jLabelSorcery.setText("Sorcery: " + cSorcery + " (" + cSorcery * 100 / cList.size() + "%)");
if (mZero == 0) {
jLabelZeroMana.setForeground(cr);
}
jLabelZeroMana.setText("Zero mana: " + mZero + " (" + mZero * 100 / cList.size() + "%)");
if (mOne == 0) {
jLabelOneMana.setForeground(cr);
}
jLabelOneMana.setText("One mana: " + mOne + " (" + mOne * 100 / cList.size() + "%)");
if (mTwo == 0) {
jLabelTwoMana.setForeground(cr);
}
jLabelTwoMana.setText("Two mana: " + mTwo + " (" + mTwo * 100 / cList.size() + "%)");
if (mThree == 0) {
jLabelThreeMana.setForeground(cr);
}
jLabelThreeMana.setText("Three mana :" + mThree + " (" + mThree * 100 / cList.size() + "%)");
if (mFour == 0) {
jLabelFourMana.setForeground(cr);
}
jLabelFourMana.setText("Four mana: " + mFour + " (" + mFour * 100 / cList.size() + "%)");
if (mFive == 0) {
jLabelFiveMana.setForeground(cr);
}
jLabelFiveMana.setText("Five mana: " + mFive + " (" + mFive * 100 / cList.size() + "%)");
if (mSixMore == 0) {
jLabelSixMana.setForeground(cr);
}
jLabelSixMana.setText("Six and more: " + mSixMore + " (" + mSixMore * 100 / cList.size() + "%)");
if (cBlack == 0) { jLabelBlack.setForeground(cr); }
jLabelBlack.setText(formatStat("Black", cBlack, total));
if (cBlue == 0) { jLabelBlue.setForeground(cr); }
jLabelBlue.setText(formatStat("Blue", cBlue, total));
if (cGreen == 0) { jLabelGreen.setForeground(cr); }
jLabelGreen.setText(formatStat("Green", cGreen, total));
if (cRed == 0) { jLabelRed.setForeground(cr); }
jLabelRed.setText(formatStat("Red", cRed, total));
if (cWhite == 0) { jLabelWhite.setForeground(cr); }
jLabelWhite.setText(formatStat("White", cWhite, total));
if (cMulticolor == 0) { jLabelMultiColor.setForeground(cr); }
jLabelMultiColor.setText(formatStat("Multicolor", cMulticolor, total));
if (cColorless == 0) { jLabelColorless.setForeground(cr); }
jLabelColorless.setText(formatStat("Colorless", cColorless, total));
if (cLand == 0) { jLabelLand.setForeground(cr); }
jLabelLand.setText(formatStat("Land", cLand, total));
if (cArtifact == 0) { jLabelArtifact.setForeground(cr); }
jLabelArtifact.setText(formatStat("Artifact", cArtifact, total));
if (cCreature == 0) { jLabelCreature.setForeground(cr); }
jLabelCreature.setText(formatStat("Creature", cCreature, total));
if (cEnchant == 0) { jLabelEnchant.setForeground(cr); }
jLabelEnchant.setText(formatStat("Enchant", cEnchant, total));
if (cInstant == 0) { jLabelInstant.setForeground(cr); }
jLabelInstant.setText(formatStat("Instant", cInstant, total));
if (cLandType == 0) { jLabelLandType.setForeground(cr); }
jLabelLandType.setText(formatStat("Land", cLandType, total));
if (cPlaneswalker == 0) { jLabelPlaneswalker.setForeground(cr); }
jLabelPlaneswalker.setText(formatStat("Planeswalker", cPlaneswalker, total));
if (cSorcery == 0) { jLabelSorcery.setForeground(cr); }
jLabelSorcery.setText(formatStat("Sorcery", cSorcery, total));
if (mZero == 0) { jLabelZeroMana.setForeground(cr); }
jLabelZeroMana.setText(formatStat("Zero mana", mZero, total));
if (mOne == 0) { jLabelOneMana.setForeground(cr); }
jLabelOneMana.setText(formatStat("One mana", mOne, total));
if (mTwo == 0) { jLabelTwoMana.setForeground(cr); }
jLabelTwoMana.setText(formatStat("Two mana", mTwo, total));
if (mThree == 0) { jLabelThreeMana.setForeground(cr); }
jLabelThreeMana.setText(formatStat("Three mana", mThree, total));
if (mFour == 0) { jLabelFourMana.setForeground(cr); }
jLabelFourMana.setText(formatStat("Four mana", mFour, total));
if (mFive == 0) { jLabelFiveMana.setForeground(cr); }
jLabelFiveMana.setText(formatStat("Five mana", mFive, total));
if (mSixMore == 0) { jLabelSixMana.setForeground(cr); }
jLabelSixMana.setText(formatStat("Six and more", mSixMore, total));
}
});
@@ -370,6 +295,11 @@ public class GUI_DeckAnalysis extends javax.swing.JDialog {
}
}
private String formatStat(String statName, int value, int deckSize )
{
return String.format("%s: %d (%f%%)", statName, value, 100f * value / deckSize);
}
/**
* <p>
* Getter for the field <code>jPanel1</code>.
@@ -991,31 +921,23 @@ public class GUI_DeckAnalysis extends javax.swing.JDialog {
* @return a {@link javax.swing.JList} object.
*/
private JList getJList1() {
CardList rList;
rList = tModel.getCards();
List<CardPrinted> rList = tModel.getCards().toFlatList();
Collections.shuffle(rList, MyRandom.random);
Collections.shuffle(rList, MyRandom.random);
rList.shuffle();
ListModel jList1Model;
if (jListFirstHand == null) {
if (rList.size() >= 40) {
jList1Model = new DefaultComboBoxModel(new String[] { rList.getCard(0).getName(),
rList.getCard(1).getName(), rList.getCard(2).getName(), rList.getCard(3).getName(),
rList.getCard(4).getName(), rList.getCard(5).getName(), rList.getCard(6).getName() });
jListFirstHand = new JList();
} else {
jList1Model = new DefaultComboBoxModel(new String[] { "Few cards." });
jListFirstHand = new JList();
}
} else {
if (rList.size() >= 40) {
jList1Model = new DefaultComboBoxModel(new String[] { rList.getCard(0).getName(),
rList.getCard(1).getName(), rList.getCard(2).getName(), rList.getCard(3).getName(),
rList.getCard(4).getName(), rList.getCard(5).getName(), rList.getCard(6).getName() });
jList1Model = new DefaultComboBoxModel(new String[] { rList.get(0).getName(),
rList.get(1).getName(), rList.get(2).getName(), rList.get(3).getName(),
rList.get(4).getName(), rList.get(5).getName(), rList.get(6).getName() });
} else {
jList1Model = new DefaultComboBoxModel(new String[] { "Few cards." });
}
}
jListFirstHand.setModel(jList1Model);
@@ -1108,10 +1030,9 @@ public class GUI_DeckAnalysis extends javax.swing.JDialog {
* @return a {@link javax.swing.JButton} object.
*/
private JButton getJButton1() {
CardList rList;
rList = tModel.getCards();
CardPoolView rList = tModel.getCards();
if (jButtonRegenerate == null) {
if (rList.size() >= 40) {
if (rList.countAll() >= 40) {
jButtonRegenerate = new JButton();
jButtonRegenerate.setLayout(null);
jButtonRegenerate.setText("Regenerate hand");
@@ -1186,15 +1107,14 @@ public class GUI_DeckAnalysis extends javax.swing.JDialog {
"6th", "7th" });
jTable1 = new JTable(dm);
CardList rList;
rList = tModel.getCards();
List<CardPrinted> rList = tModel.getCards().toFlatList();
String[] cardsName = new String[rList.size()];
int cCount;
float fCount;
float firstTurnF, secondTurnF, thirdTurnF, fourthTurnF, fivethTurnF, sixthTurnF, seventhTurnF;
for (int i = 0; i < rList.size(); i++) {
cardsName[i] = rList.getCard(i).getName();
cardsName[i] = rList.get(i).getName();
}
Arrays.sort(cardsName);
jTable1.setValueAt("Few cards.", 0, 0);

View File

@@ -1,6 +1,7 @@
package forge;
import forge.card.CardPrinted;
import forge.card.abilityFactory.AbilityFactory;
import forge.card.abilityFactory.AbilityFactory_Attach;
import forge.card.cardFactory.CardFactoryInterface;
@@ -25,6 +26,7 @@ import forge.properties.NewConstants.LANG.GameAction.GAMEACTION_TEXT;
import javax.swing.*;
import java.util.*;
import java.util.Map.Entry;
/**
* <p>GameAction class.</p>
@@ -1052,19 +1054,12 @@ public class GameAction {
Card.resetUniqueNumber();
Random generator = MyRandom.random;
for (Entry<CardPrinted, Integer> cardPile : humanDeck.getMain()) {
for (int i = 0; i < cardPile.getValue(); i++) {
String cardName = cardPile.getKey().getName();
String setCode = cardPile.getKey().getSet();
for (int i = 0; i < humanDeck.countMain(); i++) {
Card card = new Card();
String cardName = humanDeck.getMain(i);
String setCode = "";
if (cardName.contains("|")) {
String s[] = cardName.split("\\|", 2);
cardName = s[0];
setCode = s[1];
}
card = c.getCard(cardName, AllZone.getHumanPlayer());
Card card = c.getCard(cardName, AllZone.getHumanPlayer());
if (!setCode.equals(""))
card.setCurSetCode(setCode);
@@ -1084,6 +1079,8 @@ public class GameAction {
if (MyRandom.percentTrue(5))
card.setFoil(MyRandom.random.nextInt(9) + 1);
}
// foiling for cards explicitly foiled in deck
if (cardPile.getKey().isFoil()) { card.setFoil(MyRandom.random.nextInt(9) + 1); }
//System.out.println("human random number:" + card.getRandomPicture());
//}
@@ -1094,20 +1091,16 @@ public class GameAction {
AllZone.getTriggerHandler().registerTrigger(trig);
}
}
ArrayList<String> RAICards = new ArrayList<String>();
for (int i = 0; i < computerDeck.countMain(); i++) {
Card card = new Card();
String cardName = computerDeck.getMain(i);
String setCode = "";
if (cardName.contains("|")) {
String s[] = cardName.split("\\|", 2);
cardName = s[0];
setCode = s[1];
}
card = c.getCard(cardName, AllZone.getComputerPlayer());
ArrayList<String> RAICards = new ArrayList<String>();
for (Entry<CardPrinted, Integer> cardPile : computerDeck.getMain()) {
for (int i = 0; i < cardPile.getValue(); i++) {
String cardName = cardPile.getKey().getName();
String setCode = cardPile.getKey().getSet();
Card card = c.getCard(cardName, AllZone.getComputerPlayer());
//if(card.isBasicLand()) {
//String PC = card.getSVar("PicCount");
@@ -1137,6 +1130,7 @@ public class GameAction {
if (MyRandom.percentTrue(5))
card.setFoil(MyRandom.random.nextInt(9) + 1);
}
if (cardPile.getKey().isFoil()) { card.setFoil(MyRandom.random.nextInt(9) + 1); }
AllZone.getComputerLibrary().add(card);
@@ -1149,6 +1143,7 @@ public class GameAction {
//get card picture so that it is in the image cache
// ImageCache.getImage(card);
}
}
if (RAICards.size() > 0) {
StringBuilder sb = new StringBuilder("AI deck contains the following cards that it can't play or may be buggy:\n");

View File

@@ -35,6 +35,7 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.Observable;
import java.util.Observer;
@@ -77,6 +78,7 @@ import com.google.code.jyield.YieldUtils;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.XStreamException;
import forge.card.CardPrinted;
import forge.card.cardFactory.CardFactoryUtil;
import forge.error.ErrorViewer;
import forge.gui.ForgeAction;
@@ -1588,11 +1590,8 @@ public class GuiDisplay4 extends JFrame implements CardContainer, Display, NewCo
if (Constant.Runtime.HumanDeck[0].countMain() > 1) {
HashMap<String, Integer> deckMap = new HashMap<String, Integer>();
for (String s : Constant.Runtime.HumanDeck[0].getMain()){
if (deckMap.containsKey(s))
deckMap.put(s, (Integer)(deckMap.get(s)) + 1);
else
deckMap.put(s, 1);
for (Entry<CardPrinted, Integer> s : Constant.Runtime.HumanDeck[0].getMain()){
deckMap.put(s.getKey().getName(), s.getValue());
}
String nl = System.getProperty("line.separator");

View File

@@ -1,590 +0,0 @@
package forge;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.KeyAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
import javax.swing.event.MouseInputAdapter;
import net.miginfocom.swing.MigLayout;
/**
* @author Forge
* @version $Id$
*/
public class GuiFilter extends javax.swing.JDialog {
/**.
* Constant <code>serialVersionUID=-8475271235196182185L</code>
*/
private static final long serialVersionUID = -8475271235196182185L;
private JLabel nameLabel;
private JTextField nameTextField;
private JLabel cardTextLabel;
private JTextField cardTextField;
private JPanel colorPanel;
private JPanel bottomPanel;
private JCheckBox jCheckBoxColorless;
private JCheckBox jCheckBoxWhite;
private JCheckBox jCheckBoxRed;
private JCheckBox jCheckBoxGreen;
private JCheckBox jCheckBoxBlue;
private JLabel colorLabel;
private JLabel typeLabel;
private JCheckBox jCheckBoxPlaneswalker;
private JCheckBox jCheckBoxArtifact;
private JCheckBox jCheckBoxCreature;
private JCheckBox jCheckBoxEnchant;
private JCheckBox jCheckBoxInstant;
private JCheckBox jCheckBoxLand;
private JCheckBox jCheckBoxSorcery;
private JPanel typePanel;
private JCheckBox jCheckBoxBlack;
private JButton jButtonOk;
private JPanel topPanel;
private DeckDisplay deckDisplay;
private java.awt.Color gray = new java.awt.Color(192, 192, 192);
/**
* <p>
* Constructor for GUI_Filter.
* </p>
* @param g
* a {@link javax.swing.JFrame} object.
* @param display
* a {@link forge.DeckDisplay} object.
*/
public GuiFilter(final JFrame g, final DeckDisplay display) {
super(g);
deckDisplay = display;
initGUI();
}
private KeyAdapter fnKeyPressed = new KeyAdapter() {
@Override
public void keyPressed(final java.awt.event.KeyEvent e) {
if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
filterCardTable();
}
}
};
/**
* <p>
* initGUI.
* </p>
*/
private void initGUI() {
try {
this.isResizable();
getContentPane().setLayout(new MigLayout("fill"));
getContentPane().add(getTopPanel(), "span 3, wrap");
getContentPane().add(getColorPanel(), "aligny top, growy");
getContentPane().add(getTypePanel(), "aligny top, wrap");
getContentPane().add(getBottomPanel(), "align center, span 3");
setVisible(true);
Dimension screen = getToolkit().getScreenSize();
int x = (screen.width - 340) / 2;
int y = (screen.height - 500) / 2;
this.setBounds(x, y, 340, 500);
this.setResizable(true);
this.setTitle("Filter");
setIconImage(null);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(final WindowEvent arg0) {
Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay;
g.setEnabled(true);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
private JTextField getNameTextField() {
if (nameTextField == null) {
nameTextField = new JTextField(30);
nameTextField.addKeyListener(fnKeyPressed);
}
return nameTextField;
}
private JLabel getNameLabel() {
if (nameLabel == null) {
nameLabel = new JLabel();
nameLabel.setText("Name:");
nameLabel.setFont(new Font("Segoe UI", 0, 16));
}
return nameLabel;
}
private JPanel getTopPanel() {
if (topPanel == null) {
topPanel = new JPanel();
topPanel.setLayout(new MigLayout());
topPanel.add(getNameLabel(), "gap");
topPanel.add(getNameTextField(), "span 3, wrap");
topPanel.add(getCardTextLabel(), "gap");
topPanel.add(getCardTextField(), "span 3, wrap");
}
return topPanel;
}
/**
* <p>
* Getter for the field <code>colorPanel</code>.
* </p>
*
* @return a {@link javax.swing.JPanel} object.
*/
private JPanel getColorPanel() {
if (colorPanel == null) {
colorPanel = new JPanel();
colorPanel.setLayout(new MigLayout());
colorPanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
colorPanel.setBackground(gray);
colorPanel.add(getColorLabel(), "align, wrap");
colorPanel.add(getJCheckBoxBlack(), "wrap");
colorPanel.add(getJCheckBoxColorless(), "wrap");
colorPanel.add(getJCheckBoxWhite(), "wrap");
colorPanel.add(getJCheckBoxRed(), "wrap");
colorPanel.add(getJCheckBoxGreen(), "wrap");
colorPanel.add(getJCheckBoxBlue(), "wrap");
}
return colorPanel;
}
private JPanel getBottomPanel() {
if (bottomPanel == null) {
bottomPanel = new JPanel();
bottomPanel.setLayout(new MigLayout());
bottomPanel.add(getJButtonOk(), "align, span 3, grow");
}
return bottomPanel;
}
/**
* <p>
* Getter for the field <code>jCheckBoxBlue</code>.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxBlue() {
if (jCheckBoxBlue == null) { initCheckBox(jCheckBoxBlue = new JCheckBox(), "Blue" ); }
return jCheckBoxBlue;
}
/**
* <p>
* Getter for the field <code>jCheckBoxGreen</code>.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxGreen() {
if (jCheckBoxGreen == null) { initCheckBox(jCheckBoxGreen = new JCheckBox(), "Green"); }
return jCheckBoxGreen;
}
/**
* <p>
* Getter for the field <code>jCheckBoxRed</code>.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxRed() {
if (jCheckBoxRed == null) { initCheckBox(jCheckBoxRed = new JCheckBox(), "Red"); }
return jCheckBoxRed;
}
/**
* <p>
* Getter for the field <code>jCheckBoxWhite</code>.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxWhite() {
if (jCheckBoxWhite == null) { initCheckBox(jCheckBoxWhite = new JCheckBox(), "White"); }
return jCheckBoxWhite;
}
/**
* <p>
* Getter for the field <code>jCheckBoxColorless</code>.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxColorless() {
if (jCheckBoxColorless == null) { initCheckBox(jCheckBoxColorless = new JCheckBox(), "Colorless"); }
return jCheckBoxColorless;
}
/**
* <p>
* Getter for the field <code>jButtonOk</code>.
* </p>
*
* @return a {@link javax.swing.JButton} object.
*/
private JButton getJButtonOk() {
if (jButtonOk == null) {
jButtonOk = new JButton();
jButtonOk.setText("OK");
jButtonOk.addMouseListener(new MouseInputAdapter() {
@Override
public void mouseClicked(final MouseEvent e) {
filterCardTable();
}
});
}
return jButtonOk;
}
/**
* <p>
* Getter for the field <code>jCheckBoxBlack</code>.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxBlack() {
if (jCheckBoxBlack == null) { initCheckBox(jCheckBoxBlack = new JCheckBox(), "Black"); }
return jCheckBoxBlack;
}
/**
* <p>
* Getter for the field <code>typePanel</code>.
* </p>
*
* @return a {@link javax.swing.JPanel} object.
*/
private JPanel getTypePanel() {
if (typePanel == null) {
typePanel = new JPanel();
typePanel.setLayout(new MigLayout());
typePanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
typePanel.setBackground(gray);
typePanel.add(getTypeLabel(), "align, wrap");
typePanel.add(getJCheckBoxSorcery(), "wrap");
typePanel.add(getJCheckBoxPlaneswalker(), "wrap");
typePanel.add(getJCheckBoxLand(), "wrap");
typePanel.add(getJCheckBoxInstant(), "wrap");
typePanel.add(getJCheckBoxEnchant(), "wrap");
typePanel.add(getJCheckBoxCreature(), "wrap");
typePanel.add(getJCheckBoxArtifact(), "wrap");
}
return typePanel;
}
/**
* <p>
* Getter for the field <code>colorLabel</code>.
* </p>
*
* @return a {@link javax.swing.JLabel} object.
*/
private JLabel getColorLabel() {
if (colorLabel == null) {
colorLabel = new JLabel();
colorLabel.setText("Color");
colorLabel.setFont(new java.awt.Font("Segoe UI", 0, 14));
}
return colorLabel;
}
/**
* <p>
* Getter for the field <code>typeLabel</code>.
* </p>
*
* @return a {@link javax.swing.JLabel} object.
*/
private JLabel getTypeLabel() {
if (typeLabel == null) {
typeLabel = new JLabel();
typeLabel.setText("Type");
typeLabel.setFont(new java.awt.Font("Segoe UI", 0, 14));
}
return typeLabel;
}
/**
* <p>
* getJCheckBoxSorcery.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxSorcery() {
if (jCheckBoxSorcery == null) { initCheckBox(jCheckBoxSorcery = new JCheckBox(), "Sorcery"); }
return jCheckBoxSorcery;
}
/**
* <p>
* getJCheckBoxPlaneswalker.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxPlaneswalker() {
if (jCheckBoxPlaneswalker == null) { initCheckBox(jCheckBoxPlaneswalker = new JCheckBox(), "Planeswalker"); }
return jCheckBoxPlaneswalker;
}
/**
* <p>
* getJCheckBoxLand.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxLand() {
if (jCheckBoxLand == null) { initCheckBox(jCheckBoxLand = new JCheckBox(), "Land"); }
return jCheckBoxLand;
}
/**
* <p>
* getJCheckBoxInstant.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxInstant() {
if (jCheckBoxInstant == null) { initCheckBox(jCheckBoxInstant = new JCheckBox(), "Instant"); }
return jCheckBoxInstant;
}
/**
* <p>
* getJCheckBoxEnchant.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxEnchant() {
if (jCheckBoxEnchant == null) { initCheckBox(jCheckBoxEnchant = new JCheckBox(), "Enchant"); }
return jCheckBoxEnchant;
}
/**
* <p>
* getJCheckBoxCreature.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxCreature() {
if (jCheckBoxCreature == null) { initCheckBox(jCheckBoxCreature = new JCheckBox(), "Creature"); }
return jCheckBoxCreature;
}
/**
* <p>
* getJCheckBoxArtifact.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxArtifact() {
if (jCheckBoxArtifact == null) { initCheckBox(jCheckBoxArtifact = new JCheckBox(), "Artifact"); }
return jCheckBoxArtifact;
}
private void initCheckBox(final JCheckBox box, final String text) {
box.setText(text);
box.setSelected(true);
box.setBackground(gray);
box.addKeyListener(fnKeyPressed);
}
/**
* <p>
* getCardTextField.
* </p>
*
* @return a {@link javax.swing.JTextField} object.
*/
private JTextField getCardTextField() {
if (cardTextField == null) {
cardTextField = new JTextField(30);
cardTextField.addKeyListener(new java.awt.event.KeyAdapter() {
@Override
public void keyPressed(final java.awt.event.KeyEvent e) {
if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
filterCardTable();
}
}
});
}
return cardTextField;
}
/**
* <p>
* Getter for the field <code>cardTextLabel</code>.
* </p>
*
* @return a {@link javax.swing.JLabel} object.
*/
private JLabel getCardTextLabel() {
if (cardTextLabel == null) {
cardTextLabel = new JLabel();
cardTextLabel.setText("Card Text:");
cardTextLabel.setFont(new java.awt.Font("Segoe UI", 0, 16));
}
return cardTextLabel;
}
/**
* <p>
* FilterCardTable.
* </p>
*/
private void filterCardTable() {
String name = nameTextField.getText();
String cText = cardTextField.getText();
CardList filterCardList;
CardFilter filter = new CardFilter();
Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay;
g.blackCheckBox.setSelected(true);
g.blackCheckBox.setEnabled(true);
g.blueCheckBox.setSelected(true);
g.blueCheckBox.setEnabled(true);
g.greenCheckBox.setSelected(true);
g.greenCheckBox.setEnabled(true);
g.redCheckBox.setSelected(true);
g.redCheckBox.setEnabled(true);
g.whiteCheckBox.setSelected(true);
g.whiteCheckBox.setEnabled(true);
g.colorlessCheckBox.setSelected(true);
g.colorlessCheckBox.setEnabled(true);
g.artifactCheckBox.setSelected(true);
g.artifactCheckBox.setEnabled(true);
g.creatureCheckBox.setSelected(true);
g.creatureCheckBox.setEnabled(true);
g.enchantmentCheckBox.setSelected(true);
g.enchantmentCheckBox.setEnabled(true);
g.instantCheckBox.setSelected(true);
g.instantCheckBox.setEnabled(true);
g.landCheckBox.setSelected(true);
g.landCheckBox.setEnabled(true);
g.planeswalkerCheckBox.setSelected(true);
g.planeswalkerCheckBox.setEnabled(true);
g.sorceryCheckBox.setSelected(true);
g.sorceryCheckBox.setEnabled(true);
g.setEnabled(true);
if (name != "") {
if (cText != "") {
filterCardList = filter.cardListNameFilter(AllZone.getCardFactory(), name);
if (filterCardList.size() == 0) {
JOptionPane.showMessageDialog(null, "Sorry, cards with name: " + name + " not found.", "Filter",
JOptionPane.INFORMATION_MESSAGE);
} else {
filterCardList = filter.CardListTextFilter(filterCardList, cText);
if (filterCardList.size() == 0) {
JOptionPane.showMessageDialog(null, "Sorry, cards with text: " + cText + " not found.",
"Filter", JOptionPane.INFORMATION_MESSAGE);
} else {
if (!jCheckBoxBlack.isSelected()) {
filterCardList = filter.CardListColorFilter(filterCardList, "black");
g.blackCheckBox.setSelected(false);
g.blackCheckBox.setEnabled(false);
}
if (!jCheckBoxBlue.isSelected()) {
filterCardList = filter.CardListColorFilter(filterCardList, "blue");
g.blueCheckBox.setSelected(false);
g.blueCheckBox.setEnabled(false);
}
if (!jCheckBoxGreen.isSelected()) {
filterCardList = filter.CardListColorFilter(filterCardList, "green");
g.greenCheckBox.setSelected(false);
g.greenCheckBox.setEnabled(false);
}
if (!jCheckBoxRed.isSelected()) {
filterCardList = filter.CardListColorFilter(filterCardList, "red");
g.redCheckBox.setSelected(false);
g.redCheckBox.setEnabled(false);
}
if (!jCheckBoxWhite.isSelected()) {
filterCardList = filter.CardListColorFilter(filterCardList, "white");
g.whiteCheckBox.setSelected(false);
g.whiteCheckBox.setEnabled(false);
}
if (!jCheckBoxColorless.isSelected()) {
filterCardList = filter.CardListColorFilter(filterCardList, "colorless");
g.colorlessCheckBox.setSelected(false);
g.colorlessCheckBox.setEnabled(false);
}
if (!jCheckBoxArtifact.isSelected()) {
filterCardList = filter.CardListTypeFilter(filterCardList, "artifact");
g.artifactCheckBox.setSelected(false);
g.artifactCheckBox.setEnabled(false);
}
if (!jCheckBoxCreature.isSelected()) {
filterCardList = filter.CardListTypeFilter(filterCardList, "creature");
g.creatureCheckBox.setSelected(false);
g.creatureCheckBox.setEnabled(false);
}
if (!jCheckBoxEnchant.isSelected()) {
filterCardList = filter.CardListTypeFilter(filterCardList, "enchantment");
g.enchantmentCheckBox.setSelected(false);
g.enchantmentCheckBox.setEnabled(false);
}
if (!jCheckBoxInstant.isSelected()) {
filterCardList = filter.CardListTypeFilter(filterCardList, "instant");
g.instantCheckBox.setSelected(false);
g.instantCheckBox.setEnabled(false);
}
if (!jCheckBoxLand.isSelected()) {
filterCardList = filter.CardListTypeFilter(filterCardList, "land");
g.landCheckBox.setSelected(false);
g.landCheckBox.setEnabled(false);
}
if (!jCheckBoxPlaneswalker.isSelected()) {
filterCardList = filter.CardListTypeFilter(filterCardList, "planeswalker");
g.planeswalkerCheckBox.setSelected(false);
g.planeswalkerCheckBox.setEnabled(false);
}
if (!jCheckBoxSorcery.isSelected()) {
filterCardList = filter.CardListTypeFilter(filterCardList, "sorcery");
g.sorceryCheckBox.setSelected(false);
g.sorceryCheckBox.setEnabled(false);
}
deckDisplay.updateDisplay(filterCardList, deckDisplay.getBottom());
}
}
}
}
dispose();
}
}

View File

@@ -1,739 +0,0 @@
package forge;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
import javax.swing.event.MouseInputAdapter;
import net.miginfocom.swing.MigLayout;
/**
* @author Forge
* @version $Id$
*/
public class GuiQuestFilter extends JDialog {
/**.
* Constant <code>serialVersionUID=-8475271235196182185L</code>
*/
private static final long serialVersionUID = -8475271235196182185L;
private JLabel nameLabel;
private JTextField nameTextField;
private JLabel cardTextLabel;
private JTextField cardTextField;
private JPanel colorPanel;
private JPanel bottomPanel;
private JCheckBox jCheckBoxColorless;
private JCheckBox jCheckBoxWhite;
private JCheckBox jCheckBoxRed;
private JCheckBox jCheckBoxGreen;
private JCheckBox jCheckBoxBlue;
private JLabel colorLabel;
private JLabel typeLabel;
private JCheckBox jCheckBoxPlaneswalker;
private JCheckBox jCheckBoxArtifact;
private JCheckBox jCheckBoxCreature;
private JCheckBox jCheckBoxEnchant;
private JCheckBox jCheckBoxInstant;
private JCheckBox jCheckBoxLand;
private JCheckBox jCheckBoxSorcery;
private JPanel typePanel;
private JCheckBox jCheckBoxBlack;
private JButton jButtonOk;
private JPanel topPanel;
private DeckDisplay deckDisplay;
private java.awt.Color gray = new java.awt.Color(192, 192, 192);
/**
* <p>
* Constructor for GUI_Quest_Filter.
* </p>
*
* @param g
* a {@link javax.swing.JFrame} object.
* @param display
* a {@link forge.DeckDisplay} object.
*/
public GuiQuestFilter(final JFrame g, final DeckDisplay display) {
super(g);
deckDisplay = display;
initGUI();
}
/**
* <p>
* initGUI.
* </p>
*/
private void initGUI() {
try {
this.isResizable();
getContentPane().setLayout(new MigLayout("fill"));
getContentPane().add(getTopPanel(), "span 3, wrap");
getContentPane().add(getColorPanel(), "aligny top, growy");
getContentPane().add(getTypePanel(), "aligny top, wrap");
getContentPane().add(getBottomPanel(), "align center, span 3");
setVisible(true);
Dimension screen = getToolkit().getScreenSize();
int x = (screen.width - 340) / 2;
int y = (screen.height - 500) / 2;
this.setBounds(x, y, 340, 500);
this.setResizable(true);
this.setTitle("Filter");
setIconImage(null);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(final WindowEvent arg0) {
Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay;
g.setEnabled(true);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
private JTextField getNameTextField() {
if (nameTextField == null) {
nameTextField = new JTextField(30);
nameTextField.addKeyListener(new java.awt.event.KeyAdapter() {
@Override
public void keyPressed(final java.awt.event.KeyEvent e) {
if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
filterCardTable();
}
}
});
}
return nameTextField;
}
private JLabel getNameLabel() {
if (nameLabel == null) {
nameLabel = new JLabel();
nameLabel.setText("Name:");
nameLabel.setFont(new Font("Segoe UI", 0, 16));
}
return nameLabel;
}
private JPanel getTopPanel() {
if (topPanel == null) {
topPanel = new JPanel();
topPanel.setLayout(new MigLayout());
topPanel.add(getNameLabel(), "gap");
topPanel.add(getNameTextField(), "span 3, wrap");
topPanel.add(getCardTextLabel(), "gap");
topPanel.add(getCardTextField(), "span 3, wrap");
}
return topPanel;
}
/**
* <p>
* Getter for the field <code>colorPanel</code>.
* </p>
*
* @return a {@link javax.swing.JPanel} object.
*/
private JPanel getColorPanel() {
if (colorPanel == null) {
colorPanel = new JPanel();
colorPanel.setLayout(new MigLayout());
colorPanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
colorPanel.setBackground(gray);
colorPanel.add(getColorLabel(), "align, wrap");
colorPanel.add(getJCheckBoxBlack(), "wrap");
colorPanel.add(getJCheckBoxColorless(), "wrap");
colorPanel.add(getJCheckBoxWhite(), "wrap");
colorPanel.add(getJCheckBoxRed(), "wrap");
colorPanel.add(getJCheckBoxGreen(), "wrap");
colorPanel.add(getJCheckBoxBlue(), "wrap");
}
return colorPanel;
}
private JPanel getBottomPanel() {
if (bottomPanel == null) {
bottomPanel = new JPanel();
bottomPanel.setLayout(new MigLayout());
bottomPanel.add(getJButtonOk(), "align, span 3, grow");
}
return bottomPanel;
}
/**
* <p>
* Getter for the field <code>jCheckBoxBlue</code>.
* </p>
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxBlue() {
if (jCheckBoxBlue == null) {
jCheckBoxBlue = new JCheckBox();
jCheckBoxBlue.setText("Blue");
jCheckBoxBlue.setSelected(true);
jCheckBoxBlue.setBackground(gray);
jCheckBoxBlue.addKeyListener(new java.awt.event.KeyAdapter() {
@Override
public void keyPressed(final java.awt.event.KeyEvent e) {
if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
filterCardTable();
}
}
});
}
return jCheckBoxBlue;
}
/**
* <p>
* Getter for the field <code>jCheckBoxGreen</code>.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxGreen() {
if (jCheckBoxGreen == null) {
jCheckBoxGreen = new JCheckBox();
jCheckBoxGreen.setText("Green");
jCheckBoxGreen.setSelected(true);
jCheckBoxGreen.setBackground(gray);
jCheckBoxGreen.addKeyListener(new java.awt.event.KeyAdapter() {
@Override
public void keyPressed(final java.awt.event.KeyEvent e) {
if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
filterCardTable();
}
}
});
}
return jCheckBoxGreen;
}
/**
* <p>
* Getter for the field <code>jCheckBoxRed</code>.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxRed() {
if (jCheckBoxRed == null) {
jCheckBoxRed = new JCheckBox();
jCheckBoxRed.setText("Red");
jCheckBoxRed.setSelected(true);
jCheckBoxRed.setBackground(gray);
jCheckBoxRed.addKeyListener(new java.awt.event.KeyAdapter() {
@Override
public void keyPressed(final java.awt.event.KeyEvent e) {
if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
filterCardTable();
}
}
});
}
return jCheckBoxRed;
}
/**
* <p>
* Getter for the field <code>jCheckBoxWhite</code>.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxWhite() {
if (jCheckBoxWhite == null) {
jCheckBoxWhite = new JCheckBox();
jCheckBoxWhite.setText("White");
jCheckBoxWhite.setSelected(true);
jCheckBoxWhite.setBackground(gray);
jCheckBoxWhite.addKeyListener(new java.awt.event.KeyAdapter() {
@Override
public void keyPressed(final java.awt.event.KeyEvent e) {
if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
filterCardTable();
}
}
});
}
return jCheckBoxWhite;
}
/**
* <p>
* Getter for the field <code>jCheckBoxColorless</code>.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxColorless() {
if (jCheckBoxColorless == null) {
jCheckBoxColorless = new JCheckBox();
jCheckBoxColorless.setText("Colorless");
jCheckBoxColorless.setSelected(true);
jCheckBoxColorless.setBackground(gray);
jCheckBoxColorless.addKeyListener(new java.awt.event.KeyAdapter() {
@Override
public void keyPressed(final java.awt.event.KeyEvent e) {
if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
filterCardTable();
}
}
});
}
return jCheckBoxColorless;
}
/**
* <p>
* Getter for the field <code>jButtonOk</code>.
* </p>
*
* @return a {@link javax.swing.JButton} object.
*/
private JButton getJButtonOk() {
if (jButtonOk == null) {
jButtonOk = new JButton();
jButtonOk.setText("OK");
jButtonOk.addMouseListener(new MouseInputAdapter() {
@Override
public void mouseClicked(final MouseEvent e) {
filterCardTable();
}
});
}
return jButtonOk;
}
/**
* <p>
* Getter for the field <code>jCheckBoxBlack</code>.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxBlack() {
if (jCheckBoxBlack == null) {
jCheckBoxBlack = new JCheckBox();
jCheckBoxBlack.setText("Black");
jCheckBoxBlack.setBackground(gray);
jCheckBoxBlack.setSelected(true);
jCheckBoxBlack.addKeyListener(new java.awt.event.KeyAdapter() {
@Override
public void keyPressed(final java.awt.event.KeyEvent e) {
if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
filterCardTable();
}
}
});
}
return jCheckBoxBlack;
}
/**
* <p>
* Getter for the field <code>typePanel</code>.
* </p>
*
* @return a {@link javax.swing.JPanel} object.
*/
private JPanel getTypePanel() {
if (typePanel == null) {
typePanel = new JPanel();
typePanel.setLayout(new MigLayout());
typePanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
typePanel.setBackground(gray);
typePanel.add(getTypeLabel(), "align, wrap");
typePanel.add(getJCheckBoxSorcery(), "wrap");
typePanel.add(getJCheckBoxPlaneswalker(), "wrap");
typePanel.add(getJCheckBoxLand(), "wrap");
typePanel.add(getJCheckBoxInstant(), "wrap");
typePanel.add(getJCheckBoxEnchant(), "wrap");
typePanel.add(getJCheckBoxCreature(), "wrap");
typePanel.add(getJCheckBoxArtifact(), "wrap");
}
return typePanel;
}
/**
* <p>
* Getter for the field <code>colorLabel</code>.
* </p>
*
* @return a {@link javax.swing.JLabel} object.
*/
private JLabel getColorLabel() {
if (colorLabel == null) {
colorLabel = new JLabel();
colorLabel.setText("Color");
colorLabel.setFont(new java.awt.Font("Segoe UI", 0, 14));
}
return colorLabel;
}
/**
* <p>
* Getter for the field <code>typeLabel</code>.
* </p>
*
* @return a {@link javax.swing.JLabel} object.
*/
private JLabel getTypeLabel() {
if (typeLabel == null) {
typeLabel = new JLabel();
typeLabel.setText("Type");
typeLabel.setFont(new java.awt.Font("Segoe UI", 0, 14));
}
return typeLabel;
}
/**
* <p>
* getJCheckBoxSorcery.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxSorcery() {
if (jCheckBoxSorcery == null) {
jCheckBoxSorcery = new JCheckBox();
jCheckBoxSorcery.setText("Sorcery");
jCheckBoxSorcery.setSelected(true);
jCheckBoxSorcery.setBackground(gray);
jCheckBoxSorcery.addKeyListener(new java.awt.event.KeyAdapter() {
@Override
public void keyPressed(final java.awt.event.KeyEvent e) {
if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
filterCardTable();
}
}
});
}
return jCheckBoxSorcery;
}
/**
* <p>
* getJCheckBoxPlaneswalker.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxPlaneswalker() {
if (jCheckBoxPlaneswalker == null) {
jCheckBoxPlaneswalker = new JCheckBox();
jCheckBoxPlaneswalker.setText("Planeswalker");
jCheckBoxPlaneswalker.setSelected(true);
jCheckBoxPlaneswalker.setBackground(gray);
jCheckBoxPlaneswalker.addKeyListener(new java.awt.event.KeyAdapter() {
@Override
public void keyPressed(final java.awt.event.KeyEvent e) {
if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
filterCardTable();
}
}
});
}
return jCheckBoxPlaneswalker;
}
/**
* <p>
* getJCheckBoxLand.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxLand() {
if (jCheckBoxLand == null) {
jCheckBoxLand = new JCheckBox();
jCheckBoxLand.setText("Land");
jCheckBoxLand.setSelected(true);
jCheckBoxLand.setBackground(gray);
jCheckBoxLand.addKeyListener(new java.awt.event.KeyAdapter() {
@Override
public void keyPressed(final java.awt.event.KeyEvent e) {
if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
filterCardTable();
}
}
});
}
return jCheckBoxLand;
}
/**
* <p>
* getJCheckBoxInstant.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxInstant() {
if (jCheckBoxInstant == null) {
jCheckBoxInstant = new JCheckBox();
jCheckBoxInstant.setText("Instant");
jCheckBoxInstant.setSelected(true);
jCheckBoxInstant.setBackground(gray);
jCheckBoxInstant.addKeyListener(new java.awt.event.KeyAdapter() {
@Override
public void keyPressed(final java.awt.event.KeyEvent e) {
if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
filterCardTable();
}
}
});
}
return jCheckBoxInstant;
}
/**
* <p>
* getJCheckBoxEnchant.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxEnchant() {
if (jCheckBoxEnchant == null) {
jCheckBoxEnchant = new JCheckBox();
jCheckBoxEnchant.setText("Enchant");
jCheckBoxEnchant.setSelected(true);
jCheckBoxEnchant.setBackground(gray);
jCheckBoxEnchant.addKeyListener(new java.awt.event.KeyAdapter() {
@Override
public void keyPressed(final java.awt.event.KeyEvent e) {
if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
filterCardTable();
}
}
});
}
return jCheckBoxEnchant;
}
/**
* <p>
* getJCheckBoxCreature.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxCreature() {
if (jCheckBoxCreature == null) {
jCheckBoxCreature = new JCheckBox();
jCheckBoxCreature.setText("Creature");
jCheckBoxCreature.setSelected(true);
jCheckBoxCreature.setBackground(gray);
jCheckBoxCreature.addKeyListener(new java.awt.event.KeyAdapter() {
@Override
public void keyPressed(final java.awt.event.KeyEvent e) {
if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
filterCardTable();
}
}
});
}
return jCheckBoxCreature;
}
/**
* <p>
* getJCheckBoxArtifact.
* </p>
*
* @return a {@link javax.swing.JCheckBox} object.
*/
private JCheckBox getJCheckBoxArtifact() {
if (jCheckBoxArtifact == null) {
jCheckBoxArtifact = new JCheckBox();
jCheckBoxArtifact.setText("Artifact");
jCheckBoxArtifact.setSelected(true);
jCheckBoxArtifact.setBackground(gray);
jCheckBoxArtifact.addKeyListener(new java.awt.event.KeyAdapter() {
@Override
public void keyPressed(final java.awt.event.KeyEvent e) {
if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
filterCardTable();
}
}
});
}
return jCheckBoxArtifact;
}
/**
* <p>
* getCardTextField.
* </p>
*
* @return a {@link javax.swing.JTextField} object.
*/
private JTextField getCardTextField() {
if (cardTextField == null) {
cardTextField = new JTextField(30);
cardTextField.addKeyListener(new java.awt.event.KeyAdapter() {
@Override
public void keyPressed(final java.awt.event.KeyEvent e) {
if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
filterCardTable();
}
}
});
}
return cardTextField;
}
/**
* <p>
* Getter for the field <code>cardTextLabel</code>.
* </p>
*
* @return a {@link javax.swing.JLabel} object.
*/
private JLabel getCardTextLabel() {
if (cardTextLabel == null) {
cardTextLabel = new JLabel();
cardTextLabel.setText("Card Text:");
cardTextLabel.setFont(new java.awt.Font("Segoe UI", 0, 16));
}
return cardTextLabel;
}
/**
* <p>
* FilterCardTable.
* </p>
*/
private void filterCardTable() {
String name = nameTextField.getText();
String cText = cardTextField.getText();
Gui_Quest_DeckEditor g = (Gui_Quest_DeckEditor) deckDisplay;
CardFilter filter = new CardFilter();
g.setEnabled(true);
CardList filterCardList = g.stCardList;
if (name != "") {
if (cText != "") {
filterCardList = filter.cardListNameFilter(filterCardList, name);
if (filterCardList.size() == 0) {
JOptionPane.showMessageDialog(null, "Sorry, cards with name: " + name + " not found.", "Filter",
JOptionPane.INFORMATION_MESSAGE);
g.filterUsed = false;
deckDisplay.updateDisplay(g.stCardList, deckDisplay.getBottom());
} else {
filterCardList = filter.CardListTextFilter(filterCardList, cText);
if (filterCardList.size() == 0) {
JOptionPane.showMessageDialog(null, "Sorry, cards with text: " + cText + " not found.",
"Filter", JOptionPane.INFORMATION_MESSAGE);
g.filterUsed = false;
deckDisplay.updateDisplay(g.stCardList, deckDisplay.getBottom());
} else {
if (!jCheckBoxBlack.isSelected()) {
filterCardList = filter.CardListColorFilter(filterCardList, "black");
g.blackCheckBox.setSelected(false);
g.blackCheckBox.setEnabled(false);
}
if (!jCheckBoxBlue.isSelected()) {
filterCardList = filter.CardListColorFilter(filterCardList, "blue");
g.blueCheckBox.setSelected(false);
g.blueCheckBox.setEnabled(false);
}
if (!jCheckBoxGreen.isSelected()) {
filterCardList = filter.CardListColorFilter(filterCardList, "green");
g.greenCheckBox.setSelected(false);
g.greenCheckBox.setEnabled(false);
}
if (!jCheckBoxRed.isSelected()) {
filterCardList = filter.CardListColorFilter(filterCardList, "red");
g.redCheckBox.setSelected(false);
g.redCheckBox.setEnabled(false);
}
if (!jCheckBoxWhite.isSelected()) {
filterCardList = filter.CardListColorFilter(filterCardList, "white");
g.whiteCheckBox.setSelected(false);
g.whiteCheckBox.setEnabled(false);
}
if (!jCheckBoxColorless.isSelected()) {
filterCardList = filter.CardListColorFilter(filterCardList, "colorless");
g.colorlessCheckBox.setSelected(false);
g.colorlessCheckBox.setEnabled(false);
}
if (!jCheckBoxArtifact.isSelected()) {
filterCardList = filter.CardListTypeFilter(filterCardList, "artifact");
g.artifactCheckBox.setSelected(false);
g.artifactCheckBox.setEnabled(false);
}
if (!jCheckBoxCreature.isSelected()) {
filterCardList = filter.CardListTypeFilter(filterCardList, "creature");
g.creatureCheckBox.setSelected(false);
g.creatureCheckBox.setEnabled(false);
}
if (!jCheckBoxEnchant.isSelected()) {
filterCardList = filter.CardListTypeFilter(filterCardList, "enchantment");
g.enchantmentCheckBox.setSelected(false);
g.enchantmentCheckBox.setEnabled(false);
}
if (!jCheckBoxInstant.isSelected()) {
filterCardList = filter.CardListTypeFilter(filterCardList, "instant");
g.instantCheckBox.setSelected(false);
g.instantCheckBox.setEnabled(false);
}
if (!jCheckBoxLand.isSelected()) {
filterCardList = filter.CardListTypeFilter(filterCardList, "land");
g.landCheckBox.setSelected(false);
g.landCheckBox.setEnabled(false);
}
if (!jCheckBoxPlaneswalker.isSelected()) {
filterCardList = filter.CardListTypeFilter(filterCardList, "planeswalker");
g.planeswalkerCheckBox.setSelected(false);
g.planeswalkerCheckBox.setEnabled(false);
}
if (!jCheckBoxSorcery.isSelected()) {
filterCardList = filter.CardListTypeFilter(filterCardList, "sorcery");
g.sorceryCheckBox.setSelected(false);
g.sorceryCheckBox.setEnabled(false);
}
deckDisplay.updateDisplay(filterCardList, deckDisplay.getBottom());
}
}
}
}
dispose();
}
}

View File

@@ -1,810 +0,0 @@
package forge;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Map;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import javax.swing.event.MouseInputAdapter;
import javax.swing.event.MouseInputListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import forge.deck.Deck;
import forge.error.ErrorViewer;
import forge.gui.game.CardDetailPanel;
import forge.gui.game.CardPicturePanel;
import forge.properties.NewConstants;
import forge.view.swing.OldGuiNewGame;
/**
* <p>
* Gui_CardShop class.
* </p>
*
* @author Forge
* @version $Id$
*/
public class Gui_CardShop extends JFrame implements CardContainer, DeckDisplay, NewConstants {
/** Constant <code>serialVersionUID=3988857075791576483L</code> */
private static final long serialVersionUID = 3988857075791576483L;
Gui_DeckEditor_Menu customMenu;
// private ImageIcon upIcon = Constant.IO.upIcon;
// private ImageIcon downIcon = Constant.IO.downIcon;
private CardShopTableModel topModel;
private CardShopTableModel bottomModel;
private JScrollPane jScrollPane1 = new JScrollPane();
private JScrollPane jScrollPane2 = new JScrollPane();
private JButton sellButton = new JButton();
@SuppressWarnings("unused")
// border1
private Border border1;
private TitledBorder titledBorder1;
private Border border2;
private TitledBorder titledBorder2;
private JButton buyButton = new JButton();
private JTable topTable;
private JTable bottomTable;
private JScrollPane jScrollPane3 = new JScrollPane();
private JPanel jPanel3 = new JPanel();
private GridLayout gridLayout1 = new GridLayout();
private JLabel creditsLabel = new JLabel();
private JLabel jLabel1 = new JLabel();
private JLabel sellPercentageLabel = new JLabel();
private double multi;
private CardList top;
private CardList bottom;
public Card cCardHQ;
private CardDetailPanel detail = new CardDetailPanel(null);
private CardPicturePanel picture = new CardPicturePanel(null);
private JPanel glassPane;
private forge.quest.data.QuestData questData;
/** {@inheritDoc} */
@Override
public void setTitle(String message) {
super.setTitle(message);
}
/** {@inheritDoc} */
public void updateDisplay(CardList topParam, CardList bottomParam) {
this.top = topParam;
this.bottom = bottomParam;
topModel.clear();
bottomModel.clear();
topParam = AllZone.getNameChanger().changeCardsIfNeeded(topParam);
bottomParam = AllZone.getNameChanger().changeCardsIfNeeded(bottomParam);
Card c;
String cardName;
ReadBoosterPack pack = new ReadBoosterPack();
// update top
for (int i = 0; i < topParam.size(); i++) {
c = topParam.get(i);
// add rarity to card if this is a sealed card pool
cardName = AllZone.getNameChanger().getOriginalName(c.getName());
if (!pack.getRarity(cardName).equals("error")) {
c.setRarity(pack.getRarity(cardName));
}
// String PC = c.getSVar("PicCount");
Random r = MyRandom.random;
// int n = 0;
// if (PC.matches("[0-9][0-9]?"))
// n = Integer.parseInt(PC);
// if (n > 1)
// c.setRandomPicture(r.nextInt(n));
if (c.getCurSetCode().equals(""))
c.setCurSetCode(c.getMostRecentSet());
if (!c.getCurSetCode().equals("")) {
int n = SetInfoUtil.getSetInfo_Code(c.getSets(), c.getCurSetCode()).PicCount;
if (n > 1)
c.setRandomPicture(r.nextInt(n - 1) + 1);
c.setImageFilename(CardUtil.buildFilename(c));
}
topModel.addCard(c);
}// for
// update bottom
for (int i = 0; i < bottomParam.size(); i++) {
c = bottomParam.get(i);
// add rarity to card if this is a sealed card pool
if (!customMenu.getGameType().equals(Constant.GameType.Constructed))
c.setRarity(pack.getRarity(c.getName()));
// String PC = c.getSVar("PicCount");
Random r = MyRandom.random;
// int n = 0;
// if (PC.matches("[0-9][0-9]?"))
// n = Integer.parseInt(PC);
// if (n > 1)
// c.setRandomPicture(r.nextInt(n));
if (c.getCurSetCode().equals(""))
c.setCurSetCode(c.getMostRecentSet());
if (!c.getCurSetCode().equals("")) {
int n = SetInfoUtil.getSetInfo_Code(c.getSets(), c.getCurSetCode()).PicCount;
if (n > 1)
c.setRandomPicture(r.nextInt(n - 1) + 1);
c.setImageFilename(CardUtil.buildFilename(c));
}
bottomModel.addCard(c);
}// for
topModel.resort();
bottomModel.resort();
}// updateDisplay
/**
* <p>
* updateDisplay.
* </p>
*/
public void updateDisplay() {
// updateDisplay(this.top, this.bottom);
topModel.clear();
top = AllZone.getNameChanger().changeCardsIfNeeded(top);
bottom = AllZone.getNameChanger().changeCardsIfNeeded(bottom);
Card c;
String cardName;
ReadBoosterPack pack = new ReadBoosterPack();
// update top
for (int i = 0; i < top.size(); i++) {
c = top.get(i);
// add rarity to card if this is a sealed card pool
cardName = AllZone.getNameChanger().getOriginalName(c.getName());
if (!pack.getRarity(cardName).equals("error")) {
c.setRarity(pack.getRarity(cardName));
}
topModel.addCard(c);
}// for
topModel.resort();
}
/**
* <p>
* getTopTableModel.
* </p>
*
* @return a {@link forge.CardShopTableModel} object.
*/
public CardShopTableModel getTopTableModel() {
return topModel;
}
/**
* <p>
* Getter for the field <code>top</code>.
* </p>
*
* @return a {@link forge.CardList} object.
*/
public CardList getTop() {
return topModel.getCards();
}
// bottom shows cards that the user has chosen for his library
/**
* <p>
* Getter for the field <code>bottom</code>.
* </p>
*
* @return a {@link forge.CardList} object.
*/
public CardList getBottom() {
return bottomModel.getCards();
}
/**
* <p>
* show.
* </p>
*
* @param exitCommand
* a {@link forge.Command} object.
*/
public void show(final Command exitCommand) {
final Command exit = new Command() {
private static final long serialVersionUID = 5210924838133689758L;
public void execute() {
Gui_CardShop.this.dispose();
exitCommand.execute();
}
};
customMenu = new Gui_DeckEditor_Menu(this, exit);
customMenu.setTitle("Card Shop");
// this.setJMenuBar(customMenu);
// do not change this!!!!
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent ev) {
customMenu.close();
}
});
setup();
// show cards, makes this user friendly
// customMenu.newConstructed();
// get pricelist:
ReadPriceList r = new ReadPriceList();
Map<String, Long> map = r.getPriceList();
ReadBoosterPack pack = new ReadBoosterPack();
CardList shop;
if (questData.getShopList() == null || questData.getShopList().size() == 0) {
shop = pack.getShopCards(questData.getWin(), questData.getLevel());
ArrayList<String> shopListToBeSaved = new ArrayList<String>();
for (int i = 0; i < shop.size(); i++) {
Card crd = shop.get(i);
if (map.containsKey(crd.getName()))
crd.setValue(map.get(crd.getName()));
else {
System.out.println("Card " + crd.getName() + " is not in the price list.");
crd.setValue(10);
if (crd.getRarity().equals("Common"))
crd.setValue(10);
else if (crd.getRarity().equals("Uncommon"))
crd.setValue(50);
else if (crd.getRarity().equals("Rare"))
crd.setValue(200);
}
shopListToBeSaved.add(crd.getName());
}
questData.setShopList(shopListToBeSaved);
} else // grab existing shopList
{
java.util.List<String> shopList = questData.getShopList();
shop = new CardList();
for (String aShopList : shopList) {
Card c = AllZone.getCardFactory().getCard(aShopList, null);
c.setRarity(pack.getRarity(c.getName()));
if (map.containsKey(c.getName())) {
c.setValue(map.get(c.getName()));
} else // card is not on pricelist
{
System.out.println("Card " + c.getName() + " is not in the price list.");
if (c.getRarity().equals("Common")) {
c.setValue(10);
} else if (c.getRarity().equals("Uncommon")) {
c.setValue(50);
} else if (c.getRarity().equals("Rare")) {
c.setValue(200);
}
}
shop.add(c);
}
}
java.util.List<String> list = questData.getCardpool();
CardList owned = new CardList();
for (String aList : list) {
Card c = AllZone.getCardFactory().getCard(aList, null);
c.setRarity(pack.getRarity(c.getName()));
if (map.containsKey(c.getName())) {
c.setValue(map.get(c.getName()));
} else // card is not on pricelist
{
System.out.println("Card " + c.getName() + " is not in the price list.");
if (c.getRarity().equals("Common")) {
c.setValue(10);
} else if (c.getRarity().equals("Uncommon")) {
c.setValue(50);
} else if (c.getRarity().equals("Rare")) {
c.setValue(200);
}
}
owned.add(c);
}
customMenu.populateShop(shop, owned);
double multiPercent = multi * 100;
NumberFormat formatter = new DecimalFormat("#0.00");
String maxSellingPrice = "";
if (questData.getWin() <= 50)
maxSellingPrice = " Max selling price: 1000";
sellPercentageLabel.setText("(Sell percentage: " + formatter.format(multiPercent) + "% of value)"
+ maxSellingPrice);
topModel.sort(1, true);
bottomModel.sort(1, true);
}// show(Command)
/**
* <p>
* addListeners.
* </p>
*/
private void addListeners() {
MouseInputListener l = new MouseInputListener() {
public void mouseReleased(MouseEvent e) {
redispatchMouseEvent(e);
}
public void mousePressed(MouseEvent e) {
redispatchMouseEvent(e);
}
public void mouseExited(MouseEvent e) {
redispatchMouseEvent(e);
}
public void mouseEntered(MouseEvent e) {
redispatchMouseEvent(e);
}
public void mouseClicked(MouseEvent e) {
redispatchMouseEvent(e);
}
public void mouseMoved(MouseEvent e) {
redispatchMouseEvent(e);
}
public void mouseDragged(MouseEvent e) {
redispatchMouseEvent(e);
}
private void redispatchMouseEvent(MouseEvent e) {
Container content = getContentPane();
Point glassPoint = e.getPoint();
Point contentPoint = SwingUtilities.convertPoint(glassPane, glassPoint, content);
Component component = SwingUtilities.getDeepestComponentAt(content, contentPoint.x, contentPoint.y);
if (component == null || !SwingUtilities.isDescendingFrom(component, picture)) {
glassPane.setVisible(false);
}
}
};
glassPane.addMouseMotionListener(l);
glassPane.addMouseListener(l);
picture.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
Card c = picture.getCard();
if (c == null)
return;
Image i = ImageCache.getOriginalImage(c);
if (i == null)
return;
if (i.getWidth(null) < 300)
return;
glassPane.setVisible(true);
}
});
}// addListeners()
/**
* <p>
* setup.
* </p>
*/
private void setup() {
multi = 0.20 + (0.001 * questData.getWin());
if (multi > 0.6)
multi = 0.6;
if (questData.getMode().equals(forge.quest.data.QuestData.FANTASY)) {
if (questData.getInventory().getItemLevel("Estates") == 1)
multi += 0.01;
else if (questData.getInventory().getItemLevel("Estates") == 2)
multi += 0.0175;
else if (questData.getInventory().getItemLevel("Estates") >= 3)
multi += 0.025;
}
addListeners();
// construct topTable, get all cards
topModel = new CardShopTableModel(new CardList(), this);
topModel.addListeners(topTable);
topTable.setModel(topModel);
topModel.resizeCols(topTable);
// construct bottomModel
bottomModel = new CardShopTableModel(this);
bottomModel.addListeners(bottomTable);
bottomTable.setModel(bottomModel);
topModel.resizeCols(bottomTable);
setSize(1024, 768);
this.setResizable(false);
Dimension screen = getToolkit().getScreenSize();
Rectangle bounds = getBounds();
bounds.width = 1024;
bounds.height = 768;
bounds.x = (screen.width - bounds.width) / 2;
bounds.y = (screen.height - bounds.height) / 2;
setBounds(bounds);
// TODO use this as soon the deck editor has resizable GUI
// //Use both so that when "un"maximizing, the frame isn't tiny
// setSize(1024, 740);
// setExtendedState(Frame.MAXIMIZED_BOTH);
}// setupAndDisplay()
/**
* <p>
* Constructor for Gui_CardShop.
* </p>
*
* @param qd
* a {@link forge.quest.data.QuestData} object.
*/
public Gui_CardShop(forge.quest.data.QuestData qd) {
questData = qd;
try {
jbInit();
} catch (Exception ex) {
ErrorViewer.showError(ex);
}
}
/**
* <p>
* getCard.
* </p>
*
* @return a {@link forge.Card} object.
*/
public Card getCard() {
return detail.getCard();
}
/** {@inheritDoc} */
public void setCard(Card card) {
detail.setCard(card);
picture.setCard(card);
}
/**
* <p>
* jbInit.
* </p>
*
* @throws java.lang.Exception
* if any.
*/
private void jbInit() throws Exception {
// Replace cell renderer with one that displays the cell text as
// tooltip.
topTable = new JTable() {
private static final long serialVersionUID = -1103518241118990299L;
public TableCellRenderer getCellRenderer(int row, int column) {
TableCellRenderer renderer = new DefaultTableCellRenderer() {
private static final long serialVersionUID = -9208011190616028553L;
public String getToolTipText() {
return this.getText();
}
};
return renderer;
}
};
bottomTable = new JTable() {
private static final long serialVersionUID = -3703821828491920769L;
public TableCellRenderer getCellRenderer(int row, int column) {
TableCellRenderer renderer = new DefaultTableCellRenderer() {
private static final long serialVersionUID = -2544330968158633077L;
public String getToolTipText() {
return this.getText();
}
};
return renderer;
}
};
border1 = new EtchedBorder(EtchedBorder.RAISED, Color.white, new Color(148, 145, 140));
titledBorder1 = new TitledBorder(BorderFactory.createEtchedBorder(Color.white, new Color(148, 145, 140)),
"All Cards");
border2 = BorderFactory.createEtchedBorder(Color.white, new Color(148, 145, 140));
titledBorder2 = new TitledBorder(border2, "Owned Cards");
this.getContentPane().setLayout(null);
jScrollPane1.setBorder(titledBorder1);
jScrollPane1.setBounds(new Rectangle(19, 20, 726, 346));
jScrollPane2.setBorder(titledBorder2);
jScrollPane2.setBounds(new Rectangle(19, 458, 726, 218));
sellButton.setBounds(new Rectangle(180, 403, 146, 49));
// removeButton.setIcon(upIcon);
if (!OldGuiNewGame.useLAFFonts.isSelected())
sellButton.setFont(new java.awt.Font("Dialog", 0, 13));
sellButton.setText("Sell Card");
sellButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
sellButton_actionPerformed(e);
}
});
buyButton.setText("Buy Card");
buyButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
buyButton_actionPerformed(e);
}
});
if (!OldGuiNewGame.useLAFFonts.isSelected())
buyButton.setFont(new java.awt.Font("Dialog", 0, 13));
buyButton.setBounds(new Rectangle(23, 403, 146, 49));
detail.setBounds(new Rectangle(765, 23, 239, 323));
picture.setBounds(new Rectangle(765, 372, 239, 338));
picture.addMouseListener(new MouseInputAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
}
});
// Do not lower statsLabel any lower, we want this to be visible at 1024
// x 768 screen size
this.setTitle("Card Shop");
jScrollPane3.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
jScrollPane3.setBounds(new Rectangle(6, 168, 225, 143));
jPanel3.setBounds(new Rectangle(7, 21, 224, 141));
jPanel3.setLayout(gridLayout1);
gridLayout1.setColumns(1);
gridLayout1.setRows(0);
creditsLabel.setBounds(new Rectangle(19, 365, 720, 31));
creditsLabel.setText("Total credits: " + questData.getCredits());
if (!OldGuiNewGame.useLAFFonts.isSelected())
creditsLabel.setFont(new java.awt.Font("Dialog", 0, 14));
sellPercentageLabel.setBounds(new Rectangle(350, 403, 450, 31));
sellPercentageLabel.setText("(Sell percentage: " + multi + ")");
if (!OldGuiNewGame.useLAFFonts.isSelected())
sellPercentageLabel.setFont(new java.awt.Font("Dialog", 0, 14));
jLabel1.setText("Click on the column name (like name or color) to sort the cards");
jLabel1.setBounds(new Rectangle(20, 1, 400, 19));
this.getContentPane().add(detail, null);
this.getContentPane().add(picture, null);
this.getContentPane().add(jScrollPane1, null);
this.getContentPane().add(jScrollPane2, null);
this.getContentPane().add(creditsLabel, null);
this.getContentPane().add(buyButton, null);
this.getContentPane().add(sellButton, null);
this.getContentPane().add(sellPercentageLabel, null);
this.getContentPane().add(jLabel1, null);
jScrollPane2.getViewport().add(bottomTable, null);
jScrollPane1.getViewport().add(topTable, null);
glassPane = new JPanel() {
private static final long serialVersionUID = 7394924497724994317L;
@Override
protected void paintComponent(java.awt.Graphics g) {
Image image = ImageCache.getOriginalImage(picture.getCard());
g.drawImage(image, glassPane.getWidth() - image.getWidth(null),
glassPane.getHeight() - image.getHeight(null), null);
}
};
setGlassPane(glassPane);
}
/**
* <p>
* buyButton_actionPerformed.
* </p>
*
* @param e
* a {@link java.awt.event.ActionEvent} object.
*/
void buyButton_actionPerformed(ActionEvent e) {
int n = topTable.getSelectedRow();
if (n != -1) {
Card c = topModel.rowToCard(n);
if (c.getValue() <= questData.getCredits()) {
bottomModel.addCard(c);
bottomModel.resort();
topModel.removeCard(c);
questData.subtractCredits(c.getValue());
questData.addCard(c);
questData.removeCardFromShopList(c);
creditsLabel.setText("Total credits: " + questData.getCredits());
// 3 conditions" 0 cards left, select the same row, select next
// row
int size = topModel.getRowCount();
if (size != 0) {
if (size == n)
n--;
topTable.addRowSelectionInterval(n, n);
}
} else {
JOptionPane.showMessageDialog(null, "Not enough credits!");
}
}// if(valid row)
}// buyButton_actionPerformed
/**
* <p>
* sellButton_actionPerformed.
* </p>
*
* @param e
* a {@link java.awt.event.ActionEvent} object.
*/
void sellButton_actionPerformed(ActionEvent e) {
int n = bottomTable.getSelectedRow();
if (n != -1) {
Card c = bottomModel.rowToCard(n);
bottomModel.removeCard(c);
topModel.addCard(c);
topModel.resort();
// bottomModel.removeCard(c);
questData.addCardToShopList(c);
long price = (long) (multi * c.getValue());
if (questData.getWin() <= 50 && price > 1000)
price = 1000;
questData.addCredits(price);
questData.removeCard(c);
creditsLabel.setText("Total credits: " + questData.getCredits());
// remove sold cards from all decks:
java.util.List<String> deckNames = questData.getDeckNames();
for (String deckName : deckNames) {
Deck deck = questData.getDeck(deckName);
if (deck.getMain().contains(c.getName())) {
// count occurences:
int cardPoolCount = 0;
java.util.List<String> cpList = questData.getCards();
while (cpList.contains(c.getName())) {
cpList.remove(cpList.indexOf(c.getName()));
cardPoolCount++;
}
if (cardPoolCount < 4)
deck.removeMain(c);
}
}
// 3 conditions" 0 cards left, select the same row, select next row
int size = bottomModel.getRowCount();
if (size != 0) {
if (size == n)
n--;
bottomTable.addRowSelectionInterval(n, n);
}
}// if(valid row)
}// sellButton_actionPerformed
/**
* <p>
* stats_actionPerformed.
* </p>
*
* @param list
* a {@link forge.CardList} object.
*/
@SuppressWarnings("unused")
// stats_actionPerformed
private void stats_actionPerformed(CardList list) {
}
/*
* //refresh Gui from deck, Gui shows the cards in the deck
*//**
* <p>
* refreshGui.
* </p>
*/
/*
* @SuppressWarnings("unused") // refreshGui private void refreshGui() {
* Deck deck = Constant.Runtime.HumanDeck[0]; if (deck == null) //this is
* just a patch, i know deck = new Deck(Constant.Runtime.GameType[0]);
*
* topModel.clear(); bottomModel.clear();
*
* Card c; ReadBoosterPack pack = new ReadBoosterPack(); for (int i = 0; i <
* deck.countMain(); i++) { c =
* AllZone.getCardFactory().getCard(deck.getMain(i),
* AllZone.getHumanPlayer());
*
* //add rarity to card if this is a sealed card pool if
* (Constant.Runtime.GameType[0].equals(Constant.GameType.Sealed))
* c.setRarity(pack.getRarity(c.getName()));
*
* bottomModel.addCard(c); }//for
*
* if (deck.isSealed() || deck.isDraft()) { //add sideboard to GUI for (int
* i = 0; i < deck.countSideboard(); i++) { c =
* AllZone.getCardFactory().getCard(deck.getSideboard(i),
* AllZone.getHumanPlayer()); c.setRarity(pack.getRarity(c.getName()));
* topModel.addCard(c); } } else {
*
* Braids: "getAllCards copies the entire array, but that does not seem to
* be needed here. Significant performance improvement is possible if this
* code used getCards instead (along with a for each loop instead of using
* get(i), if applicable)."
*
* CardList all = AllZone.getCardFactory().getAllCards(); for (int i = 0; i
* < all.size(); i++) topModel.addCard(all.get(i)); }
*
* topModel.resort(); bottomModel.resort(); }////refreshGui()
*/
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,73 +0,0 @@
package forge;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import net.slightlymagic.maxmtg.Predicate;
import forge.card.CardRules;
import forge.card.CardPoolView;
public class Gui_DeckEditorBase extends JFrame {
private static final long serialVersionUID = -401223933343539977L;
//public JCheckBox whiteCheckBox = new GuiFilterCheckBox("white", "White");
public JCheckBox whiteCheckBox = new JCheckBox("W", true);
public JCheckBox blueCheckBox = new JCheckBox("U", true);
public JCheckBox blackCheckBox = new JCheckBox("B", true);
public JCheckBox redCheckBox = new JCheckBox("R", true);
public JCheckBox greenCheckBox = new JCheckBox("G", true);
public JCheckBox colorlessCheckBox = new JCheckBox("C", true);
public JCheckBox landCheckBox = new JCheckBox("Land", true);
public JCheckBox creatureCheckBox = new JCheckBox("Creature", true);
public JCheckBox sorceryCheckBox = new JCheckBox("Sorcery", true);
public JCheckBox instantCheckBox = new JCheckBox("Instant", true);
public JCheckBox planeswalkerCheckBox = new JCheckBox("Planeswalker", true);
public JCheckBox artifactCheckBox = new JCheckBox("Artifact", true);
public JCheckBox enchantmentCheckBox = new JCheckBox("Enchant", true);
public static String getStats(CardPoolView deck) {
int total = deck.countAll();
int creature = CardRules.Predicates.Presets.isCreature.aggregate(deck, CardPoolView.fnToCard, CardPoolView.fnToCount);
int land = CardRules.Predicates.Presets.isLand.aggregate(deck, CardPoolView.fnToCard, CardPoolView.fnToCount);
StringBuffer show = new StringBuffer();
show.append("Total - ").append(total).append(", Creatures - ").append(creature).append(", Land - ")
.append(land);
String[] color = Constant.Color.onlyColors;
List<Predicate<CardRules>> predicates = CardRules.Predicates.Presets.colors;
for (int i = 0; i < color.length; ++i) {
show.append(String.format(", %s - %d", color[i], predicates.get(i).count(deck, CardPoolView.fnToCard)));
}
return show.toString();
}// getStats()
public final Predicate<CardRules> buildFilter() {
List<Predicate<CardRules>> colors = new ArrayList<Predicate<CardRules>>();
if (whiteCheckBox.isSelected()) { colors.add(CardRules.Predicates.Presets.isWhite); }
if (blueCheckBox.isSelected()) { colors.add(CardRules.Predicates.Presets.isBlue); }
if (blackCheckBox.isSelected()) { colors.add(CardRules.Predicates.Presets.isBlack); }
if (redCheckBox.isSelected()) { colors.add(CardRules.Predicates.Presets.isRed); }
if (greenCheckBox.isSelected()) { colors.add(CardRules.Predicates.Presets.isGreen); }
if (colorlessCheckBox.isSelected()) { colors.add(CardRules.Predicates.Presets.isColorless); }
Predicate<CardRules> filterByColor = colors.size() == 6 ? Predicate.getTrue(CardRules.class) : Predicate.or(colors);
List<Predicate<CardRules>> types = new ArrayList<Predicate<CardRules>>();
if (landCheckBox.isSelected()) { types.add(CardRules.Predicates.Presets.isLand); }
if (creatureCheckBox.isSelected()) { types.add(CardRules.Predicates.Presets.isCreature); }
if (sorceryCheckBox.isSelected()) { types.add(CardRules.Predicates.Presets.isSorcery); }
if (instantCheckBox.isSelected()) { types.add(CardRules.Predicates.Presets.isInstant); }
if (planeswalkerCheckBox.isSelected()) { types.add(CardRules.Predicates.Presets.isPlaneswalker); }
if (artifactCheckBox.isSelected()) { types.add(CardRules.Predicates.Presets.isArtifact); }
if (enchantmentCheckBox.isSelected()) { types.add(CardRules.Predicates.Presets.isEnchantment); }
Predicate<CardRules> filterByType = colors.size() == 7 ? Predicate.getTrue(CardRules.class) : Predicate.or(types);
return Predicate.and(filterByColor, filterByType);
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,6 @@
package forge;
import forge.card.CardPrinted;
import forge.error.ErrorViewer;
import forge.game.GameEndReason;
import forge.game.GameLossReason;
@@ -301,19 +302,6 @@ public class Gui_WinLose extends JFrame implements NewConstants {
return sb.toString();
}
/**
* <p>getCardIcon.</p>
*
* @param fileName a {@link java.lang.String} object.
* @return a {@link javax.swing.ImageIcon} object.
*/
private ImageIcon getCardIcon(String fileName) {
File base = ForgeProps.getFile(IMAGE_BASE);
File file = new File(base, fileName);
ImageIcon icon = new ImageIcon(file.toString());
return icon;
}
/**
* <p>getIcon.</p>
*
@@ -352,9 +340,8 @@ public class Gui_WinLose extends JFrame implements NewConstants {
}
//System.out.println("QuestData cardpoolsize:" + AllZone.getQuestData().getCardpool().size());
if (model.quest.getShopList() != null) {
model.quest.clearShopList();
}
if (model.quest.getAvailableQuests() != null) {
model.quest.clearAvailableQuests();
@@ -401,7 +388,7 @@ public class Gui_WinLose extends JFrame implements NewConstants {
setsToGive.addAll(Arrays.asList(new String[]{"M12","NPH","MBS","M11","ROE","WWK","ZEN","M10","ARB","CFX","ALA","MOR","SHM","EVE","LRW"}));
}
ArrayList<String> cardsWon = model.quest.addCards(setsToGive);
ArrayList<CardPrinted> cardsWon = model.quest.addCards(setsToGive);
ImageIcon icon = getIcon("BookIcon.png");
CardListViewer c = new CardListViewer("Booster", "You have won the following new cards", cardsWon, icon);
c.show();
@@ -431,7 +418,7 @@ public class Gui_WinLose extends JFrame implements NewConstants {
int wins = model.quest.getWin();
if (wins > 0 && wins % 80 == 0) // at every 80 wins, give 10 random rares
{
ArrayList<String> randomRares = model.quest.addRandomRare(10);
ArrayList<CardPrinted> randomRares = model.quest.addRandomRare(10);
ImageIcon icon = getIcon("BoxIcon.png");
String title = "You just won 10 random rares!";
@@ -444,7 +431,7 @@ public class Gui_WinLose extends JFrame implements NewConstants {
if (wonMatch && model.qa != null) {
model.quest.addQuestsPlayed();
ArrayList<String> questRewardCards = model.qa.getCardRewardList();
ArrayList<CardPrinted> questRewardCards = model.qa.getCardRewardList();
long questRewardCredits = model.qa.getCreditsReward();
StringBuilder sb = new StringBuilder();
@@ -452,13 +439,11 @@ public class Gui_WinLose extends JFrame implements NewConstants {
if (questRewardCards != null) {
sb.append("You won the following cards:\r\n\r\n");
for (String cardName : questRewardCards) {
sb.append(cardName);
for (CardPrinted cardName : questRewardCards) {
sb.append(cardName.getName());
sb.append("\r\n");
model.quest.addCard(cardName);
}
model.quest.addToNewList(questRewardCards);
model.quest.addAllCards(questRewardCards);
sb.append("\r\n");
}
sb.append("Quest Bounty: ");
@@ -492,12 +477,16 @@ public class Gui_WinLose extends JFrame implements NewConstants {
// Random rare given at 50% chance (65% with luck upgrade)
if (model.quest.shouldAddAdditionalCards(wonMatch)) {
Card c = AllZone.getCardFactory().getCard(model.quest.addRandomRare(), AllZone.getHumanPlayer());
c.setCurSetCode(c.getMostRecentSet());
String fileName = CardUtil.buildFilename(c) + ".jpg";
ImageIcon icon = getCardIcon(fileName);
CardPrinted card = model.quest.addRandomRare();
ArrayList<CardPrinted> rares = new ArrayList<CardPrinted>();
rares.add(card);
String title = "You have won a random rare.";
JOptionPane.showMessageDialog(null, "", title, JOptionPane.INFORMATION_MESSAGE, icon);
ImageIcon icon = getIcon("BoxIcon.png");
CardListViewer c = new CardListViewer("Random rares", title, rares, icon);
c.show();
}
}
}

View File

@@ -6,6 +6,8 @@ import com.google.common.base.Function;
import com.google.common.collect.ComputationException;
import com.google.common.collect.MapMaker;
import com.mortennobel.imagescaling.ResampleOp;
import forge.card.CardPrinted;
import forge.properties.ForgeProps;
import forge.properties.NewConstants;
@@ -139,6 +141,19 @@ public class ImageCache implements NewConstants {
return getImage(key + "#" + scale);
}
public static BufferedImage getImage(CardPrinted card, int width, int height) {
String key = card.getImageFilename();
BufferedImage original = getImage(key);
if (original == null) return null;
double scale = min((double) width / original.getWidth(), (double) height / original.getHeight());
//here would be the place to limit the scaling, scaling option in menu ?
if (scale > 1 && !scaleLargerThanOriginal) scale = 1;
return getImage(key + "#" + scale);
}
/**
* <p>getOriginalImage.</p>
*
@@ -206,70 +221,7 @@ public class ImageCache implements NewConstants {
* @return a {@link java.lang.String} object.
*/
private static String getKey(Card card) {
/* String key = GuiDisplayUtil.cleanString(card.getImageName());
//if(card.isBasicLand() && card.getRandomPicture() != 0) key += card.getRandomPicture();
File path = null;
String tkn = "";
if (card.isToken() && !card.isCopiedToken())
{
path = ForgeProps.getFile(IMAGE_TOKEN);
tkn = TOKEN;
}
else
path = ForgeProps.getFile(IMAGE_BASE);
File f = null;
if (!card.getCurSetCode().equals(""))
{
String nn = "";
if (card.getRandomPicture() > 0)
nn = Integer.toString(card.getRandomPicture() + 1);
StringBuilder sbKey = new StringBuilder();
//First try 3 letter set code with MWS filename format
sbKey.append(card.getCurSetCode() + "/");
sbKey.append(GuiDisplayUtil.cleanStringMWS(card.getName()) + nn + ".full");
f = new File(path, sbKey.toString() + ".jpg");
if (f.exists())
return sbKey.toString();
sbKey = new StringBuilder();
//Second, try 2 letter set code with MWS filename format
sbKey.append(SetInfoUtil.getSetCode2_SetCode3(card.getCurSetCode()) + "/");
sbKey.append(GuiDisplayUtil.cleanStringMWS(card.getName()) + nn + ".full");
f = new File(path, sbKey.toString() + ".jpg");
if (f.exists())
return sbKey.toString();
sbKey = new StringBuilder();
//Third, try 3 letter set code with Forge filename format
sbKey.append(card.getCurSetCode() + "/");
sbKey.append(GuiDisplayUtil.cleanString(card.getName()) + nn);
f = new File(path, sbKey.toString() + ".jpg");
if (f.exists())
return sbKey.toString();
//Last, give up with set images, go with the old picture type
f = new File(path, key + nn + ".jpg");
if (f.exists())
return key;
//if still no file, download if option enabled
}
int n = card.getRandomPicture();
if (n > 0)
key += n;
key += tkn;
// key = GuiDisplayUtil.cleanString(key);
*/
if (card.isToken() && !card.isCopiedToken())
return GuiDisplayUtil.cleanString(card.getImageName()) + TOKEN;

View File

@@ -2,6 +2,8 @@ package forge;
import java.util.ArrayList;
import forge.card.CardPrinted;
/**
* <p>Quest_Assignment class.</p>
*
@@ -23,7 +25,7 @@ public class Quest_Assignment {
private boolean repeatable;
private ArrayList<String> cardRewardList = new ArrayList<String>();
private ArrayList<CardPrinted> cardRewardList = new ArrayList<CardPrinted>();
private CardList human = new CardList();
private ArrayList<String> compy = new ArrayList<String>();
@@ -257,7 +259,7 @@ public class Quest_Assignment {
*
* @param cardRewardList a {@link java.util.ArrayList} object.
*/
public void setCardRewardList(ArrayList<String> cardRewardList) {
public void setCardRewardList(ArrayList<CardPrinted> cardRewardList) {
this.cardRewardList = cardRewardList;
}
@@ -266,7 +268,7 @@ public class Quest_Assignment {
*
* @return a {@link java.util.ArrayList} object.
*/
public ArrayList<String> getCardRewardList() {
public ArrayList<CardPrinted> getCardRewardList() {
return cardRewardList;
}
}

View File

@@ -5,9 +5,20 @@ package forge;
//import java.io.File;
//import java.io.FileReader;
import forge.card.CardRules;
import forge.card.CardDb;
import forge.card.CardRules.Predicates;
import forge.card.CardPool;
import forge.card.CardPoolView;
import forge.card.CardRarity;
import forge.card.CardPrinted;
import forge.properties.NewConstants;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import net.slightlymagic.maxmtg.Predicate;
/**
@@ -18,72 +29,26 @@ import java.util.ArrayList;
*/
public class ReadBoosterPack implements NewConstants {
// final private static String comment = "//";
private CardList commonCreatureList = new CardList();
private CardList commonNonCreatureList = new CardList();
private CardList commonList = new CardList();
private CardList uncommonList = new CardList();
private CardList rareList = new CardList();
/*
//average creature versus noncreature
ReadBoosterPack r = new ReadBoosterPack();
double n = 0; //total
int nCreature = 0;
int nSpell = 0;
for(int i = 0; i < 1000; i++)
{
CardList list = r.getBoosterPack();
int c = list.getType("Creature").size();
nCreature += c;
nSpell += (15 -c);
n += 15;
}
System.out.println(nCreature / n +" - " +nSpell / n);
System.exit(0);
*/
private List<CardPrinted> mythics;
private List<CardPrinted> rares;
private List<CardPrinted> uncommons;
private List<CardPrinted> commons;
private List<CardPrinted> commonCreatures;
private List<CardPrinted> commonNonCreatures;
/**
* <p>Constructor for ReadBoosterPack.</p>
*/
public ReadBoosterPack() {
setup();
}
mythics = CardPrinted.Predicates.Presets.isMythicRare.select(CardDb.instance().getAllUniqueCards());
rares = CardPrinted.Predicates.Presets.isRare.select(CardDb.instance().getAllUniqueCards());
commons = CardPrinted.Predicates.Presets.isCommon.select(CardDb.instance().getAllUniqueCards());
uncommons = CardPrinted.Predicates.Presets.isUncommon.select(CardDb.instance().getAllUniqueCards());
//returns "common", "uncommon", or "rare"
/**
* <p>getRarity.</p>
*
* @param cardName a {@link java.lang.String} object.
* @return a {@link java.lang.String} object.
*/
public String getRarity(String cardName) {
if (commonList.containsName(cardName)) return "Common";
if (uncommonList.containsName(cardName)) return "Uncommon";
if (rareList.containsName(cardName)) return "Rare";
ArrayList<String> land = new ArrayList<String>();
land.add("Forest");
land.add("Plains");
land.add("Swamp");
land.add("Mountain");
land.add("Island");
land.add("Terramorphic Expanse");
land.add("Snow-Covered Forest");
land.add("Snow-Covered Plains");
land.add("Snow-Covered Swamp");
land.add("Snow-Covered Mountain");
land.add("Snow-Covered Island");
if (land.contains(cardName)) return "Land";
return "error";
commonCreatures = new ArrayList<CardPrinted>();
commonNonCreatures = new ArrayList<CardPrinted>();
CardRules.Predicates.Presets.isCreature.split(commons, CardPrinted.fnGetRules, commonCreatures, commonNonCreatures);
}
/**
@@ -91,58 +56,66 @@ public class ReadBoosterPack implements NewConstants {
*
* @return a {@link forge.CardList} object.
*/
public CardList getBoosterPack5() {
CardList list = new CardList();
for (int i = 0; i < 5; i++)
list.addAll(getBoosterPack());
public CardPoolView getBoosterPack5() {
CardPool list = new CardPool();
for (int i = 0; i < 5; i++) { list.addAll(getBoosterPack()); }
for (int i = 0; i < 20; i++) {
list.add(AllZone.getCardFactory().getCard("Forest", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Island", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Plains", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Mountain", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Swamp", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Snow-Covered Forest", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Snow-Covered Island", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Snow-Covered Plains", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Snow-Covered Mountain", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Snow-Covered Swamp", AllZone.getHumanPlayer()));
}
addBasicLands(list, 20);
addBasicSnowLands(list, 20);
for (int i = 0; i < 4; i++)
list.add(AllZone.getCardFactory().getCard("Terramorphic Expanse", AllZone.getHumanPlayer()));
list.add(CardDb.instance().getCard("Terramorphic Expanse", "M10"));
return list;
}//getBoosterPack5()
public static final void addBasicLands(final CardPool pool, final int count) {
for (int i = 0; i < count; i++) {
pool.add(CardDb.instance().getCard("Forest", "M10"));
pool.add(CardDb.instance().getCard("Island", "M10"));
pool.add(CardDb.instance().getCard("Plains", "M10"));
pool.add(CardDb.instance().getCard("Mountain", "M10"));
pool.add(CardDb.instance().getCard("Swamp", "M10"));
}
}
public static final void addBasicSnowLands(final CardPool pool, final int count) {
for (int i = 0; i < count; i++) {
pool.add(CardDb.instance().getCard("Snow-Covered Forest", "ICE"));
pool.add(CardDb.instance().getCard("Snow-Covered Island", "ICE"));
pool.add(CardDb.instance().getCard("Snow-Covered Plains", "ICE"));
pool.add(CardDb.instance().getCard("Snow-Covered Mountain", "ICE"));
pool.add(CardDb.instance().getCard("Snow-Covered Swamp", "ICE"));
}
}
/**
* <p>getBoosterPack.</p>
*
* @return a {@link forge.CardList} object.
*/
public CardList getBoosterPack() {
CardList pack = new CardList();
public CardPoolView getBoosterPack() {
CardPool pack = new CardPool();
pack.add(getRandomCard(rareList));
pack.add(getRandomCard(rares));
for (int i = 0; i < 3; i++)
pack.add(getRandomCard(uncommonList));
pack.add(getRandomCard(uncommons));
//11 commons, 7 creature 4 noncreature
CardList variety;
List<CardPrinted> variety;
for (int i = 0; i < 7; i++) {
variety = getVariety(commonCreatureList);
variety = getVariety(commonCreatures);
pack.add(getRandomCard(variety));
}
for (int i = 0; i < 4; i++) {
variety = getVariety(commonNonCreatureList);
variety = getVariety(commonNonCreatures);
pack.add(getRandomCard(variety));
}
if (pack.size() != 15)
if (pack.countAll() != 15)
throw new RuntimeException("ReadBoosterPack : getBoosterPack() error, pack is not 15 card - "
+ pack.size());
+ pack.countAll());
return pack;
}
@@ -154,8 +127,8 @@ public class ReadBoosterPack implements NewConstants {
* @param questLevel a int.
* @return a {@link forge.CardList} object.
*/
public CardList getShopCards(int numberWins, int questLevel) {
CardList list = new CardList();
public CardPoolView getShopCards(int numberWins, int questLevel) {
CardPool list = new CardPool();
// Number of Packs granted
int levelPacks = questLevel > 0 ? 8 / questLevel / 2 : 4;
@@ -166,30 +139,17 @@ public class ReadBoosterPack implements NewConstants {
for (int i = 0; i < totalPacks; i++) {
// TODO: Balance CardPool Availability
// Each "Pack" yields 1 Rare, 3 Uncommon, 7 Commons
list.add(getRandomCard(rareList));
list.add(getRandomCard(rares));
for (int j = 0; j < 7; j++) {
if (j < 3)
list.add(getRandomCard(uncommonList));
list.add(getRandomCard(uncommons));
list.add(getRandomCard(commonList));
list.add(getRandomCard(commons));
}
}
for (int i = 0; i < 10; i++) {
// Add basic land availability
list.add(AllZone.getCardFactory().getCard("Forest", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Island", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Plains", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Mountain", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Swamp", AllZone.getHumanPlayer()));
if (i < 5) {
list.add(AllZone.getCardFactory().getCard("Snow-Covered Forest", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Snow-Covered Island", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Snow-Covered Plains", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Snow-Covered Mountain", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Snow-Covered Swamp", AllZone.getHumanPlayer()));
}
}
addBasicLands(list, 10);
addBasicSnowLands(list, 5);
return list;
}
@@ -201,16 +161,13 @@ public class ReadBoosterPack implements NewConstants {
* @param in a {@link forge.CardList} object.
* @return a {@link forge.CardList} object.
*/
private CardList getVariety(CardList in) {
CardList out = new CardList();
private List<CardPrinted> getVariety(List<CardPrinted> in) {
List<CardPrinted> out = new ArrayList<CardPrinted>();
Collections.shuffle(in, MyRandom.random);
String color[] = Constant.Color.Colors;
Card check;
in.shuffle();
for (int i = 0; i < color.length; i++) {
check = findColor(in, color[i]);
if (check != null) out.add(check);
for (int i = 0; i < Constant.Color.Colors.length; i++) {
CardPrinted check = findColor(in, i);
if (check != null) { out.add(check); }
}
return out;
@@ -223,11 +180,19 @@ public class ReadBoosterPack implements NewConstants {
* @param color a {@link java.lang.String} object.
* @return a {@link forge.Card} object.
*/
private Card findColor(CardList in, String color) {
for (int i = 0; i < in.size(); i++)
if (CardUtil.getColors(in.get(i)).contains(color)) return in.get(i);
return null;
private CardPrinted findColor(final List<CardPrinted> in, final int color) {
Predicate<CardRules> filter = null;
switch (color) {
case 0: filter = CardRules.Predicates.Presets.isWhite; break;
case 1: filter = CardRules.Predicates.Presets.isBlue; break;
case 2: filter = CardRules.Predicates.Presets.isBlack; break;
case 3: filter = CardRules.Predicates.Presets.isRed; break;
case 4: filter = CardRules.Predicates.Presets.isGreen; break;
case 5: filter = CardRules.Predicates.Presets.isColorless; break;
default: break;
}
if (null == filter) { return null; }
return filter.first(in, CardPrinted.fnGetRules);
}
@@ -237,236 +202,12 @@ public class ReadBoosterPack implements NewConstants {
* @param list a {@link forge.CardList} object.
* @return a {@link forge.Card} object.
*/
private Card getRandomCard(CardList list) {
private CardPrinted getRandomCard(List<CardPrinted> list) {
for (int i = 0; i < 10; i++)
list.shuffle();
int index = MyRandom.random.nextInt(list.size());
Card c = AllZone.getCardFactory().copyCard(list.get(index));
c.setRarity("rare");
return c;
}//getRandomCard()
/**
* <p>setup.</p>
*/
private void setup() {
//commonList = readFile(ForgeProps.getFile(REGULAR.COMMON));
//uncommonList = readFile(ForgeProps.getFile(REGULAR.UNCOMMON));
//rareList = readFile(ForgeProps.getFile(REGULAR.RARE));
//commonCreatureList = commonList.getType("Creature");
//commonNonCreatureList = commonList.filter(new CardListFilter() {
// public boolean addCard(Card c) {
// return !c.isCreature();
// }
//});
for (Card aCard : AllZone.getCardFactory()) {
String rr = aCard.getSVar("Rarity");
if (rr.equals("Common")) {
commonList.add(aCard);
if (aCard.isCreature())
commonCreatureList.add(aCard);
else
commonNonCreatureList.add(aCard);
} else if (rr.equals("Uncommon")) {
uncommonList.add(aCard);
} else if (rr.equals("Rare")) {
rareList.add(aCard);
} else if (rr.equals("Mythic")) {
rareList.add(aCard);
}
}
}//setup()
/* private CardList readFile(File file) {
CardList cardList = new CardList();
BufferedReader in;
try {
in = new BufferedReader(new FileReader(file));
String line = in.readLine();
//stop reading if end of file or blank line is read
while(line != null && (line.trim().length() != 0)) {
Card c;
if(!line.startsWith(comment)) {
c = AllZone.getCardFactory().getCard(line.trim(), AllZone.getHumanPlayer());
cardList.add(c);
}
line = in.readLine();
}//if
} catch(Exception ex) {
ErrorViewer.showError(ex);
throw new RuntimeException("ReadBoosterPack : readFile error, " + ex);
}
return cardList;
}//readFile()
*/
}
/*
import java.util.*;
import java.io.*;
public class ReadBoosterPack
{
// final private String commonFilename = Constant.IO.baseDir +"data/common.txt";
// final private String uncommonFilename = Constant.IO.baseDir +"data/uncommon.txt";
// final private String rareFilename = Constant.IO.baseDir +"data/rare.txt";
final private String commonFilename = "common.txt";
final private String uncommonFilename = "uncommon.txt";
final private String rareFilename = "rare.txt";
final private String comment = "//";
private ArrayList commonList;
private ArrayList uncommonList;
private ArrayList rareList;
public static void main(String[] args)
{
ReadBoosterPack r = new ReadBoosterPack();
CardList list = r.getBoosterPack();
double n = 0; //total
int nCreature = 0;
int nSpell = 0;
for(int i = 0; i < 2; i++)
{
int c = list.getType("Creature").size();
nCreature += c;
nSpell += (15 -c);
n += 15;
}
System.out.println(nCreature / n +" - " +nSpell / n);
System.exit(0);
}//main()
public ReadBoosterPack() {setup();}
//returns "common", "uncommon", or "rare"
public String getRarity(String cardName)
{
if(commonList.contains(cardName))
return "Common";
if(uncommonList.contains(cardName))
return "Uncommon";
if(rareList.contains(cardName))
return "Rare";
ArrayList land = new ArrayList();
land.add("Forest");
land.add("Plains");
land.add("Swamp");
land.add("Mountain");
land.add("Island");
land.add("Terramorphic Expanse");
if(land.contains(cardName))
return "Land";
return "error";
}
public CardList getBoosterPack5()
{
CardList list = new CardList();
for(int i = 0; i < 5; i++)
list.addAll(getBoosterPack());
for(int i = 0; i < 40; i++)
{
list.add(AllZone.getCardFactory().getCard("Forest", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Island", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Plains", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Mountain", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Swamp", AllZone.getHumanPlayer()));
}
for(int i = 0; i < 4; i++)
list.add(AllZone.getCardFactory().getCard("Terramorphic Expanse", AllZone.getHumanPlayer()));
return list;
}//getBoosterPack5()
public CardList getBoosterPack()
{
CardList pack = new CardList();
pack.add(getRandomCard(rareList));
for(int i = 0; i < 3; i++)
pack.add(getRandomCard(uncommonList));
for(int i = 0; i < 11; i++)
pack.add(getRandomCard(commonList));
return pack;
}
private Card getRandomCard(ArrayList list)
{
for(int i = 0; i < 10; i++)
Collections.shuffle(list, MyRandom.random);
int index = MyRandom.random.nextInt(list.size());
String name = list.get(index).toString();
Card c = AllZone.getCardFactory().getCard(name, AllZone.getHumanPlayer());
c.setRarity("rare");
return c;
return list.get(index);
}//getRandomCard()
private void setup()
{
commonList = readFile(commonFilename);
uncommonList = readFile(uncommonFilename);
rareList = readFile(rareFilename);
checkName(commonList);
checkName(uncommonList);
checkName(rareList);
}
private void checkName(ArrayList name)
{
for(int i = 0; i < name.size(); i++)
AllZone.getCardFactory().getCard(name.get(i).toString(), AllZone.getHumanPlayer());
}
//returns an ArrayList of Strings, the names of the cards read
private ArrayList readFile(String filename)
{
ArrayList cardName = new ArrayList();
BufferedReader in;
try{
in = new BufferedReader(new FileReader(filename));
String line = in.readLine();
//stop reading if end of file or blank line is read
while(line != null && (line.trim().length() != 0))
{
if(! line.startsWith(comment))
cardName.add(line.trim());
line = in.readLine();
}//if
}catch(Exception ex){throw new RuntimeException("ReadBoosterPack : readFile error, " + ex);}
return cardName;
}//readFile()
}
*/

View File

@@ -1,6 +1,12 @@
package forge;
import forge.card.CardRules;
import forge.card.CardRules.Predicates;
import forge.card.CardDb;
import forge.card.CardPool;
import forge.card.CardPoolView;
import forge.card.CardPrinted;
import forge.error.ErrorViewer;
import forge.properties.ForgeProps;
import forge.properties.NewConstants;
@@ -9,6 +15,10 @@ import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import net.slightlymagic.maxmtg.Predicate;
/**
@@ -22,12 +32,12 @@ public class ReadDraftBoosterPack implements NewConstants {
/** Constant <code>comment="//"</code> */
final private static String comment = "//";
private CardList commonCreatureList = new CardList();
private CardList commonNonCreatureList = new CardList();
private List<CardPrinted> commonCreatureList = new ArrayList<CardPrinted>();
private List<CardPrinted> commonNonCreatureList = new ArrayList<CardPrinted>();
private CardList commonList = new CardList();
private CardList uncommonList = new CardList();
private CardList rareList = new CardList();
private List<CardPrinted> commonList = new ArrayList<CardPrinted>();
private List<CardPrinted> uncommonList = new ArrayList<CardPrinted>();
private List<CardPrinted> rareList = new ArrayList<CardPrinted>();
/**
* <p>Constructor for ReadDraftBoosterPack.</p>
@@ -36,71 +46,43 @@ public class ReadDraftBoosterPack implements NewConstants {
setup();
}
//returns "common", "uncommon", or "rare"
/**
* <p>getRarity.</p>
*
* @param cardName a {@link java.lang.String} object.
* @return a {@link java.lang.String} object.
*/
public String getRarity(String cardName) {
if (commonList.containsName(cardName)) return "Common";
if (uncommonList.containsName(cardName)) return "Uncommon";
if (rareList.containsName(cardName)) return "Rare";
public CardPoolView getBoosterPack5() {
CardPool list = new CardPool();
for (int i = 0; i < 5; i++) { list.addAll(getBoosterPack()); }
ArrayList<String> land = new ArrayList<String>();
land.add("Forest");
land.add("Plains");
land.add("Swamp");
land.add("Mountain");
land.add("Island");
land.add("Terramorphic Expanse");
land.add("Snow-Covered Forest");
land.add("Snow-Covered Plains");
land.add("Snow-Covered Swamp");
land.add("Snow-Covered Mountain");
land.add("Snow-Covered Island");
if (land.contains(cardName)) return "Land";
return "error";
}
/**
* <p>getBoosterPack5.</p>
*
* @return a {@link forge.CardList} object.
*/
public CardList getBoosterPack5() {
CardList list = new CardList();
for (int i = 0; i < 5; i++)
list.addAll(getBoosterPack());
for (int i = 0; i < 20; i++) {
list.add(AllZone.getCardFactory().getCard("Forest", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Island", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Plains", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Mountain", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Swamp", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Snow-Covered Forest", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Snow-Covered Island", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Snow-Covered Plains", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Snow-Covered Mountain", AllZone.getHumanPlayer()));
list.add(AllZone.getCardFactory().getCard("Snow-Covered Swamp", AllZone.getHumanPlayer()));
}
addBasicLands(list, 20);
addBasicSnowLands(list, 20);
for (int i = 0; i < 4; i++)
list.add(AllZone.getCardFactory().getCard("Terramorphic Expanse", AllZone.getHumanPlayer()));
list.add(CardDb.instance().getCard("Terramorphic Expanse", "M10"));
return list;
}//getBoosterPack5()
public static final void addBasicLands(final CardPool pool, final int count) {
CardDb db = CardDb.instance();
pool.add(db.getCard("Forest", "M10"), count);
pool.add(db.getCard("Island", "M10"), count);
pool.add(db.getCard("Plains", "M10"), count);
pool.add(db.getCard("Mountain", "M10"), count);
pool.add(db.getCard("Swamp", "M10"), count);
}
public static final void addBasicSnowLands(final CardPool pool, final int count) {
CardDb db = CardDb.instance();
pool.add(db.getCard("Snow-Covered Forest", "ICE"), count);
pool.add(db.getCard("Snow-Covered Island", "ICE"), count);
pool.add(db.getCard("Snow-Covered Plains", "ICE"), count);
pool.add(db.getCard("Snow-Covered Mountain", "ICE"), count);
pool.add(db.getCard("Snow-Covered Swamp", "ICE"), count);
}
/**
* <p>getBoosterPack.</p>
*
* @return a {@link forge.CardList} object.
*/
public CardList getBoosterPack() {
CardList pack = new CardList();
public CardPoolView getBoosterPack() {
CardPool pack = new CardPool();
pack.add(getRandomCard(rareList));
@@ -108,7 +90,7 @@ public class ReadDraftBoosterPack implements NewConstants {
pack.add(getRandomCard(uncommonList));
//11 commons, 7 creature 4 noncreature
CardList variety;
List<CardPrinted> variety;
for (int i = 0; i < 7; i++) {
variety = getVariety(commonCreatureList);
pack.add(getRandomCard(variety));
@@ -119,159 +101,72 @@ public class ReadDraftBoosterPack implements NewConstants {
pack.add(getRandomCard(variety));
}
if (pack.size() != 15)
if (pack.countAll() != 15)
throw new RuntimeException("ReadDraftBoosterPack : getBoosterPack() error, pack is not 15 cards - "
+ pack.size());
+ pack.countAll());
return pack;
}
/**
* <p>getShopCards.</p>
*
* @param numberWins a int.
* @return a {@link forge.CardList} object.
*/
public CardList getShopCards(int numberWins) {
CardList list = new CardList();
int numberRares = 1 + numberWins / 15;
if (numberRares > 10)
numberRares = 10;
for (int i = 0; i < numberRares; i++)
list.add(getRandomCard(rareList));
int numberUncommons = 3 + numberWins / 10;
if (numberUncommons > 20)
numberUncommons = 20;
for (int i = 0; i < numberUncommons; i++)
list.add(getRandomCard(uncommonList));
int numberCommons = 5 + numberWins / 5;
if (numberCommons > 35)
numberCommons = 35;
for (int i = 0; i < numberCommons; i++)
list.add(getRandomCard(commonList));
return list;
}
//return CardList of 5 or 6 cards, one for each color and maybe an artifact
/**
* <p>getVariety.</p>
*
* @param in a {@link forge.CardList} object.
* @return a {@link forge.CardList} object.
*/
private CardList getVariety(CardList in) {
CardList out = new CardList();
private List<CardPrinted> getVariety(List<CardPrinted> in) {
List<CardPrinted> out = new ArrayList<CardPrinted>();
Collections.shuffle(in, MyRandom.random);
String color[] = Constant.Color.Colors;
Card check;
in.shuffle();
for (int i = 0; i < color.length; i++) {
check = findColor(in, color[i]);
if (check != null) out.add(check);
for (int i = 0; i < Constant.Color.Colors.length; i++) {
CardPrinted check = findColor(in, i);
if (check != null) { out.add(check); }
}
return out;
}//getVariety()
/**
* <p>findColor.</p>
*
* @param in a {@link forge.CardList} object.
* @param color a {@link java.lang.String} object.
* @return a {@link forge.Card} object.
*/
private Card findColor(CardList in, String color) {
for (int i = 0; i < in.size(); i++)
if (CardUtil.getColors(in.get(i)).contains(color)) return in.get(i);
return null;
private static CardPrinted findColor(final List<CardPrinted> in, final int color) {
Predicate<CardRules> filter = null;
switch (color) {
case 0: filter = CardRules.Predicates.Presets.isWhite; break;
case 1: filter = CardRules.Predicates.Presets.isBlue; break;
case 2: filter = CardRules.Predicates.Presets.isBlack; break;
case 3: filter = CardRules.Predicates.Presets.isRed; break;
case 4: filter = CardRules.Predicates.Presets.isGreen; break;
case 5: filter = CardRules.Predicates.Presets.isColorless; break;
default: break;
}
if (null == filter) { return null; }
return filter.first(in, CardPrinted.fnGetRules);
}
/**
* <p>getRandomCard.</p>
*
* @param list a {@link forge.CardList} object.
* @return a {@link forge.Card} object.
*/
private Card getRandomCard(CardList list) {
for (int i = 0; i < 10; i++)
list.shuffle();
private static CardPrinted getRandomCard(final List<CardPrinted> list) {
for (int i = 0; i < 10; i++) {
Collections.shuffle(list, MyRandom.random);
}
int index = MyRandom.random.nextInt(list.size());
Card c = AllZone.getCardFactory().copyCard(list.get(index));
c.setRarity("rare");
return c;
return list.get(index);
}//getRandomCard()
/**
* <p>setup.</p>
*/
private void setup() {
commonList = readFile(ForgeProps.getFile(DRAFT.COMMON));
uncommonList = readFile(ForgeProps.getFile(DRAFT.UNCOMMON));
rareList = readFile(ForgeProps.getFile(DRAFT.RARE));
CardDb db = CardDb.instance();
commonList = db.getCards(readFile(ForgeProps.getFile(DRAFT.COMMON)));
uncommonList = db.getCards(readFile(ForgeProps.getFile(DRAFT.UNCOMMON)));
rareList = db.getCards(readFile(ForgeProps.getFile(DRAFT.RARE)));
System.out.println("commonList size:" + commonList.size());
System.out.println("ucommonList size:" + uncommonList.size());
System.out.println("rareList size:" + rareList.size());
commonCreatureList = commonList.getType("Creature");
commonNonCreatureList = commonList.filter(new CardListFilter() {
public boolean addCard(Card c) {
return !c.isCreature();
}
});
CardRules.Predicates.Presets.isCreature.split(commonList, CardPrinted.fnGetRules,
commonCreatureList, commonNonCreatureList);
/* CardList AllCards = AllZone.getCardFactory().getAllCards();
for (int i=0; i<AllCards.size(); i++)
{
Card aCard = AllCards.get(i);
String rr = aCard.getSVar("Rarity");
if (rr.equals("Common"))
{
commonList.add(aCard);
if (aCard.isCreature())
commonCreatureList.add(aCard);
else
commonNonCreatureList.add(aCard);
}
else if (rr.equals("Uncommon"))
{
uncommonList.add(aCard);
}
else if (rr.equals("Rare"))
{
rareList.add(aCard);
}
else if (rr.equals("Mythic"))
{
rareList.add(aCard);
}
}*/
}//setup()
/**
* <p>readFile.</p>
*
* @param file a {@link java.io.File} object.
* @return a {@link forge.CardList} object.
*/
private CardList readFile(File file) {
CardList cardList = new CardList();
private List<String> readFile(final File file) {
List<String> cardList = new ArrayList<String>();
BufferedReader in;
try {
@@ -280,14 +175,12 @@ for (int i=0; i<AllCards.size(); i++)
//stop reading if end of file or blank line is read
while (line != null && (line.trim().length() != 0)) {
Card c;
if (!line.startsWith(comment)) {
c = AllZone.getCardFactory().getCard(line.trim(), AllZone.getHumanPlayer());
cardList.add(c);
cardList.add(line.trim());
}
line = in.readLine();
}//if
}
} catch (Exception ex) {
ErrorViewer.showError(ex);

View File

@@ -25,7 +25,7 @@ public class ReadPriceList implements NewConstants {
/** Constant <code>comment="//"</code> */
final private static String comment = "//";
private HashMap<String, Long> priceMap;
private HashMap<String, Integer> priceMap;
/**
* <p>Constructor for ReadPriceList.</p>
@@ -47,9 +47,9 @@ public class ReadPriceList implements NewConstants {
* @param file a {@link java.io.File} object.
* @return a {@link java.util.HashMap} object.
*/
private HashMap<String, Long> readFile(File file) {
private HashMap<String, Integer> readFile(File file) {
BufferedReader in;
HashMap<String, Long> map = new HashMap<String, Long>();
HashMap<String, Integer> map = new HashMap<String, Integer>();
Random r = MyRandom.random;
try {
@@ -66,7 +66,7 @@ public class ReadPriceList implements NewConstants {
//System.out.println("Name: " + name + ", Price: " + price);
try {
long val = Long.parseLong(price.trim());
int val = Integer.parseInt(price.trim());
if (!(name.equals("Plains") || name.equals("Island") || name.equals("Swamp") || name.equals("Mountain") || name.equals("Forest") ||
name.equals("Snow-Covered Plains") || name.equals("Snow-Covered Island") || name.equals("Snow-Covered Swamp") || name.equals("Snow-Covered Mountain") || name.equals("Snow-Covered Forest"))) {
@@ -77,9 +77,9 @@ public class ReadPriceList implements NewConstants {
ff = (float) r.nextInt(50) * (float) .01;
if (r.nextInt(100) < 50) // -ff%
val = (long) ((float) val * ((float) 1 - ff));
val = (int) ((float) val * ((float) 1 - ff));
else // +ff%
val = (long) ((float) val * ((float) 1 + ff));
val = (int) ((float) val * ((float) 1 + ff));
}
map.put(name, val);
@@ -103,7 +103,7 @@ public class ReadPriceList implements NewConstants {
*
* @return a {@link java.util.Map} object.
*/
public Map<String, Long> getPriceList() {
public Map<String, Integer> getPriceList() {
return priceMap;
}
}

View File

@@ -1,5 +1,6 @@
package forge;
import forge.card.CardPool;
import forge.card.spellability.Ability_Mana;
import forge.deck.Deck;
import forge.gui.GuiUtils;
@@ -169,11 +170,11 @@ public class SealedDeck {
*
* @return a {@link forge.CardList} object.
*/
public CardList getCardpool() {
CardList pool = new CardList();
public CardPool getCardpool() {
CardPool pool = new CardPool();
for (int i = 0; i < packs.size(); i++)
pool.addAll(packs.get(i).getBoosterPack());
pool.addAllCards(packs.get(i).getBoosterPack());
return pool;
}

View File

@@ -1,442 +0,0 @@
package forge;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import java.awt.event.*;
import java.util.Arrays;
/**
* <p>TableModel class.</p>
*
* @author Forge
* @version $Id$
*/
class TableModel extends AbstractTableModel {
/**
*
*/
private static final long serialVersionUID = 1L;
//holds 1 copy of each card, DOES NOT HOLD multiple cards with the same name
private CardList dataNoCopies = new CardList();
//holds multiple card
//example: if there are 4 Elvish Pipers, dataNoCopies has 1 copy, and dataCopies has 3
private CardList dataCopies = new CardList();
//used by sort(), holds old data to compare with sorted data, to see if any change was made
//private CardList oldList = new CardList();
private CardContainer cardDetail;
//private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "R", "AI"};
private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "R", "Set", "AI"};
//used to resort(), used when addCard(Card) is called
private int recentSortedColumn;
private boolean recentAscending;
/**
* <p>Constructor for TableModel.</p>
*
* @param cd a {@link forge.CardContainer} object.
*/
public TableModel(CardContainer cd) {
this(new CardList(), cd);
}
/**
* <p>Constructor for TableModel.</p>
*
* @param inData a {@link forge.CardList} object.
* @param in_cardDetail a {@link forge.CardContainer} object.
*/
public TableModel(CardList inData, CardContainer in_cardDetail) {
cardDetail = in_cardDetail;
//intialize dataNoCopies and dataCopies
addCard(inData);
}
/**
* <p>resizeCols.</p>
*
* @param table a {@link javax.swing.JTable} object.
*/
public void resizeCols(final JTable table) {
TableColumn column = null;
for (int i = 0; i < table.getColumnCount(); i++) {
column = table.getColumnModel().getColumn(i);
if (i == 0) {
column.setPreferredWidth(35); // Qty
column.setMaxWidth(35);
column.setMinWidth(35);
} else if (i == 1) {
column.setPreferredWidth(190); // Name
column.setMinWidth(170);
column.setMaxWidth(200);
} else if (i == 2) {
column.setPreferredWidth(80); // Cost
column.setMinWidth(70);
column.setMaxWidth(90);
} else if (i == 3) {
column.setPreferredWidth(70); // Color
column.setMaxWidth(70);
column.setMinWidth(70);
} else if (i == 4) {
column.setPreferredWidth(130); // Type
} else if (i == 5) {
column.setPreferredWidth(50); // Stats
column.setMaxWidth(50);
column.setMinWidth(50);
} else if (i == 6) {
column.setPreferredWidth(25); // R
column.setMaxWidth(25);
column.setMinWidth(25);
} else if (i == 7) {
column.setPreferredWidth(45); // Set
column.setMaxWidth(45);
column.setMinWidth(45);
} else if (i == 8) {
column.setPreferredWidth(30); // AI
column.setMaxWidth(30);
column.setMinWidth(30);
}
}//for
/*for(int j = 0; j < table.getColumnCount(); j++) {
column = table.getColumnModel().getColumn(j);
//System.out.println("col Width:" + column.getPreferredWidth());
}*/
}
/**
* <p>clear.</p>
*/
public void clear() {
dataNoCopies.clear();
dataCopies.clear();
//fireTableDataChanged();
}
/**
* <p>getCards.</p>
*
* @return a {@link forge.CardList} object.
*/
public CardList getCards() {
CardList all = new CardList();
all.addAll(dataCopies);
all.addAll(dataNoCopies);
return all;
}
/**
* <p>removeCard.</p>
*
* @param c a {@link forge.Card} object.
*/
public void removeCard(Card c) {
//remove card from "dataCopies",
//if not found there, remove card from "dataNoCopies"
int index = findCardName(c.getName(), dataCopies);
if (index != -1) //found card name
dataCopies.remove(index);
else {
index = findCardName(c.getName(), dataNoCopies);
dataNoCopies.remove(index);
}
fireTableDataChanged();
}
/**
* <p>findCardName.</p>
*
* @param name a {@link java.lang.String} object.
* @param list a {@link forge.CardList} object.
* @return a int.
*/
private int findCardName(String name, CardList list) {
for (int i = 0; i < list.size(); i++)
if (list.get(i).getName().equals(name)) return i;
return -1;
}
/**
* <p>addCard.</p>
*
* @param c a {@link forge.Card} object.
*/
public void addCard(Card c) {
if (0 == countQuantity(c, dataNoCopies)) dataNoCopies.add(c);
else dataCopies.add(c);
}
/**
* <p>addCard.</p>
*
* @param c a {@link forge.CardList} object.
*/
public void addCard(CardList c) {
for (int i = 0; i < c.size(); i++)
addCard(c.get(i));
fireTableDataChanged();
}
/**
* <p>rowToCard.</p>
*
* @param row a int.
* @return a {@link forge.Card} object.
*/
public Card rowToCard(int row) {
return dataNoCopies.get(row);
}
/**
* <p>countQuantity.</p>
*
* @param c a {@link forge.Card} object.
* @return a int.
*/
private int countQuantity(Card c) {
return countQuantity(c, dataNoCopies) + countQuantity(c, dataCopies);
}
//CardList data is either class members "dataNoCopies" or "dataCopies"
/**
* <p>countQuantity.</p>
*
* @param c a {@link forge.Card} object.
* @param data a {@link forge.CardList} object.
* @return a int.
*/
private int countQuantity(Card c, CardList data) {
int count = 0;
for (int i = 0; i < data.size(); i++) {
//are the card names and set code the same?
Card dc = data.get(i);
if (dc.getName().equals(c.getName()) &&
dc.getCurSetCode().equals(c.getCurSetCode())) count++;
}
return count;
}
/**
* <p>getRowCount.</p>
*
* @return a int.
*/
public int getRowCount() {
return dataNoCopies.size();
}
/**
* <p>getColumnCount.</p>
*
* @return a int.
*/
public int getColumnCount() {
return column.length;
}
/** {@inheritDoc} */
@Override
public String getColumnName(int n) {
return column[n];
}
/** {@inheritDoc} */
public Object getValueAt(int row, int column) {
return getColumn(dataNoCopies.get(row), column);
}
/**
* <p>Getter for the field <code>column</code>.</p>
*
* @param c a {@link forge.Card} object.
* @param column a int.
* @param column a int.
* @return a {@link java.lang.Object} object.
*/
private Object getColumn(Card c, int column) {
switch (column) {
case 0:
return Integer.valueOf(countQuantity(c));
case 1:
return c.getName();
case 2:
return c.getManaCost();
case 3:
return TableSorter.getColor(c);
case 4:
return GuiDisplayUtil.formatCardType(c);
case 5:
//return c.isCreature()? c.getBaseAttackString() + "/" + c.getBaseDefenseString():"";
if (c.isCreature()) {
return c.getBaseAttackString() + "/" + c.getBaseDefenseString();
} else if (c.isPlaneswalker()) {
return Integer.toString(c.getBaseLoyalty());
}
return "";
case 6:
String rarity = c.getRarity();
if (rarity.equals("new"))
return "n";
else {
if (rarity.length() > 0)
rarity = rarity.substring(0, 1);
}
if (!c.getCurSetCode().equals("")) {
SetInfo si = SetInfoUtil.getSetInfo_Code(c.getSets(), c.getCurSetCode());
if (si != null)
return si.Rarity.substring(0, 1);
}
return rarity;
case 7:
String SC = c.getCurSetCode();
if (!SC.equals(""))
return SC;
case 8:
if (c.getSVar("RemAIDeck").equals("True")
&& c.getSVar("RemRandomDeck").equals("True"))
return "No ?";
else if (c.getSVar("RemAIDeck").equals("True"))
return "No";
else if (c.getSVar("RemRandomDeck").equals("True"))
return "?";
else
return "";
default:
return "error";
}
}
/**
* <p>addListeners.</p>
*
* @param table a {@link javax.swing.JTable} object.
*/
public void addListeners(final JTable table) {
//updates card detail, listens to any key strokes
table.getSelectionModel().addListSelectionListener( new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent arg0) {
int row = table.getSelectedRow();
if (row != -1) {
cardDetail.setCard(dataNoCopies.get(row));
}
}
});
//sorts
MouseListener mouse = new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
TableColumnModel columnModel = table.getColumnModel();
int viewColumn = columnModel.getColumnIndexAtX(e.getX());
int column = table.convertColumnIndexToModel(viewColumn);
if (column != -1) {
//sort ascending
@SuppressWarnings("unused")
boolean change = sort(column, true);
//if(! change)
// sort(column, false);//sort descending
//fireTableDataChanged();
}
}//mousePressed()
};//MouseListener
table.getTableHeader().addMouseListener(mouse);
}//addCardListener()
//called by the GUI when a card is added to re-sort
/**
* <p>resort.</p>
*/
public void resort() {
sort(recentSortedColumn, recentAscending);
//this.fireTableDataChanged();
}
//returns true if any data changed positions
// @SuppressWarnings("unchecked")
// Arrays.sort
/**
* <p>sort.</p>
*
* @param column a int.
* @param ascending a boolean.
* @return a boolean.
*/
public boolean sort(int column, boolean ascending) {
//used by addCard() to resort the cards
recentSortedColumn = column;
recentAscending = ascending;
CardList all = new CardList();
all.addAll(dataNoCopies);
all.addAll(dataCopies);
TableSorter sorter = new TableSorter(all, column, ascending, true);
Card[] array = all.toArray();
Arrays.sort(array, sorter);
/*
//determine if any data changed position
boolean hasChanged = false;
CardList check = removeDuplicateNames(array);
for(int i = 0; i < check.size(); i++)
//do the card names match?
if(! check.get(i).getName().equals(dataNoCopies.get(i).getName()))
hasChanged = true;
*/
//clear everything, and add sorted data back into the model
dataNoCopies.clear();
dataCopies.clear();
addCard(new CardList(array));
//this value doesn't seem to matter:
//return hasChanged;
return true;
}//sort()
/*
private CardList removeDuplicateNames(Card[] c)
{
TreeSet check = new TreeSet();
CardList list = new CardList();
for(int i = 0; i < c.length; i++)
{
if(! check.contains(c[i].getName()))
{
check.add(c[i].getName());
list.add(c[i]);
}
}
return list;
}
*/
}//CardTableModel

View File

@@ -1,258 +0,0 @@
package forge;
import forge.properties.NewConstants;
import java.util.ArrayList;
import java.util.Comparator;
/**
* <p>TableSorter class.</p>
*
* @author Forge
* @version $Id$
*/
@SuppressWarnings("unchecked") // Comparable needs <type>
public class TableSorter implements Comparator<Card>, NewConstants {
private final int column;
private boolean ascending;
private boolean col7mod;
private CardList all;
//used by compare()
@SuppressWarnings("rawtypes")
private Comparable aCom = null;
@SuppressWarnings("rawtypes")
private Comparable bCom = null;
//used if in_column is 7, new cards first - the order is based on cards.txt
//static because this should only be read once
//static to try to reduce file io operations
//private static HashMap<String, Integer> cardsTxt = null;
// 0 1 2 3 4 5 6 7
//private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"}; New cards first - the order is based on cards.txt
/**
* <p>Constructor for TableSorter.</p>
*
* @param in_all a {@link forge.CardList} object.
* @param in_column a int.
* @param in_ascending a boolean.
*/
public TableSorter(CardList in_all, int in_column, boolean in_ascending) {
all = new CardList(in_all.toArray());
column = in_column;
ascending = in_ascending;
}
/**
* <p>Constructor for TableSorter.</p>
*
* @param in_all a {@link forge.CardList} object.
* @param in_column a int.
* @param in_ascending a boolean.
* @param in_col7mod a boolean.
*/
public TableSorter(CardList in_all, int in_column, boolean in_ascending, boolean in_col7mod) {
all = new CardList(in_all.toArray());
column = in_column;
ascending = in_ascending;
col7mod = in_col7mod;
}
/**
* <p>compare.</p>
*
* @param a a {@link forge.Card} object.
* @param b a {@link forge.Card} object.
* @return a int.
*/
final public int compare(Card a, Card b) {
if (column == 0)//Qty
{
aCom = Integer.valueOf(countCardName(a.getName(), all));
bCom = Integer.valueOf(countCardName(b.getName(), all));
} else if (column == 1)//Name
{
aCom = a.getName();
bCom = b.getName();
} else if (column == 2)//Cost
{
aCom = Double.valueOf(CardUtil.getWeightedManaCost(a.getManaCost()));
bCom = Double.valueOf(CardUtil.getWeightedManaCost(b.getManaCost()));
if (a.isLand())
aCom = Double.valueOf(-1);
if (b.isLand())
bCom = Double.valueOf(-1);
} else if (column == 3)//Color
{
aCom = getColor(a);
bCom = getColor(b);
} else if (column == 4)//Type
{
aCom = getType(a);
bCom = getType(b);
} else if (column == 5)//Stats, attack and defense
{
if (a.isCreature()) {
aCom = a.getBaseAttackString() + "." + a.getBaseDefenseString();
} else {
aCom = "";
}
if (b.isCreature()) {
bCom = b.getBaseAttackString() + "." + b.getBaseDefenseString();
} else {
bCom = "";
}
} else if (column == 6)//Rarity
{
aCom = getRarity(a);
bCom = getRarity(b);
} else if (column == 7 && col7mod == false)//Value
{
aCom = getValue(a);
bCom = getValue(b);
} else if (column == 7 && col7mod == true)//Set
{
aCom = SetInfoUtil.getIndexByCode(a.getCurSetCode());
bCom = SetInfoUtil.getIndexByCode(b.getCurSetCode());
} else if (column == 8)//AI
{
aCom = getAI(a);
bCom = getAI(b);
}
/*else if (column == 99)//New First
{
aCom = sortNewFirst(a);
bCom = sortNewFirst(b);
}*/
if (ascending)
return aCom.compareTo(bCom);
else
return bCom.compareTo(aCom);
}//compare()
/**
* <p>countCardName.</p>
*
* @param name a {@link java.lang.String} object.
* @param c a {@link forge.CardList} object.
* @return a int.
*/
final private int countCardName(String name, CardList c) {
int count = 0;
for (int i = 0; i < c.size(); i++)
if (name.equals(c.get(i).getName()))
count++;
return count;
}
/**
* <p>getRarity.</p>
*
* @param c a {@link forge.Card} object.
* @return a {@link java.lang.Integer} object.
*/
final private Integer getRarity(Card c) {
String rarity = c.getRarity();
if (rarity.equals("new"))
return 1;
if (!c.getCurSetCode().equals("")) {
SetInfo si = SetInfoUtil.getSetInfo_Code(c.getSets(), c.getCurSetCode());
if (si != null)
rarity = si.Rarity;
}
if (rarity.equals("Common"))
return 2;
else if (rarity.equals("Uncommon"))
return 3;
else if (rarity.equals("Rare"))
return 4;
else if (rarity.equals("Mythic"))
return 5;
else if (rarity.equals("Special"))
return 6;
else if (rarity.equals("Land"))
return 7;
else
return 8;
// This older form of the method no longer works as it is not compatible with set info.
/*
if(c.getRarity().equals("Common"))
return Integer.valueOf(1);
else if(c.getRarity().equals("Uncommon"))
return Integer.valueOf(2);
else if(c.getRarity().equals("Rare"))
return Integer.valueOf(3);
else if(c.getRarity().equals("Land"))
return Integer.valueOf(4);
else
return Integer.valueOf(5);
*/
}
/**
* <p>getValue.</p>
*
* @param c a {@link forge.Card} object.
* @return a {@link java.lang.Long} object.
*/
final private Long getValue(Card c) {
return c.getValue();
}
/**
* <p>getColor.</p>
*
* @param c a {@link forge.Card} object.
* @return a {@link java.lang.String} object.
*/
final public static String getColor(Card c) {
ArrayList<String> list = CardUtil.getColors(c);
if (list.size() == 1)
return list.get(0).toString();
return "multi";
}
/**
* <p>getAI.</p>
*
* @param c a {@link forge.Card} object.
* @return a {@link java.lang.Integer} object.
*/
final private Integer getAI(Card c) {
if (c.getSVar("RemAIDeck").equals("True")
&& c.getSVar("RemRandomDeck").equals("True"))
return Integer.valueOf(3);
else if (c.getSVar("RemAIDeck").equals("True"))
return Integer.valueOf(4);
else if (c.getSVar("RemRandomDeck").equals("True"))
return Integer.valueOf(2);
else
return Integer.valueOf(1);
}
/**
* <p>getType.</p>
*
* @param c a {@link forge.Card} object.
* @return a {@link java.lang.Comparable} object.
*/
final private Comparable<String> getType(Card c) {
return c.getType().toString();
}
}

View File

@@ -50,13 +50,13 @@ public final class CardColor implements Comparable<CardColor> {
@Override
public String toString() {
switch (myColor) {
case 0: return "";
case WHITE: return "White"; // Constant.Color.White;
case BLUE: return "Blue"; // Constant.Color.Blue;
case BLACK: return "Black"; // Constant.Color.Black;
case RED: return "Red"; // Constant.Color.Red;
case GREEN: return "Green"; // Constant.Color.Green;
default: return "Multi";
case 0: return "colorless";
case WHITE: return "white"; // Constant.Color.White;
case BLUE: return "blue"; // Constant.Color.Blue;
case BLACK: return "black"; // Constant.Color.Black;
case RED: return "red"; // Constant.Color.Red;
case GREEN: return "green"; // Constant.Color.Green;
default: return "multi";
}
}
}

View File

@@ -1,6 +1,7 @@
package forge.card;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
@@ -57,6 +58,7 @@ public final class CardDb {
while (parser.hasNext()) {
addNewCard(parser.next());
}
// TODO: consider using Collections.unmodifiableList wherever possible
}
public void addNewCard(final CardRules card) {
@@ -95,7 +97,7 @@ public final class CardDb {
public CardPrinted getCard(final String name) {
// Sometimes they read from decks things like "CardName|Set" - but we can handle it
int pipePos = name.indexOf('|');
if (pipePos >= 0) { return getCard(name.substring(0, pipePos), name.substring(pipePos+1)); }
if (pipePos >= 0) { return getCard(name.substring(0, pipePos), name.substring(pipePos + 1)); }
// OK, plain name here
CardPrinted card = uniqueCards.get(name);
if (card != null) { return card; }
@@ -111,13 +113,13 @@ public final class CardDb {
throw new NoSuchElementException(err);
}
// 2. Find the card itself
CardPrinted[] cards = cardsFromset.get(name);
if (null == cards) {
CardPrinted[] cardCopies = cardsFromset.get(name);
if (null == cardCopies) {
String err = String.format("Asked for card '%s' from '%s': set found, but the card wasn't. :(", name, set);
throw new NoSuchElementException(err);
}
// 3. Get the proper copy
if (artIndex >= 0 && artIndex <= cards.length) { return cards[artIndex]; }
if (artIndex >= 0 && artIndex <= cardCopies.length) { return cardCopies[artIndex]; }
String err = String.format("Asked for '%s' from '%s' #%d: db didn't find that copy.", name, set, artIndex);
throw new NoSuchElementException(err);
}

View File

@@ -7,9 +7,7 @@ import java.util.Map.Entry;
/**
* <p>CardPool class.</p>
*
* @author Forge
* @version $Id: CardReference.java 9708 2011-08-09 19:34:12Z jendave $
* Represents a list of cards with amount of each
*/
public final class CardPool extends CardPoolView {
@@ -21,14 +19,13 @@ public final class CardPool extends CardPoolView {
@SuppressWarnings("unchecked")
public CardPool(final CardPoolView from) {
super();
cards = (Hashtable<CardPrinted, Integer>) ((Hashtable<CardPrinted, Integer>) (from.cards)).clone();
cards = new Hashtable<CardPrinted, Integer>();
cards.putAll(from.cards);
}
public CardPool(final Iterable<CardPrinted> list) {
this(); addAllCards(list);
}
// get
public CardPoolView getView() { return new CardPoolView(Collections.unmodifiableMap(cards)); }
@@ -54,6 +51,7 @@ public final class CardPool extends CardPoolView {
public void remove(final CardPrinted card) { remove(card, 1); }
public void remove(final CardPrinted card, final int amount) {
int count = count(card);
if (count == 0) { return; }
if (count <= amount) { cards.remove(card); }
else { cards.put(card, count - amount); }
isListInSync = false;

View File

@@ -60,6 +60,7 @@ public class CardPoolView implements Iterable<Entry<CardPrinted, Integer>> {
return result;
}
public final int countDistinct() { return cards.size(); }
public final boolean isEmpty() { return cards.isEmpty(); }
public final List<Entry<CardPrinted, Integer>> getOrderedList() {
if (!isListInSync) {

View File

@@ -98,7 +98,9 @@ public final class CardPrinted implements Comparable<CardPrinted> {
@Override
public String toString() {
return String.format("%s|%s", name, cardSet);
return name;
// cannot still decide, if this "name|set" format is needed anymore
//return String.format("%s|%s", name, cardSet);
}
public Card toForgeCard() {

View File

@@ -46,13 +46,13 @@ public final class CardRules {
public String[] getRules() { return rules; }
public Set<Entry<String, CardInSet>> getSetsPrinted() { return setsPrinted.entrySet(); }
public final String getPower() { return power; }
public final int getIntPower() { return iPower; }
public final String getToughness() { return toughness; }
public final int getIntToughness() { return iToughness; }
public final String getLoyalty() { return loyalty; }
public final boolean getRemAIDecks() { return isRemovedFromAIDecks; }
public final boolean getRemRandomDecks() { return isRemovedFromRandomDecks; }
public String getPower() { return power; }
public int getIntPower() { return iPower; }
public String getToughness() { return toughness; }
public int getIntToughness() { return iToughness; }
public String getLoyalty() { return loyalty; }
public boolean getRemAIDecks() { return isRemovedFromAIDecks; }
public boolean getRemRandomDecks() { return isRemovedFromRandomDecks; }
public String getPTorLoyalty() {
if (getType().isCreature()) { return power + "/" + toughness; }
@@ -90,7 +90,8 @@ public final class CardRules {
}
public boolean rulesContain(final String text) {
for (String r : rules) { if (r.contains(text)) { return true; } }
if (rules == null) { return false; }
for (String r : rules) { if (StringUtils.containsIgnoreCase(r, text)) { return true; } }
return false;
}
public String getLatestSetPrinted() {
@@ -113,7 +114,7 @@ public final class CardRules {
}
public String getAiStatus() {
return isRemovedFromAIDecks ? (isRemovedFromRandomDecks ? "AI ?" : "AI") : (isRemovedFromRandomDecks ? "?" :"");
return isRemovedFromAIDecks ? (isRemovedFromRandomDecks ? "AI ?" : "AI") : (isRemovedFromRandomDecks ? "?" : "");
}
public Integer getAiStatusComparable() {
if (isRemovedFromAIDecks && isRemovedFromRandomDecks) { return Integer.valueOf(3); }
@@ -122,6 +123,9 @@ public final class CardRules {
else { return Integer.valueOf(1); }
}
/**
* Filtering conditions specific for CardRules class, defined here along with some presets.
*/
public abstract static class Predicates {
// Static builder methods - they choose concrete implementation by themselves
@@ -131,18 +135,23 @@ public final class CardRules {
}
// Power
// Toughness
public static Predicate<CardRules> rules(final StringOp op, final String what)
{
public static Predicate<CardRules> rules(final StringOp op, final String what) {
return new LeafString(LeafString.CardField.RULES, op, what);
}
public static Predicate<CardRules> name(final StringOp op, final String what)
{
public static Predicate<CardRules> name(final StringOp op, final String what) {
return new LeafString(LeafString.CardField.NAME, op, what);
}
public static Predicate<CardRules> subType(final StringOp op, final String what)
{
public static Predicate<CardRules> subType(final StringOp op, final String what) {
return new LeafString(LeafString.CardField.SUBTYPE, op, what);
}
public static Predicate<CardRules> joinedType(final StringOp op, final String what) {
return new LeafString(LeafString.CardField.JOINED_TYPE, op, what);
}
public static Predicate<CardRules> wasPrintedInSet(final String setCode) {
return new PredicateExitsInSet(setCode);
}
public static Predicate<CardRules> coreType(final boolean isEqual, final String what)
{
try { return coreType(isEqual, CardCoreType.valueOf(CardCoreType.class, what)); }
@@ -182,7 +191,8 @@ public final class CardRules {
public enum CardField {
RULES,
NAME,
SUBTYPE
SUBTYPE,
JOINED_TYPE
}
private final String operand;
@@ -201,15 +211,17 @@ public final class CardRules {
case RULES:
shouldConatin = operator == StringOp.CONTAINS || operator == StringOp.EQUALS;
return shouldConatin == card.rulesContain(operand);
case JOINED_TYPE:
return op(card.getType().toString(), operand);
default:
return false;
}
}
private boolean op(final String op1, final String op2) {
if (operator == StringOp.CONTAINS) { return op1.contains(op2); }
if (operator == StringOp.NOT_CONTAINS) { return op1.contains(op2); }
if (operator == StringOp.EQUALS) { return op1.equals(op2); }
if (operator == StringOp.CONTAINS) { return StringUtils.containsIgnoreCase(op1, op2); }
if (operator == StringOp.NOT_CONTAINS) { return !StringUtils.containsIgnoreCase(op1, op2); }
if (operator == StringOp.EQUALS) { return op1.equalsIgnoreCase(op2); }
return false;
}
@@ -335,6 +347,18 @@ public final class CardRules {
}
}
private static class PredicateExitsInSet extends Predicate<CardRules> {
private final String setCode;
public PredicateExitsInSet(final String setsCode) {
setCode = setsCode;
}
@Override
public boolean isTrue(final CardRules subject) {
return subject.setsPrinted.containsKey(setCode);
}
}
public static class Presets {
public static final Predicate<CardRules> isCreature = coreType(true, CardCoreType.Creature);
public static final Predicate<CardRules> isArtifact = coreType(true, CardCoreType.Artifact);
@@ -353,7 +377,6 @@ public final class CardRules {
public static final Predicate<CardRules> isRed = isColor(CardColor.RED);
public static final Predicate<CardRules> isGreen = isColor(CardColor.GREEN);
public static final Predicate<CardRules> isColorless = hasCntColors((byte) 0);
public static final Predicate<CardRules> isMulticolor = hasAtLeastCntColors((byte) 2);

View File

@@ -40,11 +40,11 @@ public final class CardType implements Comparable<CardType> {
boolean hasMoreTypes = typeText.length() > 0;
while (hasMoreTypes) {
String type = typeText.substring(iTypeStart, iSpace == -1 ? typeText.length() : iSpace );
if (!isMultiwordType(type)) {
hasMoreTypes = iSpace != -1;
if (!isMultiwordType(type) || !hasMoreTypes) {
iTypeStart = iSpace + 1;
result.parseAndAdd(type);
}
hasMoreTypes = iSpace != -1;
iSpace = typeText.indexOf(space, iSpace + 1);
}
return result;

View File

@@ -1,7 +1,10 @@
package forge.deck;
import forge.Card;
import forge.Constant;
import forge.card.CardDb;
import forge.card.CardPool;
import forge.card.CardPoolView;
import forge.card.CardPrinted;
import java.io.Serializable;
import java.util.*;
@@ -22,8 +25,8 @@ public class Deck implements Comparable<Deck>, Serializable {
private Map<String, String> metadata = new HashMap<String, String>();
private List<String> main;
private List<String> sideboard;
private CardPool main;
private CardPool sideboard;
/** Constant <code>NAME="Name"</code> */
public static final String NAME = "Name";
@@ -42,8 +45,8 @@ public class Deck implements Comparable<Deck>, Serializable {
* <p>Constructor for Deck.</p>
*/
public Deck() {
main = new ArrayList<String>();
sideboard = new ArrayList<String>();
main = new CardPool();
sideboard = new CardPool();
}
/**
@@ -58,8 +61,8 @@ public class Deck implements Comparable<Deck>, Serializable {
setDeckType(deckType);
setName(name);
this.main = main;
this.sideboard = sideboard;
this.main = new CardPool(main);
this.sideboard = new CardPool(sideboard);
}
/**
@@ -77,8 +80,8 @@ public class Deck implements Comparable<Deck>, Serializable {
*
* @return a {@link java.util.List} object.
*/
public List<String> getMain() {
return Collections.unmodifiableList(main);
public CardPoolView getMain() {
return main.getView();
}
/**
@@ -86,8 +89,8 @@ public class Deck implements Comparable<Deck>, Serializable {
*
* @return a {@link java.util.List} object.
*/
public List<String> getSideboard() {
return Collections.unmodifiableList(sideboard);
public CardPoolView getSideboard() {
return sideboard.getView();
}
/**
@@ -161,9 +164,10 @@ public class Deck implements Comparable<Deck>, Serializable {
*
* @param cardName a {@link java.lang.String} object.
*/
public void addMain(String cardName) {
main.add(cardName);
}
public void addMain(String cardName) { addMain( CardDb.instance().getCard(cardName) ); }
public void addMain(CardPrinted card) { main.add(card); }
public void addMain(CardPoolView list) { main.addAll(list); }
/**
* <p>countMain.</p>
@@ -171,27 +175,7 @@ public class Deck implements Comparable<Deck>, Serializable {
* @return a int.
*/
public int countMain() {
return main.size();
}
/**
* <p>Getter for the field <code>main</code>.</p>
*
* @param index a int.
* @return a {@link java.lang.String} object.
*/
public String getMain(int index) {
return main.get(index);
}
/**
* <p>removeMain.</p>
*
* @param index a int.
* @return a {@link java.lang.String} object.
*/
public String removeMain(int index) {
return main.remove(index);
return main.countAll();
}
/**
@@ -199,11 +183,8 @@ public class Deck implements Comparable<Deck>, Serializable {
*
* @param c a {@link forge.Card} object.
*/
public void removeMain(Card c) {
if (main.contains(c.getName())) {
int i = main.indexOf(c.getName());
main.remove(i);
}
public void removeMain(CardPrinted card) {
main.remove(card);
}
/**
@@ -211,9 +192,10 @@ public class Deck implements Comparable<Deck>, Serializable {
*
* @param cardName a {@link java.lang.String} object.
*/
public void addSideboard(String cardName) {
sideboard.add(cardName);
}
public final void addSideboard(final String cardName) { addSideboard(CardDb.instance().getCard(cardName)); }
public final void addSideboard(final CardPrinted card) { sideboard.add(card); }
public final void addSideboard(final CardPoolView cards) { sideboard.addAll(cards); }
/**
* <p>countSideboard.</p>
@@ -221,17 +203,7 @@ public class Deck implements Comparable<Deck>, Serializable {
* @return a int.
*/
public int countSideboard() {
return sideboard.size();
}
/**
* <p>Getter for the field <code>sideboard</code>.</p>
*
* @param index a int.
* @return a {@link java.lang.String} object.
*/
public String getSideboard(int index) {
return sideboard.get(index);
return sideboard.countAll();
}
/**
@@ -240,8 +212,8 @@ public class Deck implements Comparable<Deck>, Serializable {
* @param index a int.
* @return a {@link java.lang.String} object.
*/
public String removeSideboard(int index) {
return sideboard.remove(index);
public void removeFromSideboard(CardPrinted card) {
sideboard.remove(card);
}
/**
@@ -377,4 +349,14 @@ public class Deck implements Comparable<Deck>, Serializable {
public void addMetaData(String key, String value) {
metadata.put(key, value);
}
public void clearSideboard() {
sideboard.clear();
}
public void clearMain() {
main.clear();
}
}

View File

@@ -2,6 +2,7 @@ package forge.deck;
import forge.Constant;
import forge.card.CardPrinted;
import forge.error.ErrorViewer;
import java.io.*;
@@ -10,6 +11,8 @@ import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
import static java.lang.Integer.parseInt;
import static java.lang.String.format;
import static java.util.Arrays.asList;
@@ -348,9 +351,12 @@ public class DeckManager {
Matcher m = p.matcher(line);
m.matches();
String s = m.group(2);
String cardName = m.group(3);
if (StringUtils.isBlank(cardName)) { continue; }
int count = s == null ? 1 : parseInt(s);
for (int i = 0; i < count; i++) {
d.addSideboard(m.group(3));
d.addSideboard(cardName);
}
}
}
@@ -432,12 +438,12 @@ public class DeckManager {
}
out.write(format("%s%n", "[main]"));
for (Entry<String, Integer> e : count(d.getMain()).entrySet()) {
out.write(format("%d %s%n", e.getValue(), e.getKey()));
for (Entry<CardPrinted, Integer> e : d.getMain()) {
out.write(format("%d %s%n", e.getValue(), e.getKey().getName()));
}
out.write(format("%s%n", "[sideboard]"));
for (Entry<String, Integer> e : count(d.getSideboard()).entrySet()) {
out.write(format("%d %s%n", e.getValue(), e.getKey()));
for (Entry<CardPrinted, Integer> e : d.getSideboard()) {
out.write(format("%d %s%n", e.getValue(), e.getKey().getName()));
}
}

View File

@@ -152,25 +152,6 @@ public class DownloadDeck {
return false;
}
/**
* <p>getCardDownload.</p>
*
* @param c a {@link forge.Card} object.
* @param CardName a {@link java.lang.String} object.
* @return a {@link forge.Card} object.
*/
public Card getCardDownload(Card c, String CardName) {
// TODO: using AllZone.getCardFactory().getCard() would probably be much faster.
for (Card newCard : AllZone.getCardFactory()) {
if (CardName.equalsIgnoreCase(newCard.getName())) {
return newCard;
}
}
return null;
}
}

View File

@@ -14,6 +14,7 @@ import javax.swing.event.ListSelectionListener;
import forge.AllZone;
import forge.Card;
import forge.CardUtil;
import forge.card.CardPrinted;
import forge.gui.game.CardDetailPanel;
import forge.gui.game.CardPicturePanel;
@@ -36,7 +37,7 @@ import static javax.swing.JOptionPane.*;
public class CardListViewer {
//Data and number of choices for the list
private List<String> list;
private List<CardPrinted> list;
//Decoration
private String title;
@@ -53,15 +54,15 @@ public class CardListViewer {
private JOptionPane optionPane;
private Action ok;
public CardListViewer(String title, List<String> list) {
public CardListViewer(String title, List<CardPrinted> list) {
this(title, "", list, null);
}
public CardListViewer(String title, String message, List<String> list) {
public CardListViewer(String title, String message, List<CardPrinted> list) {
this(title, message, list, null);
}
public CardListViewer(String title, String message, List<String> list, Icon dialogIcon) {
public CardListViewer(String title, String message, List<CardPrinted> list, Icon dialogIcon) {
this.title = title;
this.list = unmodifiableList(list);
jList = new JList(new ChooserListModel());
@@ -146,7 +147,7 @@ public class CardListViewer {
int row = jList.getSelectedIndex();
// (String) jList.getSelectedValue();
if (row >= 0 && row < list.size()) {
Card card = AllZone.getCardFactory().getCard(list.get(row) , null);
Card card = AllZone.getCardFactory().getCard(list.get(row).getName(), null);
card.setRandomSetCode();
card.setImageFilename(CardUtil.buildFilename(card));
detail.setCard(card);

View File

@@ -204,6 +204,7 @@ public class ListChooser<T> {
Object[] options;
if (minChoices == 0) options = new Object[]{new JButton(ok), new JButton(cancel)};
else options = new Object[]{new JButton(ok)};
if (maxChoices == 1) { jList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); }
p = new JOptionPane(new Object[]{message, new JScrollPane(jList)}, QUESTION_MESSAGE, DEFAULT_OPTION,
null, options, options[0]);

View File

@@ -0,0 +1,86 @@
package forge.gui.deckeditor;
import java.util.Map.Entry;
import net.slightlymagic.braids.util.lambda.Lambda1;
import forge.SetInfoUtil;
import forge.card.CardPrinted;
/**
* TODO: Write javadoc for this type.
*
*/
public abstract class CardColumnPresets {
@SuppressWarnings("rawtypes")
public static final Lambda1<Comparable, Entry<CardPrinted, Integer>> fnQtyCompare =
new Lambda1<Comparable, Entry<CardPrinted, Integer>>() { @Override
public Comparable apply(final Entry<CardPrinted, Integer> from) { return from.getValue(); } };
public static final Lambda1<Object, Entry<CardPrinted, Integer>> fnQtyGet =
new Lambda1<Object, Entry<CardPrinted, Integer>>() { @Override
public Object apply(final Entry<CardPrinted, Integer> from) { return from.getValue(); } };
@SuppressWarnings("rawtypes")
public static final Lambda1<Comparable, Entry<CardPrinted, Integer>> fnNameCompare =
new Lambda1<Comparable, Entry<CardPrinted, Integer>>() { @Override
public Comparable apply(final Entry<CardPrinted, Integer> from) { return from.getKey().getName(); } };
public static final Lambda1<Object, Entry<CardPrinted, Integer>> fnNameGet =
new Lambda1<Object, Entry<CardPrinted, Integer>>() { @Override
public Object apply(final Entry<CardPrinted, Integer> from) { return from.getKey().getName(); } };
@SuppressWarnings("rawtypes")
public static final Lambda1<Comparable, Entry<CardPrinted, Integer>> fnCostCompare =
new Lambda1<Comparable, Entry<CardPrinted, Integer>>() { @Override
public Comparable apply(final Entry<CardPrinted, Integer> from) { return from.getKey().getCard().getManaCost(); } };
public static final Lambda1<Object, Entry<CardPrinted, Integer>> fnCostGet =
new Lambda1<Object, Entry<CardPrinted, Integer>>() { @Override
public Object apply(final Entry<CardPrinted, Integer> from) { return from.getKey().getCard().getManaCost().toString(); } };
@SuppressWarnings("rawtypes")
public static final Lambda1<Comparable, Entry<CardPrinted, Integer>> fnColorCompare =
new Lambda1<Comparable, Entry<CardPrinted, Integer>>() { @Override
public Comparable apply(final Entry<CardPrinted, Integer> from) { return from.getKey().getCard().getColor(); } };
public static final Lambda1<Object, Entry<CardPrinted, Integer>> fnColorGet =
new Lambda1<Object, Entry<CardPrinted, Integer>>() { @Override
public Object apply(final Entry<CardPrinted, Integer> from) { return from.getKey().getCard().getColor().toString(); } };
@SuppressWarnings("rawtypes")
public static final Lambda1<Comparable, Entry<CardPrinted, Integer>> fnTypeCompare =
new Lambda1<Comparable, Entry<CardPrinted, Integer>>() { @Override
public Comparable apply(final Entry<CardPrinted, Integer> from) { return from.getKey().getCard().getType(); } };
public static final Lambda1<Object, Entry<CardPrinted, Integer>> fnTypeGet =
new Lambda1<Object, Entry<CardPrinted, Integer>>() { @Override
public Object apply(final Entry<CardPrinted, Integer> from) { return from.getKey().getCard().getType().toString(); } };
@SuppressWarnings("rawtypes")
public static final Lambda1<Comparable, Entry<CardPrinted, Integer>> fnStatsCompare =
new Lambda1<Comparable, Entry<CardPrinted, Integer>>() { @Override
public Comparable apply(final Entry<CardPrinted, Integer> from) { return from.getKey().getCard().getPTorLoyalty(); } };
public static final Lambda1<Object, Entry<CardPrinted, Integer>> fnStatsGet =
new Lambda1<Object, Entry<CardPrinted, Integer>>() { @Override
public Object apply(final Entry<CardPrinted, Integer> from) { return from.getKey().getCard().getPTorLoyalty(); } };
@SuppressWarnings("rawtypes")
public static final Lambda1<Comparable, Entry<CardPrinted, Integer>> fnRarityCompare =
new Lambda1<Comparable, Entry<CardPrinted, Integer>>() { @Override
public Comparable apply(final Entry<CardPrinted, Integer> from) { return from.getKey().getRarity(); } };
public static final Lambda1<Object, Entry<CardPrinted, Integer>> fnRarityGet =
new Lambda1<Object, Entry<CardPrinted, Integer>>() { @Override
public Object apply(final Entry<CardPrinted, Integer> from) { return from.getKey().getRarity(); } };
@SuppressWarnings("rawtypes")
public static final Lambda1<Comparable, Entry<CardPrinted, Integer>> fnSetCompare =
new Lambda1<Comparable, Entry<CardPrinted, Integer>>() { @Override
public Comparable apply(final Entry<CardPrinted, Integer> from) { return SetInfoUtil.getSetByCode(from.getKey().getSet()); } };
public static final Lambda1<Object, Entry<CardPrinted, Integer>> fnSetGet =
new Lambda1<Object, Entry<CardPrinted, Integer>>() { @Override
public Object apply(final Entry<CardPrinted, Integer> from) { return from.getKey().getSet(); } };
@SuppressWarnings("rawtypes")
public static final Lambda1<Comparable, Entry<CardPrinted, Integer>> fnAiStatusCompare =
new Lambda1<Comparable, Entry<CardPrinted, Integer>>() { @Override
public Comparable apply(final Entry<CardPrinted, Integer> from) { return from.getKey().getCard().getAiStatusComparable(); } };
public static final Lambda1<Object, Entry<CardPrinted, Integer>> fnAiStatusGet =
new Lambda1<Object, Entry<CardPrinted, Integer>>() { @Override
public Object apply(final Entry<CardPrinted, Integer> from) { return from.getKey().getCard().getAiStatus(); } };
}

View File

@@ -0,0 +1,14 @@
package forge.gui.deckeditor;
import forge.card.CardPrinted;
/**
* TODO: Write javadoc for this type.
*
*/
public interface CardDisplay {
void showCard(CardPrinted card);
// Sorry, this is for JPanel initialization
void jbInit();
}

View File

@@ -0,0 +1,367 @@
package forge.gui.deckeditor;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import javax.swing.event.MouseInputAdapter;
import javax.swing.event.MouseInputListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import net.slightlymagic.braids.util.lambda.Lambda1;
import forge.Card;
import forge.CardList;
import forge.Command;
import forge.ImageCache;
import forge.ReadBoosterPack;
import forge.ReadPriceList;
import forge.card.CardPool;
import forge.card.CardPoolView;
import forge.card.CardRarity;
import forge.card.CardPrinted;
import forge.deck.Deck;
import forge.error.ErrorViewer;
import forge.gui.game.CardDetailPanel;
import forge.gui.game.CardPicturePanel;
import forge.properties.NewConstants;
import forge.view.swing.OldGuiNewGame;
/**
* <p>
* Gui_CardShop class.
* </p>
*
* @author Forge
* @version $Id$
*/
public class CardShop extends DeckEditorBase {
/** Constant <code>serialVersionUID=3988857075791576483L</code> */
private static final long serialVersionUID = 3988857075791576483L;
private JButton buyButton = new JButton();
private JButton sellButton = new JButton();
private JScrollPane jScrollPane3 = new JScrollPane();
private JPanel jPanel3 = new JPanel();
private GridLayout gridLayout1 = new GridLayout();
private JLabel creditsLabel = new JLabel();
private JLabel jLabel1 = new JLabel();
private JLabel sellPercentageLabel = new JLabel();
private double multiplier;
private forge.quest.data.QuestData questData;
// get pricelist:
private ReadPriceList r = new ReadPriceList();
private Map<String, Integer> mapPrices = r.getPriceList();
/** {@inheritDoc} */
public void setDecks(CardPoolView topParam, CardPoolView bottomParam) {
this.top = new CardPool(topParam);
this.bottom = bottomParam;
topModel.clear();
bottomModel.clear();
// update top
topModel.addCards(topParam);
bottomModel.addCards(bottomParam);
topModel.resort();
bottomModel.resort();
}// updateDisplay
/**
* <p>
* show.
* </p>
*
* @param exitCommand
* a {@link forge.Command} object.
*/
public void show(final Command exitCommand) {
final Command exit = new Command() {
private static final long serialVersionUID = -7428793574300520612L;
public void execute() {
CardShop.this.dispose();
exitCommand.execute();
}
};
// do not change this!!!!
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent ev) {
exit.execute();
}
});
setup();
multiplier = questData.getSellMutliplier();
CardPoolView forSale = questData.getShopList();
if (forSale.isEmpty()) {
questData.generateCardsInShop();
forSale = questData.getShopList();
}
CardPoolView owned = questData.getCardpool().getView();
setDecks(forSale, owned);
double multiPercent = multiplier * 100;
NumberFormat formatter = new DecimalFormat("#0.00");
String maxSellingPrice = "";
int maxSellPrice = questData.getSellPriceLimit();
if (maxSellPrice < Integer.MAX_VALUE) { maxSellingPrice = String.format(" Max selling price: %d", maxSellPrice); }
sellPercentageLabel.setText("(Sell percentage: " + formatter.format(multiPercent) + "% of value)" + maxSellingPrice);
topModel.sort(1, true);
bottomModel.sort(1, true);
}// show(Command)
/**
* <p>
* setup.
* </p>
*/
private void setup() {
List<TableColumnInfo<CardPrinted>> columns = new ArrayList<TableColumnInfo<CardPrinted>>();
columns.add(new TableColumnInfo<CardPrinted>("Qty", 30, CardColumnPresets.fnQtyCompare, CardColumnPresets.fnQtyGet));
columns.add(new TableColumnInfo<CardPrinted>("Name", 180, CardColumnPresets.fnNameCompare, CardColumnPresets.fnNameGet));
columns.add(new TableColumnInfo<CardPrinted>("Cost", 70, CardColumnPresets.fnCostCompare, CardColumnPresets.fnCostGet));
columns.add(new TableColumnInfo<CardPrinted>("Color", 50, CardColumnPresets.fnColorCompare, CardColumnPresets.fnColorGet));
columns.add(new TableColumnInfo<CardPrinted>("Type", 100, CardColumnPresets.fnTypeCompare, CardColumnPresets.fnTypeGet));
columns.add(new TableColumnInfo<CardPrinted>("Stats", 40, CardColumnPresets.fnStatsCompare, CardColumnPresets.fnStatsGet));
columns.add(new TableColumnInfo<CardPrinted>("R", 35, CardColumnPresets.fnRarityCompare, CardColumnPresets.fnRarityGet));
columns.add(new TableColumnInfo<CardPrinted>("Set", 40, CardColumnPresets.fnSetCompare, CardColumnPresets.fnSetGet));
columns.add(new TableColumnInfo<CardPrinted>("Price", 40, fnPriceCompare, fnPriceGet));
setupTables(columns, false);
setSize(1024, 768);
this.setResizable(false);
Dimension screen = getToolkit().getScreenSize();
Rectangle bounds = getBounds();
bounds.width = 1024;
bounds.height = 768;
bounds.x = (screen.width - bounds.width) / 2;
bounds.y = (screen.height - bounds.height) / 2;
setBounds(bounds);
// TODO use this as soon the deck editor has resizable GUI
// //Use both so that when "un"maximizing, the frame isn't tiny
// setSize(1024, 740);
// setExtendedState(Frame.MAXIMIZED_BOTH);
}// setupAndDisplay()
/**
* <p>
* Constructor for Gui_CardShop.
* </p>
*
* @param qd
* a {@link forge.quest.data.QuestData} object.
*/
public CardShop(forge.quest.data.QuestData qd) {
super(false, false);
questData = qd;
try {
jbInit();
} catch (Exception ex) {
ErrorViewer.showError(ex);
}
}
/**
* <p>
* jbInit.
* </p>
*
* @throws java.lang.Exception
* if any.
*/
private void jbInit() throws Exception {
jbInitTables("Cards for sale", "Owned Cards");
jScrollPane1.setBounds(new Rectangle(19, 20, 726, 346));
jScrollPane2.setBounds(new Rectangle(19, 458, 726, 276));
sellButton.setBounds(new Rectangle(180, 403, 146, 49));
// removeButton.setIcon(upIcon);
if (!OldGuiNewGame.useLAFFonts.isSelected())
sellButton.setFont(new java.awt.Font("Dialog", 0, 13));
sellButton.setText("Sell Card");
sellButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
sellButton_actionPerformed(e);
}
});
buyButton.setText("Buy Card");
buyButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
buyButton_actionPerformed(e);
}
});
if (!OldGuiNewGame.useLAFFonts.isSelected())
buyButton.setFont(new java.awt.Font("Dialog", 0, 13));
buyButton.setBounds(new Rectangle(23, 403, 146, 49));
cardView.jbInit();
cardView.setBounds(new Rectangle(765, 23, 239, 710));
// Do not lower statsLabel any lower, we want this to be visible at 1024
// x 768 screen size
this.setTitle("Card Shop");
jScrollPane3.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
jScrollPane3.setBounds(new Rectangle(6, 168, 225, 143));
jPanel3.setBounds(new Rectangle(7, 21, 224, 141));
jPanel3.setLayout(gridLayout1);
gridLayout1.setColumns(1);
gridLayout1.setRows(0);
creditsLabel.setBounds(new Rectangle(19, 365, 720, 31));
creditsLabel.setText("Total credits: " + questData.getCredits());
if (!OldGuiNewGame.useLAFFonts.isSelected())
creditsLabel.setFont(new java.awt.Font("Dialog", 0, 14));
sellPercentageLabel.setBounds(new Rectangle(350, 403, 450, 31));
sellPercentageLabel.setText("(Sell percentage: " + multiplier + ")");
if (!OldGuiNewGame.useLAFFonts.isSelected())
sellPercentageLabel.setFont(new java.awt.Font("Dialog", 0, 14));
jLabel1.setText("Click on the column name (like name or color) to sort the cards");
jLabel1.setBounds(new Rectangle(20, 1, 400, 19));
this.getContentPane().add(cardView, null);
this.getContentPane().add(jScrollPane1, null);
this.getContentPane().add(jScrollPane2, null);
this.getContentPane().add(creditsLabel, null);
this.getContentPane().add(buyButton, null);
this.getContentPane().add(sellButton, null);
this.getContentPane().add(sellPercentageLabel, null);
this.getContentPane().add(jLabel1, null);
}
// TODO: move to cardshop
private Integer getCardValue(final CardPrinted card) {
if (mapPrices.containsKey(card.getName())) {
return mapPrices.get(card.getName());
} else {
switch (card.getRarity()) {
case BasicLand: return Integer.valueOf(4);
case Common: return Integer.valueOf(6);
case Uncommon: return Integer.valueOf(40);
case Rare: return Integer.valueOf(120);
case MythicRare: return Integer.valueOf(600);
default: return Integer.valueOf(15);
}
}
}
private void buyButton_actionPerformed(ActionEvent e) {
int n = topTable.getSelectedRow();
if (n != -1) {
CardPrinted c = topModel.rowToCard(n).getKey();
int value = getCardValue(c);
if (value <= questData.getCredits()) {
bottomModel.addCard(c);
bottomModel.resort();
topModel.removeCard(c);
questData.buyCard(c, value);
creditsLabel.setText("Total credits: " + questData.getCredits());
fixSelection(topModel, topTable, n);
} else {
JOptionPane.showMessageDialog(null, "Not enough credits!");
}
}// if(valid row)
}// buyButton_actionPerformed
/**
* <p>
* sellButton_actionPerformed.
* </p>
*
* @param e
* a {@link java.awt.event.ActionEvent} object.
*/
void sellButton_actionPerformed(ActionEvent e) {
int n = bottomTable.getSelectedRow();
if (n != -1) {
CardPrinted c = bottomModel.rowToCard(n).getKey();
bottomModel.removeCard(c);
topModel.addCard(c);
topModel.resort();
// bottomModel.removeCard(c);
questData.addCardToShopList(c);
int price = Math.min((int) (multiplier * getCardValue(c)), questData.getSellPriceLimit());
questData.sellCard(c, price);
creditsLabel.setText("Total credits: " + questData.getCredits());
int leftInPool = questData.getCardpool().count(c);
// remove sold cards from all decks:
for (String deckName : questData.getDeckNames()) {
Deck deck = questData.getDeck(deckName);
for (int cntInDeck = deck.getMain().count(c); cntInDeck > leftInPool; cntInDeck--) {
deck.removeMain(c);
}
}
fixSelection(bottomModel, bottomTable, n);
}// if(valid row)
}// sellButton_actionPerformed
@SuppressWarnings("rawtypes")
protected final Lambda1<Comparable, Entry<CardPrinted, Integer>> fnPriceCompare =
new Lambda1<Comparable, Entry<CardPrinted, Integer>>() { @Override
public Comparable apply(final Entry<CardPrinted, Integer> from) { return getCardValue(from.getKey()); } };
protected final Lambda1<Object, Entry<CardPrinted, Integer>> fnPriceGet =
new Lambda1<Object, Entry<CardPrinted, Integer>>() { @Override
public Object apply(final Entry<CardPrinted, Integer> from) { return getCardValue(from.getKey()); } };
}

View File

@@ -0,0 +1,178 @@
package forge.gui.deckeditor;
import java.awt.Color;
import java.awt.Container;
import java.awt.LayoutManager2;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.filechooser.FileFilter;
import net.miginfocom.swing.MigLayout;
import arcane.ui.CardPanel;
import arcane.ui.ViewPanel;
import forge.Card;
import forge.GuiDisplayUtil;
import forge.ImagePreviewPanel;
import forge.card.CardPrinted;
import forge.gui.game.CardDetailPanel;
import forge.properties.ForgeProps;
import forge.properties.NewConstants;
import forge.view.swing.OldGuiNewGame;
/**
* This panel is to be placed in the right part of a deck editor
*
*/
public class CardViewPanel extends JPanel implements CardDisplay {
private static final long serialVersionUID = -7134546689397508597L;
private JButton changePictureButton = new JButton();
private JButton removePictureButton = new JButton();
// Controls to show card details
protected CardDetailPanel detail = new CardDetailPanel(null);
protected CardPanel picture = new CardPanel(null);
protected ViewPanel pictureViewPanel = new ViewPanel();
// fake card to allow picture changes
public Card cCardHQ;
/** Constant <code>previousDirectory</code> */
protected static File previousDirectory = null;
public void jbInit() {
changePictureButton.setText("Change picture...");
changePictureButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
changePictureButton_actionPerformed(e);
}
});
if (!OldGuiNewGame.useLAFFonts.isSelected())
changePictureButton.setFont(new java.awt.Font("Dialog", 0, 10));
removePictureButton.setText("Remove picture...");
removePictureButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
removePictureButton_actionPerformed(e);
}
});
if (!OldGuiNewGame.useLAFFonts.isSelected())
removePictureButton.setFont(new java.awt.Font("Dialog", 0, 10));
pictureViewPanel.setCardPanel(picture);
this.setLayout(new MigLayout("fill, ins 0"));
this.add(detail, "w 239, h 323, grow, flowy, wrap");
this.add(changePictureButton, "align 50% 0%, split 2, flowx");
this.add(removePictureButton, "align 50% 0%, wrap");
this.add(pictureViewPanel, "wmin 239, hmin 323, grow");
}
public void showCard(CardPrinted card) {
Card card2 = card.toForgeCard();
detail.setCard(card2);
setCard(card2);
}
public void setCard(Card c) {
picture.setCard(c);
}
/**
* <p>
* changePictureButton_actionPerformed.
* </p>
*
* @param e
* a {@link java.awt.event.ActionEvent} object.
*/
void changePictureButton_actionPerformed(ActionEvent e) {
if (cCardHQ != null) {
File file = getImportFilename();
if (file != null) {
String fileName = GuiDisplayUtil.cleanString(cCardHQ.getName()) + ".jpg";
File base = ForgeProps.getFile(NewConstants.IMAGE_BASE);
File f = new File(base, fileName);
f.delete();
try {
org.apache.commons.io.FileUtils.copyFile(file, f);
} catch (IOException e1) {
// TODO Auto-generated catch block ignores the exception, but sends it to System.err and probably forge.log.
e1.printStackTrace();
}
setCard(cCardHQ);
}
}
}
/**
* <p>
* getImportFilename.
* </p>
*
* @return a {@link java.io.File} object.
*/
private File getImportFilename() {
JFileChooser chooser = new JFileChooser(previousDirectory);
ImagePreviewPanel preview = new ImagePreviewPanel();
chooser.setAccessory(preview);
chooser.addPropertyChangeListener(preview);
chooser.addChoosableFileFilter(dckFilter);
int returnVal = chooser.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = chooser.getSelectedFile();
previousDirectory = file.getParentFile();
return file;
}
return null;
}
protected FileFilter dckFilter = new FileFilter() {
@Override
public boolean accept(File f) {
return f.getName().endsWith(".jpg") || f.isDirectory();
}
@Override
public String getDescription() {
return "*.jpg";
}
};
void removePictureButton_actionPerformed(ActionEvent e) {
if (cCardHQ != null) {
String options[] = { "Yes", "No" };
int value = JOptionPane.showOptionDialog(null, "Do you want delete " + cCardHQ.getName() + " picture?",
"Delete picture", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options,
options[1]);
if (value == 0) {
String fileName = GuiDisplayUtil.cleanString(cCardHQ.getName()) + ".jpg";
File base = ForgeProps.getFile(NewConstants.IMAGE_BASE);
File f = new File(base, fileName);
f.delete();
JOptionPane.showMessageDialog(null, "Picture " + cCardHQ.getName() + " deleted.", "Delete picture",
JOptionPane.INFORMATION_MESSAGE);
setCard(cCardHQ);
}
}
}
public Card getCard() { return detail.getCard(); }
}

View File

@@ -0,0 +1,62 @@
package forge.gui.deckeditor;
import java.awt.Color;
import java.awt.Container;
import java.awt.LayoutManager2;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.filechooser.FileFilter;
import net.miginfocom.swing.MigLayout;
import arcane.ui.CardPanel;
import arcane.ui.ViewPanel;
import forge.Card;
import forge.GuiDisplayUtil;
import forge.ImagePreviewPanel;
import forge.card.CardPrinted;
import forge.gui.game.CardDetailPanel;
import forge.gui.game.CardPicturePanel;
import forge.properties.ForgeProps;
import forge.properties.NewConstants;
import forge.view.swing.OldGuiNewGame;
/**
* This panel is to be placed in the right part of a deck editor
*
*/
public class CardViewPanelLite extends JPanel implements CardDisplay {
private static final long serialVersionUID = -7134546689397508597L;
// Controls to show card details
protected CardDetailPanel detail = new CardDetailPanel(null);
private CardPicturePanel picture = new CardPicturePanel(null);
/** Constant <code>previousDirectory</code> */
protected static File previousDirectory = null;
public void jbInit() {
this.setLayout(new MigLayout("fill, ins 0"));
this.add(detail, "w 239, h 323, grow, flowy, wrap");
this.add(picture, "wmin 239, hmin 323, grow");
}
public void showCard(CardPrinted card) {
picture.setCard(card);
Card card2 = card.toForgeCard();
detail.setCard(card2);
}
public Card getCard() { return detail.getCard(); }
}

View File

@@ -1,4 +1,9 @@
package forge;
package forge.gui.deckeditor;
import forge.CardList;
import forge.card.CardPool;
import forge.card.CardPoolView;
import forge.card.CardPrinted;
/**
* Created by IntelliJ IDEA.
@@ -8,14 +13,14 @@ package forge;
* @author Forge
* @version $Id$
*/
interface DeckDisplay {
public interface DeckDisplay {
/**
* <p>updateDisplay.</p>
*
* @param top a {@link forge.CardList} object.
* @param bottom a {@link forge.CardList} object.
*/
public void updateDisplay(CardList top, CardList bottom);
public void setDecks(CardPoolView top, CardPoolView bottom);
//top shows available card pool
//if constructed, top shows all cards
@@ -26,7 +31,7 @@ interface DeckDisplay {
*
* @return a {@link forge.CardList} object.
*/
public CardList getTop();
public CardPoolView getTop();
//bottom shows cards that the user has chosen for his library
/**
@@ -34,7 +39,7 @@ interface DeckDisplay {
*
* @return a {@link forge.CardList} object.
*/
public CardList getBottom();
public CardPoolView getBottom();
/**
* <p>setTitle.</p>

View File

@@ -0,0 +1,550 @@
package forge.gui.deckeditor;
import java.awt.Container;
import java.awt.Font;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.swt.widgets.Combo;
import net.miginfocom.swing.MigLayout;
import net.slightlymagic.maxmtg.Predicate;
import net.slightlymagic.maxmtg.Predicate.StringOp;
import forge.Command;
import forge.Constant;
import forge.Gui_ProgressBarWindow;
import forge.SetInfoUtil;
import forge.card.CardRules;
import forge.card.CardDb;
import forge.card.CardPool;
import forge.card.CardPoolView;
import forge.card.CardPrinted;
import forge.deck.Deck;
import forge.error.ErrorViewer;
import forge.properties.NewConstants;
import forge.view.swing.OldGuiNewGame;
/**
* <p>
* Gui_DeckEditor class.
* </p>
*
* @author Forge
* @version $Id$
*/
public class DeckEditor extends DeckEditorBase implements NewConstants {
/** Constant <code>serialVersionUID=130339644136746796L</code> */
private static final long serialVersionUID = 130339644136746796L;
public DeckEditorMenu customMenu;
public Gui_ProgressBarWindow gPBW = new Gui_ProgressBarWindow();
// private ImageIcon upIcon = Constant.IO.upIcon;
// private ImageIcon downIcon = Constant.IO.downIcon;
private JButton removeButton = new JButton();
private JButton addButton = new JButton();
private JButton analysisButton = new JButton();
private JScrollPane jScrollPane3 = new JScrollPane();
private JPanel jPanel3 = new JPanel();
private GridLayout gridLayout1 = new GridLayout();
private JLabel labelFilterName = new JLabel();
private JLabel labelFilterType = new JLabel();
private JLabel labelFilterRules = new JLabel();
private JLabel jLabel4 = new JLabel();
//public JButton filterButton = new JButton();
private JTextField txtCardName = new JTextField();
private JTextField txtCardType = new JTextField();
private JTextField txtCardRules = new JTextField();
private JComboBox searchSetCombo = new JComboBox();
private JButton clearFilterButton = new JButton();
/** {@inheritDoc} */
@Override
public void setTitle(String message) {
super.setTitle(message);
}
/** {@inheritDoc} */
public void setDecks(CardPoolView topPool, CardPoolView bottomPool) {
top = new CardPool(topPool);
bottom = bottomPool;
topModel.clear();
bottomModel.clear();
if (gPBW.isVisible())
gPBW.setProgressRange(0, top.countDistinct() + bottom.countDistinct());
// this should have been called each step :)
if (gPBW.isVisible()) { gPBW.increment(); }
Predicate<CardRules> filter = buildFilter();
topModel.addCards(filter.select(top, CardPoolView.fnToCard));
// update bottom
bottomModel.addCards(bottom);
if (gPBW.isVisible())
gPBW.setTitle("Sorting Deck Editor");
topModel.resort();
topTable.repaint();
bottomModel.resort();
bottomTable.repaint();
}// updateDisplay
/**
* <p>
* updateDisplay.
* </p>
*/
/**
* <p>
* show.
* </p>
*
* @param exitCommand
* a {@link forge.Command} object.
*/
public void show(final Command exitCommand) {
final Command exit = new Command() {
private static final long serialVersionUID = 5210924838133689758L;
public void execute() {
DeckEditor.this.dispose();
exitCommand.execute();
}
};
// pm = new ProgressMonitor(this, "Loading Deck Editor", "", 0, 20000);
gPBW.setTitle("Loading Deck Editor");
gPBW.setVisible(true);
customMenu = new DeckEditorMenu(this, exit);
this.setJMenuBar(customMenu);
// do not change this!!!!
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent ev) {
customMenu.close();
}
});
setup();
// show cards, makes this user friendly
if (Constant.Runtime.GameType[0].equals(Constant.GameType.Constructed))
customMenu.newConstructed();
topModel.sort(1, true);
bottomModel.sort(1, true);
gPBW.dispose();
}// show(Command)
private void setup() {
List<TableColumnInfo<CardPrinted>> columns = new ArrayList<TableColumnInfo<CardPrinted>>();
columns.add(new TableColumnInfo<CardPrinted>("Qty", 30, CardColumnPresets.fnQtyCompare, CardColumnPresets.fnQtyGet));
columns.add(new TableColumnInfo<CardPrinted>("Name", 180, CardColumnPresets.fnNameCompare, CardColumnPresets.fnNameGet));
columns.add(new TableColumnInfo<CardPrinted>("Cost", 70, CardColumnPresets.fnCostCompare, CardColumnPresets.fnCostGet));
columns.add(new TableColumnInfo<CardPrinted>("Color", 50, CardColumnPresets.fnColorCompare, CardColumnPresets.fnColorGet));
columns.add(new TableColumnInfo<CardPrinted>("Type", 100, CardColumnPresets.fnTypeCompare, CardColumnPresets.fnTypeGet));
columns.add(new TableColumnInfo<CardPrinted>("Stats", 40, CardColumnPresets.fnStatsCompare, CardColumnPresets.fnStatsGet));
columns.add(new TableColumnInfo<CardPrinted>("R", 35, CardColumnPresets.fnRarityCompare, CardColumnPresets.fnRarityGet));
columns.add(new TableColumnInfo<CardPrinted>("Set", 40, CardColumnPresets.fnSetCompare, CardColumnPresets.fnSetGet));
columns.add(new TableColumnInfo<CardPrinted>("AI", 30, CardColumnPresets.fnAiStatusCompare, CardColumnPresets.fnAiStatusGet));
setupTables(columns, true);
// TODO use this as soon the deck editor has resizable GUI
// Use both so that when "un"maximizing, the frame isn't tiny
setSize(1024, 740);
setExtendedState(Frame.MAXIMIZED_BOTH);
// This was an attempt to limit the width of the deck editor to 1400
// pixels.
/*
* setSize(1024, 740); Rectangle bounds = getBounds(); Dimension screen
* = getToolkit().getScreenSize(); int maxWidth;
*
* if (screen.width >= 1400) { maxWidth = 1400; } else { maxWidth =
* screen.width; } bounds.width = maxWidth; bounds.height =
* screen.height;
*
* setMaximizedBounds(bounds);
*/
}// setupAndDisplay()
/**
* <p>
* Constructor for Gui_DeckEditor.
* </p>
*/
public DeckEditor() {
super(true, true);
try {
jbInit();
} catch (Exception ex) {
ErrorViewer.showError(ex);
}
}
/**
* <p>
* jbInit.
* </p>
*
* @throws java.lang.Exception
* if any.
*/
private void jbInit() throws Exception {
jbInitTables("All Cards", "Deck");
// removeButton.setIcon(upIcon);
if (!OldGuiNewGame.useLAFFonts.isSelected())
removeButton.setFont(new java.awt.Font("Dialog", 0, 13));
removeButton.setText("Remove from Deck");
removeButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
removeButton_actionPerformed(e);
}
});
addButton.setText("Add to Deck");
addButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
addButton_actionPerformed(e);
}
});
// addButton.setIcon(downIcon);
if (!OldGuiNewGame.useLAFFonts.isSelected())
addButton.setFont(new java.awt.Font("Dialog", 0, 13));
clearFilterButton.setText("Clear Filter");
clearFilterButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
clearFilterButton_actionPerformed(e);
}
});
if (!OldGuiNewGame.useLAFFonts.isSelected())
clearFilterButton.setFont(new java.awt.Font("Dialog", 0, 13));
analysisButton.setText("Deck Analysis");
analysisButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
analysisButton_actionPerformed(e);
}
});
if (!OldGuiNewGame.useLAFFonts.isSelected())
analysisButton.setFont(new java.awt.Font("Dialog", 0, 13));
/**
* Type filtering
*/
Font f = new Font("Tahoma", Font.PLAIN, 10);
for (JCheckBox box : filterBoxes.allTypes) {
if (!OldGuiNewGame.useLAFFonts.isSelected()) { box.setFont(f); }
box.setOpaque(false);
}
/**
* Color filtering
*/
for (JCheckBox box : filterBoxes.allColors) {
box.setOpaque(false);
}
// picture.addMouseListener(new CustomListener());
if (!OldGuiNewGame.useLAFFonts.isSelected())
statsLabel.setFont(new java.awt.Font("Dialog", 0, 13));
statsLabel.setText("Total: 0, Creatures: 0, Land: 0");
// Do not lower statsLabel any lower, we want this to be visible at 1024
// x 768 screen size
this.setTitle("Deck Editor");
jScrollPane3.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
jPanel3.setLayout(gridLayout1);
gridLayout1.setColumns(1);
gridLayout1.setRows(0);
statsLabel2.setText("Total: 0, Creatures: 0, Land: 0");
if (!OldGuiNewGame.useLAFFonts.isSelected())
statsLabel2.setFont(new java.awt.Font("Dialog", 0, 13));
/*
* jLabel1.setText(
* "Click on the column name (like name or color) to sort the cards");
*/
Container pane = this.getContentPane();
MigLayout layout = new MigLayout("fill");
pane.setLayout(layout);
// this.getContentPane().add(landCheckBox,
// "cell 0 0, egx checkbox, split 16");
boolean isFirst = true;
for (JCheckBox box : filterBoxes.allTypes) {
String growParameter = "grow";
if (isFirst) {
growParameter = "cell 0 0, egx checkbox, grow, split 14";
isFirst = false;
}
this.getContentPane().add(box, growParameter);
box.addItemListener(itemListenerUpdatesDisplay);
}
for (JCheckBox box : filterBoxes.allColors) {
this.getContentPane().add(box, "grow");
box.addItemListener(itemListenerUpdatesDisplay);
}
//this.getContentPane().add(filterButton, "wmin 100, hmin 25, wmax 140, hmax 25, grow");
this.getContentPane().add(clearFilterButton, "wmin 100, hmin 25, wmax 140, hmax 25, grow");
this.getContentPane().add(jScrollPane1, "cell 0 2 1 2, pushy, grow");
cardView.jbInit();
this.getContentPane().add(cardView, "cell 1 0 1 8, flowy, grow");
labelFilterName.setText("Name:");
labelFilterName.setToolTipText("Card names must include the text in this field");
this.getContentPane().add(labelFilterName, "cell 0 1, split 7");
this.getContentPane().add(txtCardName, "wmin 100, grow");
txtCardName.getDocument().addDocumentListener(new OnChangeTextUpdateDisplay());
/* txtCardName.getDocument().addDocumentListener(new DocumentListener() {
@Override public void removeUpdate(final DocumentEvent e) { }
@Override public void insertUpdate(final DocumentEvent e) { }
@Override public void changedUpdate(final DocumentEvent e) { updateDisplay(); }
});
*/
labelFilterType.setText("Type:");
labelFilterType.setToolTipText("Card types must include the text in this field");
this.getContentPane().add(labelFilterType, "");
this.getContentPane().add(txtCardType, "wmin 100, grow");
txtCardType.getDocument().addDocumentListener(new OnChangeTextUpdateDisplay());
labelFilterRules.setText("Text:");
labelFilterRules.setToolTipText("Card descriptions must include the text in this field");
this.getContentPane().add(labelFilterRules, "");
this.getContentPane().add(txtCardRules, "wmin 200, grow");
txtCardRules.getDocument().addDocumentListener(new OnChangeTextUpdateDisplay());
searchSetCombo.removeAllItems();
searchSetCombo.addItem("");
for (int i = 0; i < SetInfoUtil.getNameList().size(); i++)
searchSetCombo.addItem(SetInfoUtil.getNameList().get(i));
searchSetCombo.addItemListener(itemListenerUpdatesDisplay);
this.getContentPane().add(searchSetCombo, "wmin 150, grow");
this.getContentPane().add(statsLabel2, "cell 0 4");
this.getContentPane().add(addButton, "w 100, h 49, sg button, cell 0 5, split 4");
this.getContentPane().add(removeButton, "w 100, h 49, sg button");
// jLabel4 is used to push the analysis button to the right
// This will separate this button from the add and remove card buttons
jLabel4.setText("");
this.getContentPane().add(jLabel4, "wmin 100, grow");
this.getContentPane().add(analysisButton, "w 100, h 49, wrap");
this.getContentPane().add(jScrollPane2, "cell 0 6, grow");
this.getContentPane().add(statsLabel, "cell 0 7");
topTable.addMouseListener(new MouseAdapter() {
@Override public void mouseClicked(final MouseEvent e) {
if (e.getClickCount() == 2) { addCardFromTopTableToBottom(); }
}
});
//javax.swing.JRootPane rootPane = this.getRootPane();
//rootPane.setDefaultButton(filterButton);
}
@Override
protected Predicate<CardRules> buildFilter() {
List<Predicate<CardRules>> rules = new ArrayList<Predicate<CardRules>>(5);
rules.add(super.buildFilter());
if (StringUtils.isNotBlank(txtCardName.getText())) {
rules.add(CardRules.Predicates.name(StringOp.CONTAINS, txtCardName.getText()));
}
if (StringUtils.isNotBlank(txtCardType.getText())) {
rules.add(CardRules.Predicates.joinedType(StringOp.CONTAINS, txtCardType.getText()));
}
if (StringUtils.isNotBlank(txtCardRules.getText())) {
rules.add(CardRules.Predicates.rules(StringOp.CONTAINS, txtCardRules.getText()));
}
if (searchSetCombo.getSelectedIndex() != 0) {
String setCode = SetInfoUtil.getCode3ByName(searchSetCombo.getSelectedItem().toString());
rules.add(CardRules.Predicates.wasPrintedInSet(setCode));
}
return rules.size() == 1 ? rules.get(0) : Predicate.and(rules);
}
void clearFilterButton_actionPerformed(ActionEvent e) {
// disable automatic update triggered by listeners
isFiltersChangeFiringUpdate = false;
for (JCheckBox box : filterBoxes.allTypes) { if (!box.isSelected()) { box.doClick(); } }
for (JCheckBox box : filterBoxes.allColors) { if (!box.isSelected()) { box.doClick(); } }
txtCardName.setText("");
txtCardType.setText("");
txtCardRules.setText("");
searchSetCombo.setSelectedIndex(0);
// restore automatics ...
isFiltersChangeFiringUpdate = true;
// ... and force update
updateDisplay();
} // clearFilterButton_actionPerformed
/**
* <p>
* addButton_actionPerformed.
* </p>
*
* @param e
* a {@link java.awt.event.ActionEvent} object.
*/
void addButton_actionPerformed(ActionEvent e) {
addCardFromTopTableToBottom();
}// addButton_actionPerformed
void addCardFromTopTableToBottom() {
setTitle("Deck Editor : " + customMenu.getDeckName() + " : unsaved");
int n = topTable.getSelectedRow();
if (n != -1) {
CardPrinted c = topModel.rowToCard(n).getKey();
bottomModel.addCard(c);
bottomModel.resort();
if (!customMenu.getGameType().equals(Constant.GameType.Constructed)) {
top.remove(c);
topModel.removeCard(c);
}
fixSelection(topModel, topTable, n);
}// if(valid row)
}
/**
* <p>
* removeButton_actionPerformed.
* </p>
*
* @param e
* a {@link java.awt.event.ActionEvent} object.
*/
void removeButton_actionPerformed(ActionEvent e) {
setTitle("Deck Editor : " + customMenu.getDeckName() + " : unsaved");
int n = bottomTable.getSelectedRow();
if (n != -1) {
CardPrinted c = bottomModel.rowToCard(n).getKey();
bottomModel.removeCard(c);
if (!Constant.GameType.Constructed.equals(customMenu.getGameType())) {
topModel.addCard(c);
topModel.resort();
}
fixSelection(bottomModel, bottomTable, n);
}// if(valid row)
}//
// refresh Gui from deck, Gui shows the cards in the deck
/**
* <p>
* refreshGui.
* </p>
*/
@SuppressWarnings("unused")
// refreshGui
private void refreshGui() {
Deck deck = Constant.Runtime.HumanDeck[0];
if (deck == null) // this is just a patch, i know
deck = new Deck(Constant.Runtime.GameType[0]);
topModel.clear();
bottomModel.clear();
bottomModel.addCards(deck.getMain());
if (deck.isSealed() || deck.isDraft()) {
topModel.addCards(deck.getSideboard()); // add sideboard to GUI
} else {
topModel.addAllCards(CardDb.instance().getAllUniqueCards());
}
topModel.resort();
bottomModel.resort();
} // //refreshGui()
protected class OnChangeTextUpdateDisplay implements DocumentListener {
//private String lastText = "";
private void onChange() {
//String newValue = getTextFromDocument(e.getDocument();
//System.out.println(String.format("%s --> %s", lastText, nowText));
if (isFiltersChangeFiringUpdate) { updateDisplay(); }
}
private String getTextFromDocument(final Document doc) {
try {
return doc.getText(0, doc.getLength());
} catch (BadLocationException ex) {
return null;
}
}
@Override public void insertUpdate(DocumentEvent e) { onChange(); }
@Override public void removeUpdate(DocumentEvent e) { onChange(); }
// Happend only on ENTER pressed
@Override public void changedUpdate(DocumentEvent e) { }
}
}

View File

@@ -0,0 +1,210 @@
package forge.gui.deckeditor;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import javax.swing.event.MouseInputListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.filechooser.FileFilter;
import arcane.ui.CardPanel;
import net.slightlymagic.maxmtg.Predicate;
import forge.Card;
import forge.Constant;
import forge.GUI_DeckAnalysis;
import forge.GuiDisplayUtil;
import forge.ImageCache;
import forge.ImagePreviewPanel;
import forge.card.CardPool;
import forge.card.CardPrinted;
import forge.card.CardRules;
import forge.card.CardPoolView;
import forge.gui.game.CardDetailPanel;
import forge.gui.game.CardPicturePanel;
import forge.properties.ForgeProps;
import forge.properties.NewConstants;
public abstract class DeckEditorBase extends JFrame implements DeckDisplay {
private static final long serialVersionUID = -401223933343539977L;
//public JCheckBox whiteCheckBox = new GuiFilterCheckBox("white", "White");
public final FilterCheckBoxes filterBoxes;
// set this to false when resetting filter from code (like "clearFiltersPressed"), reset when done.
protected boolean isFiltersChangeFiringUpdate = true;
public final CardViewPanel cardView = new CardViewPanel();
// CardPools and Table data for top and bottom lists
protected CardPool top;
protected TableModel topModel;
protected JTable topTable = new JTable();
protected JScrollPane jScrollPane1 = new JScrollPane();
protected JLabel statsLabel = new JLabel();
protected CardPoolView bottom;
protected TableModel bottomModel;
protected JTable bottomTable = new JTable();
protected JScrollPane jScrollPane2 = new JScrollPane();
protected JLabel statsLabel2 = new JLabel();
// top shows available card pool
// if constructed, top shows all cards
// if sealed, top shows N booster packs
// if draft, top shows cards that were chosen
public final TableModel getTopTableModel() { return topModel; }
public final CardPool getTop() { return top; }
// bottom shows cards that the user has chosen for his library
public final CardPoolView getBottom() { return bottomModel.getCards(); }
protected DeckEditorBase(final boolean useFilters, final boolean areGraphicalFilters) {
filterBoxes = useFilters ? new FilterCheckBoxes(areGraphicalFilters) : null;
}
protected final void setupTables(List<TableColumnInfo<CardPrinted>> columns, boolean trackStats ) {
// construct topTable, get all cards
topModel = new TableModel(cardView, columns);
topModel.addListeners(topTable);
topTable.setModel(topModel);
topModel.resizeCols(topTable);
// construct bottomModel
bottomModel = new TableModel(cardView, columns);
bottomModel.addListeners(bottomTable);
bottomTable.setModel(bottomModel);
bottomModel.resizeCols(bottomTable);
if (trackStats)
{
// get stats from deck
bottomModel.addTableModelListener(new TableModelListener() {
public void tableChanged(final TableModelEvent ev) {
CardPoolView deck = bottomModel.getCards();
statsLabel.setText(getStats(deck));
}
});
// get stats from all cards
topModel.addTableModelListener(new TableModelListener() {
public void tableChanged(final TableModelEvent ev) {
CardPoolView deck = topModel.getCards();
statsLabel2.setText(getStats(deck));
}
});
}
}
protected final void jbInitTables(String topTitle, String bottomTitle)
{
Color gray = new Color(148, 145, 140);
TitledBorder titledBorder1 = new TitledBorder(BorderFactory.createEtchedBorder(Color.white, gray), topTitle);
TitledBorder titledBorder2 = new TitledBorder(BorderFactory.createEtchedBorder(Color.white, gray), bottomTitle);
this.getContentPane().setLayout(null);
String tableToolTip = "Click on the column name (like name or color) to sort the cards";
jScrollPane1.setBorder(titledBorder1);
jScrollPane1.setToolTipText(tableToolTip);
jScrollPane2.setBorder(titledBorder2);
jScrollPane2.setToolTipText(tableToolTip);
jScrollPane2.getViewport().add(bottomTable, null);
jScrollPane1.getViewport().add(topTable, null);
}
// This should not be here, but still found no better place
public static String getStats(CardPoolView deck) {
int total = deck.countAll();
int creature = CardRules.Predicates.Presets.isCreature.aggregate(deck, CardPoolView.fnToCard, CardPoolView.fnToCount);
int land = CardRules.Predicates.Presets.isLand.aggregate(deck, CardPoolView.fnToCard, CardPoolView.fnToCount);
StringBuffer show = new StringBuffer();
show.append("Total - ").append(total).append(", Creatures - ").append(creature).append(", Land - ").append(land);
String[] color = Constant.Color.onlyColors;
List<Predicate<CardRules>> predicates = CardRules.Predicates.Presets.colors;
for (int i = 0; i < color.length; ++i) {
show.append(String.format(", %s - %d", color[i], predicates.get(i).count(deck, CardPoolView.fnToCard)));
}
return show.toString();
}// getStats()
// THIS IS HERE FOR OVERLOADING!!!1
// or may be return abstract getFilter from derived class + this filter ... virtual protected member, but later
protected Predicate<CardRules> buildFilter() {
if (null == filterBoxes) {
return Predicate.getTrue(CardRules.class);
}
return filterBoxes.buildFilter();
}
void analysisButton_actionPerformed(ActionEvent e) {
if (bottomModel.getRowCount() == 0) {
JOptionPane.showMessageDialog(null, "Cards in deck not found.", "Analysis Deck",
JOptionPane.INFORMATION_MESSAGE);
} else {
DeckEditorBase g = DeckEditorBase.this;
GUI_DeckAnalysis dAnalysis = new GUI_DeckAnalysis(g, bottomModel);
dAnalysis.setVisible(true);
g.setEnabled(false);
}
}
protected ItemListener itemListenerUpdatesDisplay = new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (isFiltersChangeFiringUpdate) { updateDisplay(); }
}
};
public void updateDisplay() {
topModel.clear();
Predicate<CardRules> currentFilter = buildFilter();
topModel.addCards(currentFilter.select(top, CardPoolView.fnToCard));
topModel.resort();
}
// Call this after deleting an item from table
protected void fixSelection(TableModel model, JTable table, int rowLastSelected) {
// 3 cases: 0 cards left, select the same row, select prev row
int cntRowsAbove = model.getRowCount();
if (cntRowsAbove != 0) {
if (cntRowsAbove == rowLastSelected) { rowLastSelected--; } // move selection away from the last, already missing, option
table.setRowSelectionInterval(rowLastSelected, rowLastSelected);
}
}
}

View File

@@ -1,6 +1,17 @@
package forge;
package forge.gui.deckeditor;
import forge.AllZone;
import forge.Card;
import forge.CardList;
import forge.Command;
import forge.Constant;
import forge.Constant.GameType;
import forge.card.CardRules;
import forge.card.CardDb;
import forge.card.CardPool;
import forge.card.CardPoolView;
import forge.card.CardPrinted;
import forge.deck.Deck;
import forge.deck.DeckManager;
import forge.deck.DownloadDeck;
@@ -14,6 +25,7 @@ import forge.properties.NewConstants.LANG.Gui_DownloadPictures.ERRORS;
import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
@@ -26,6 +38,7 @@ import java.util.Collection;
import java.util.Collections;
//import java.util.HashMap;
//import java.util.Map;
import java.util.Map.Entry;
/**
* <p>Gui_DeckEditor_Menu class.</p>
@@ -33,7 +46,7 @@ import java.util.Collections;
* @author Forge
* @version $Id$
*/
public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
public class DeckEditorMenu extends JMenuBar implements NewConstants {
/** Constant <code>serialVersionUID=-4037993759604768755L</code> */
private static final long serialVersionUID = -4037993759604768755L;
@@ -63,7 +76,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
* @param gameType a {@link java.lang.String} object.
* @since 1.0.15
*/
public void setCurrentGameType(String gameType) {
public final void setCurrentGameType(final String gameType) {
currentGameType = gameType;
}
@@ -76,10 +89,10 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
/**
* <p>Constructor for Gui_DeckEditor_Menu.</p>
*
* @param in_display a {@link forge.DeckDisplay} object.
* @param in_display a {@link forge.gui.deckeditor.DeckDisplay} object.
* @param exit a {@link forge.Command} object.
*/
public Gui_DeckEditor_Menu(DeckDisplay in_display, Command exit) {
public DeckEditorMenu(final DeckDisplay in_display, final Command exit) {
deckDisplay = in_display;
exitCommand = exit;
@@ -89,13 +102,12 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
setDeckData("", false);
setupMenu();
setupFilterMenu();
setupSortMenu();
JMenu bugMenu = new JMenu("Report Bug");
JMenuItem bugReport = new JMenuItem("Report Bug");
bugReport.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
public void actionPerformed(final ActionEvent ev) {
BugzReporter br = new BugzReporter();
br.setVisible(true);
}
@@ -104,64 +116,6 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
this.add(bugMenu);
}
/**
* <p>setupFilterMenu.</p>
*/
private void setupFilterMenu() {
JMenuItem filter = new JMenuItem("New filter");
JMenuItem clearfilter = new JMenuItem("Clear filter");
JMenu menu = new JMenu("Filter");
menu.add(filter);
menu.add(clearfilter);
this.add(menu);
filter.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay;
GuiFilter filt = new GuiFilter(g, deckDisplay);
g.setEnabled(false);
filt.setVisible(true);
}
});
clearfilter.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
//CardList all = AllZone.getCardFactory().getAllCards();
//deckDisplay.updateDisplay(all, deckDisplay.getBottom());
deckDisplay.updateDisplay(deckDisplay.getTop(), deckDisplay.getBottom());
Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay;
g.blackCheckBox.setSelected(true);
g.blackCheckBox.setEnabled(true);
g.blueCheckBox.setSelected(true);
g.blueCheckBox.setEnabled(true);
g.greenCheckBox.setSelected(true);
g.greenCheckBox.setEnabled(true);
g.redCheckBox.setSelected(true);
g.redCheckBox.setEnabled(true);
g.whiteCheckBox.setSelected(true);
g.whiteCheckBox.setEnabled(true);
g.colorlessCheckBox.setSelected(true);
g.colorlessCheckBox.setEnabled(true);
g.artifactCheckBox.setSelected(true);
g.artifactCheckBox.setEnabled(true);
g.creatureCheckBox.setSelected(true);
g.creatureCheckBox.setEnabled(true);
g.enchantmentCheckBox.setSelected(true);
g.enchantmentCheckBox.setEnabled(true);
g.instantCheckBox.setSelected(true);
g.instantCheckBox.setEnabled(true);
g.landCheckBox.setSelected(true);
g.landCheckBox.setEnabled(true);
g.planeswalkerCheckBox.setSelected(true);
g.planeswalkerCheckBox.setEnabled(true);
g.sorceryCheckBox.setSelected(true);
g.sorceryCheckBox.setEnabled(true);
}
});
}
/**
* <p>setupSortMenu.</p>
@@ -196,21 +150,21 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
name.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
public void actionPerformed(final ActionEvent ev) {
//index 1 sorts by card name - for more info see TableSorter
// 0 1 2 3 4 5 6
//private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"};
Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay;
DeckEditor g = (DeckEditor) deckDisplay;
g.getTopTableModel().sort(1, true);
}
});
cost.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
public void actionPerformed(final ActionEvent ev) {
// 0 1 2 3 4 5 6
//private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"};
Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay;
DeckEditor g = (DeckEditor) deckDisplay;
//sort by type, color, cost
g.getTopTableModel().sort(4, true);
@@ -220,10 +174,10 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
});
color.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
public void actionPerformed(final ActionEvent ev) {
// 0 1 2 3 4 5 6
//private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"};
Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay;
DeckEditor g = (DeckEditor) deckDisplay;
//sort by type, cost, color
g.getTopTableModel().sort(4, true);
@@ -233,10 +187,10 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
});
type.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
public void actionPerformed(final ActionEvent ev) {
// 0 1 2 3 4 5 6
//private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"};
Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay;
DeckEditor g = (DeckEditor) deckDisplay;
//sort by cost, color, type
g.getTopTableModel().sort(2, true);
@@ -246,10 +200,10 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
});
stats.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
public void actionPerformed(final ActionEvent ev) {
// 0 1 2 3 4 5 6
//private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"};
Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay;
DeckEditor g = (DeckEditor) deckDisplay;
g.getTopTableModel().sort(4, true);
g.getTopTableModel().sort(2, true);
@@ -259,10 +213,10 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
});
rarity.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
public void actionPerformed(final ActionEvent ev) {
// 0 1 2 3 4 5 6
//private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"};
Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay;
DeckEditor g = (DeckEditor) deckDisplay;
//sort by cost, type, color, rarity
g.getTopTableModel().sort(2, true);
@@ -273,10 +227,10 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
});
newFirst.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
public void actionPerformed(final ActionEvent ev) {
// 0 1 2 3 4 5 6
//private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"};
Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay;
DeckEditor g = (DeckEditor) deckDisplay;
g.getTopTableModel().sort(99, true);
}
@@ -284,16 +238,6 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
}//setupSortMenu()
/**
* <p>populateShop.</p>
*
* @param shop a {@link forge.CardList} object.
* @param owned a {@link forge.CardList} object.
*/
public void populateShop(CardList shop, CardList owned) {
deckDisplay.updateDisplay(shop, owned);
}
/**
* <p>newConstructed.</p>
@@ -310,8 +254,12 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
setDeckData("", false);
// This is an expensive heap operation.
CardList allCards = new CardList(AllZone.getCardFactory());
deckDisplay.updateDisplay(allCards, new CardList());
CardPool allCards = new CardPool();
allCards.addAllCards(CardDb.instance().getAllUniqueCards());
deckDisplay.setDecks(allCards, new CardPoolView());
}//new constructed
/**
@@ -329,17 +277,18 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
setDeckData("", false);
CardList random = new CardList(AllZone.getCardFactory().getRandomCombinationWithoutRepetition(15 * 5));
random.add(AllZone.getCardFactory().getCard("Forest", AllZone.getHumanPlayer()));
random.add(AllZone.getCardFactory().getCard("Island", AllZone.getHumanPlayer()));
random.add(AllZone.getCardFactory().getCard("Plains", AllZone.getHumanPlayer()));
random.add(AllZone.getCardFactory().getCard("Mountain", AllZone.getHumanPlayer()));
random.add(AllZone.getCardFactory().getCard("Swamp", AllZone.getHumanPlayer()));
random.add(AllZone.getCardFactory().getCard("Terramorphic Expanse", AllZone.getHumanPlayer()));
CardPool cpRandom = new CardPool();
for (Card c : random) { cpRandom.add(CardDb.instance().getCard(c)); }
deckDisplay.updateDisplay(random, new CardList());
deckDisplay.setDecks(cpRandom, new CardPoolView());
}//new sealed
@@ -360,8 +309,11 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
GenerateConstructedDeck gen = new GenerateConstructedDeck();
// This is an expensive heap operation.
CardList allCards = new CardList(AllZone.getCardFactory());
deckDisplay.updateDisplay(allCards, gen.generateDeck());
CardPool allCards = new CardPool( CardDb.instance().getAllUniqueCards() );
CardPool generated = new CardPool();
for (Card c : gen.generateDeck()) { generated.add( CardDb.instance().getCard(c)); }
deckDisplay.setDecks(allCards, generated);
}//new sealed
@@ -623,14 +575,9 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
}
Card c = new Card();
CardList trueList = new CardList();
CardPool trueList = new CardPool();
for (int i = 0; i < trueCount; i++) {
for (int k = 0; k < Integer.parseInt(trueNumber[i]); k++) {
c = download.getCardDownload(c, trueName[i]);
trueList.add(c);
}
trueList.add(CardDb.instance().getCard(trueName[i]), Integer.parseInt(trueNumber[i]));
}
StringBuffer falseCards = new StringBuffer();
@@ -639,7 +586,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
}
deckDisplay.updateDisplay(deckDisplay.getTop(), trueList);
deckDisplay.setDecks(deckDisplay.getTop(), trueList);
if (falseCount == 0) {
JOptionPane.showMessageDialog(null, "Deck downloads.", "Information",
@@ -683,7 +630,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
//and the other 7 are the computer's deck
if (currentGameType.equals(Constant.GameType.Draft)) {
//read all draft decks
Deck d[] = deckManager.getDraftDeck(currentDeckName);
Deck[] d = deckManager.getDraftDeck(currentDeckName);
//replace your deck
d[0] = deck;
@@ -696,117 +643,9 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
throw new RuntimeException("Gui_DeckEditor_Menu : exportDeck() error, " + ex);
}
exportDeckText(deck, filename.getAbsolutePath());
}//exportDeck()
// @SuppressWarnings("unchecked")
// TableSorter type saftey
/**
* <p>exportDeckText.</p>
*
* @param aDeck a {@link forge.deck.Deck} object.
* @param filename a {@link java.lang.String} object.
*/
private void exportDeckText(Deck aDeck, String filename) {
//convert Deck into CardList
CardList all = new CardList();
for (int i = 0; i < aDeck.countMain(); i++) {
String cardName = aDeck.getMain(i);
if (cardName.contains("|")) {
String s[] = cardName.split("\\|", 2);
cardName = s[0];
}
Card c = AllZone.getCardFactory().getCard(cardName, null);
all.add(c);
}
//sort by card name
all.sort(new TableSorter(all, 1, true));
//remove all copies of cards
//make a singleton
CardList noCopies = new CardList();
for (int i = 0; i < all.size(); i++) {
Card c = all.get(i);
if (!noCopies.containsName(c.getName())) {
noCopies.add(c);
}
}
StringBuffer text = new StringBuffer();
String newLine = "\r\n";
int count = 0;
text.append(all.size()).append(" Total Cards").append(newLine).append(newLine);
//creatures
text.append(all.getType("Creature").size()).append(" Creatures").append(newLine);
text.append("-------------").append(newLine);
for (int i = 0; i < noCopies.size(); i++) {
Card c = noCopies.get(i);
if (c.isCreature()) {
count = all.getName(c.getName()).size();
text.append(count).append("x ").append(c.getName()).append(newLine);
}
}
//count spells, arg! this is tough
CardListFilter cf = new CardListFilter() {
public boolean addCard(Card c) {
return !(c.isCreature() || c.isLand());
}
};//CardListFilter
count = all.filter(cf).size();
//spells
text.append(newLine).append(count).append(" Spells").append(newLine);
text.append("----------").append(newLine);
for (int i = 0; i < noCopies.size(); i++) {
Card c = noCopies.get(i);
if (!(c.isCreature() || c.isLand())) {
count = all.getName(c.getName()).size();
text.append(count).append("x ").append(c.getName()).append(newLine);
}
}
//land
text.append(newLine).append(all.getType("Land").size()).append(" Land").append(newLine);
text.append("--------").append(newLine);
for (int i = 0; i < noCopies.size(); i++) {
Card c = noCopies.get(i);
if (c.isLand()) {
count = all.getName(c.getName()).size();
text.append(count).append("x ").append(c.getName()).append(newLine);
}
}
//remove ".deck" extension
int cut = filename.indexOf(".");
filename = filename.substring(0, cut);
try {
FileWriter writer = new FileWriter(filename + ".txt");
writer.write(text.toString());
writer.flush();
writer.close();
} catch (Exception ex) {
ErrorViewer.showError(ex);
throw new RuntimeException("Gui_DeckEditor_Menu : exportDeckText() error, " + ex.getMessage() + " : "
+ Arrays.toString(ex.getStackTrace()));
}
}//exportDeckText()
/**
* <p>getExportFilename.</p>
*
@@ -869,33 +708,11 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
*
* @param deck a {@link forge.deck.Deck} object.
*/
private void showConstructedDeck(Deck deck) {
private void showConstructedDeck(final Deck deck) {
setDeckData(deck.getName(), true);
CardList main = new CardList();
for (int i = 0; i < deck.countMain(); i++) {
String cardName = deck.getMain(i);
String setCode = "";
if (cardName.contains("|")) {
String s[] = cardName.split("\\|", 2);
cardName = s[0];
setCode = s[1];
}
Card c = AllZone.getCardFactory().getCard(cardName, AllZone.getHumanPlayer());
if (!setCode.equals("")) {
c.setCurSetCode(setCode);
} else if ((c.getSets().size() > 0)) // && card.getCurSetCode().equals(""))
{
c.setRandomSetCode();
}
main.add(c);
}
// This is an expensive heap operation.
CardList allCards = new CardList(AllZone.getCardFactory());
deckDisplay.updateDisplay(allCards, main);
CardPool allCards = new CardPool(CardDb.instance().getAllUniqueCards());
deckDisplay.setDecks(allCards, deck.getMain());
}//showConstructedDeck()
/**
@@ -929,41 +746,10 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
*
* @param deck a {@link forge.deck.Deck} object.
*/
public void showSealedDeck(Deck deck) {
public final void showSealedDeck(final Deck deck) {
setDeckData(deck.getName(), true);
currentDeckPlayerType = deck.getMetadata("PlayerType");
CardList top = new CardList();
if (deck.countSideboard() > 0) {
for (int i = 0; i < deck.countSideboard(); i++) {
String cardName = deck.getSideboard(i);
String setCode = "";
if (cardName.contains("|")) {
String s[] = cardName.split("\\|", 2);
cardName = s[0];
setCode = s[1];
}
Card c = AllZone.getCardFactory().getCard(cardName, AllZone.getHumanPlayer());
c.setCurSetCode(setCode);
top.add(c);
}
}
CardList bottom = new CardList();
if (deck.countMain() > 0) {
for (int i = 0; i < deck.countMain(); i++) {
String cardName = deck.getMain(i);
String setCode = "";
if (cardName.contains("|")) {
String s[] = cardName.split("\\|", 2);
cardName = s[0];
setCode = s[1];
}
Card c = AllZone.getCardFactory().getCard(cardName, AllZone.getHumanPlayer());
c.setCurSetCode(setCode);
bottom.add(c);
}
}
deckDisplay.updateDisplay(top, bottom);
deckDisplay.setDecks(deck.getSideboard(), deck.getMain());
}//showSealedDeck()
/**
@@ -993,32 +779,9 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
*
* @param deck a {@link forge.deck.Deck} object.
*/
private void showDraftDeck(Deck deck) {
private void showDraftDeck(final Deck deck) {
setDeckData(deck.getName(), true);
CardList top = new CardList();
for (int i = 0; i < deck.countSideboard(); i++) {
String cardName = deck.getSideboard(i);
if (cardName.contains("|")) {
String s[] = cardName.split("\\|", 2);
cardName = s[0];
}
top.add(AllZone.getCardFactory().getCard(cardName, AllZone.getHumanPlayer()));
}
CardList bottom = new CardList();
for (int i = 0; i < deck.countMain(); i++) {
String cardName = deck.getMain(i);
if (cardName.contains("|")) {
String s[] = cardName.split("\\|", 2);
cardName = s[0];
}
bottom.add(AllZone.getCardFactory().getCard(cardName, AllZone.getHumanPlayer()));
}
deckDisplay.updateDisplay(top, bottom);
deckDisplay.setDecks(deck.getSideboard(), deck.getMain());
}//showDraftDeck()
/**
@@ -1100,13 +863,13 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
}
setDeckData("", true);
deckDisplay.updateDisplay(new CardList(), new CardList());
deckDisplay.setDecks(new CardPoolView(), new CardPoolView());
}//delete
/**
* <p>close.</p>
*/
public void close() {
public final void close() {
if (debugPrint) {
System.out.println("Close");
}
@@ -1124,7 +887,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
* @param deckName a {@link java.lang.String} object.
* @param in_isDeckSaved a boolean.
*/
private void setDeckData(String deckName, boolean in_isDeckSaved) {
private void setDeckData(final String deckName, final boolean in_isDeckSaved) {
currentDeckName = deckName;
isDeckSaved = in_isDeckSaved;
@@ -1136,7 +899,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
*
* @param s a {@link java.lang.String} object.
*/
public void setTitle(String s) {
public final void setTitle(final String s) {
deckDisplay.setTitle(s);
}
@@ -1145,7 +908,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
*
* @return a {@link java.lang.String} object.
*/
public String getDeckName() {
public final String getDeckName() {
return currentDeckName;
}
@@ -1154,7 +917,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
*
* @return a {@link java.lang.String} object.
*/
public String getGameType() {
public final String getGameType() {
return currentGameType;
}
@@ -1163,7 +926,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
*
* @return a boolean.
*/
public boolean isDeckSaved() {
public final boolean isDeckSaved() {
return isDeckSaved;
}
@@ -1203,7 +966,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
* @param in a {@link java.lang.String} object.
* @return a {@link java.lang.String} object.
*/
private String cleanString(String in) {
private String cleanString(final String in) {
char[] c = in.toCharArray();
StringBuilder sb = new StringBuilder();
@@ -1222,7 +985,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
* @param deckType a {@link java.lang.String} object.
* @return a {@link java.lang.String} object.
*/
private String getUserInput_OpenDeck(String deckType) {
private String getUserInput_OpenDeck(final String deckType) {
ArrayList<String> choices = getDeckNames(deckType);
if (choices.size() == 0) {
JOptionPane.showMessageDialog(null, "No decks found", "Open Deck", JOptionPane.PLAIN_MESSAGE);
@@ -1246,7 +1009,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
* @param deckType a {@link java.lang.String} object.
* @return a {@link java.util.ArrayList} object.
*/
private ArrayList<String> getDeckNames(String deckType) {
private ArrayList<String> getDeckNames(final String deckType) {
ArrayList<String> list = new ArrayList<String>();
//only get decks according to the OldGuiNewGame screen option
@@ -1276,29 +1039,11 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
private Deck getDeck() {
Deck deck = new Deck(currentGameType);
deck.setName(currentDeckName);
CardList list;
String cardName;
//always move "bottom" to main
list = deckDisplay.getBottom();
for (int i = 0; i < list.size(); i++) {
if (!list.get(i).getCurSetCode().equals("")) {
cardName = list.get(i).getName() + "|" + list.get(i).getCurSetCode();
} else {
cardName = list.get(i).getName();
}
deck.addMain(AllZone.getNameChanger().getOriginalName(cardName));
}
deck.addMain(deckDisplay.getBottom());
//if sealed or draft, move "top" to sideboard
if (!currentGameType.equals(Constant.GameType.Constructed)) {
list = deckDisplay.getTop();
for (int i = 0; i < list.size(); i++) {
cardName = list.get(i).getName() + "|" + list.get(i).getCurSetCode();
deck.addSideboard(AllZone.getNameChanger().getOriginalName(cardName));
}
if (currentGameType.equals(Constant.GameType.Sealed))
deck.addMetaData("PlayerType", currentDeckPlayerType);
deck.addSideboard(deckDisplay.getTop());
}
return deck;
}//getDeck()
@@ -1365,7 +1110,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
//add listeners
exportDeck.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
public void actionPerformed(final ActionEvent ev) {
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
@@ -1381,7 +1126,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
importDeck.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
public void actionPerformed(final ActionEvent ev) {
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
@@ -1396,7 +1141,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
});
downloadDeck.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
public void actionPerformed(final ActionEvent ev) {
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
@@ -1411,7 +1156,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
});
newConstructed.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
public void actionPerformed(final ActionEvent ev) {
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
@@ -1427,7 +1172,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
newRandomConstructed.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
public void actionPerformed(final ActionEvent ev) {
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
@@ -1443,7 +1188,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
newGenerateConstructed.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
public void actionPerformed(final ActionEvent ev) {
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
@@ -1489,7 +1234,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
});
*/
openConstructed.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
public void actionPerformed(final ActionEvent ev) {
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
@@ -1504,7 +1249,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
});
openSealed.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
public void actionPerformed(final ActionEvent ev) {
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
@@ -1519,7 +1264,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
});
openDraft.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
public void actionPerformed(final ActionEvent ev) {
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
@@ -1534,7 +1279,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
});
save.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
public void actionPerformed(final ActionEvent ev) {
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
@@ -1549,7 +1294,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
});
saveAs.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
public void actionPerformed(final ActionEvent ev) {
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
@@ -1564,7 +1309,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
});
delete.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
public void actionPerformed(final ActionEvent ev) {
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
@@ -1579,7 +1324,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
});
close.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
public void actionPerformed(final ActionEvent ev) {
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {

View File

@@ -0,0 +1,360 @@
package forge.gui.deckeditor;
import forge.AllZone;
import forge.Card;
import forge.CardList;
import forge.Command;
import forge.Constant;
import forge.GUI_DeckAnalysis;
import forge.GuiDisplayUtil;
import forge.ImageCache;
import forge.ImagePreviewPanel;
import forge.MyRandom;
import forge.Constant.GameType;
import forge.Constant.Runtime;
import forge.card.CardRules;
import forge.card.CardDb;
import forge.card.CardPool;
import forge.card.CardPoolView;
import forge.card.CardPrinted;
import forge.deck.Deck;
import forge.error.ErrorViewer;
import forge.gui.game.CardDetailPanel;
import forge.gui.game.CardPicturePanel;
import forge.properties.ForgeProps;
import forge.properties.NewConstants;
import forge.view.swing.OldGuiNewGame;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import javax.swing.event.MouseInputAdapter;
import javax.swing.event.MouseInputListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.filechooser.FileFilter;
import net.slightlymagic.maxmtg.Predicate;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
import java.util.Map.Entry;
import java.util.Random;
//import forge.quest.data.QuestBoosterPack;
/**
* <p>
* Gui_Quest_DeckEditor class.
* </p>
*
* @author Forge
* @version $Id$
*/
public class DeckEditorQuest extends DeckEditorBase implements NewConstants {
/** Constant <code>serialVersionUID=152061168634545L</code> */
private static final long serialVersionUID = 152061168634545L;
DeckEditorQuestMenu customMenu;
// private ImageIcon upIcon = Constant.IO.upIcon;
// private ImageIcon downIcon = Constant.IO.downIcon;
private JButton addButton = new JButton();
private JButton removeButton = new JButton();
private JButton analysisButton = new JButton();
private GridLayout gridLayout1 = new GridLayout();
private JLabel jLabel1 = new JLabel();
/** {@inheritDoc} */
@Override
public void setTitle(String message) {
super.setTitle(message);
}
/** {@inheritDoc} */
public void setDecks(CardPoolView top, CardPoolView bottom) {
this.top = new CardPool( top );
this.bottom = bottom;
topModel.clear();
topModel.addCards(top);
bottomModel.clear();
bottomModel.addCards(bottom);
topModel.resort();
bottomModel.resort();
}// updateDisplay
/**
* <p>
* show.
* </p>
*
* @param exitCommand
* a {@link forge.Command} object.
*/
public void show(final Command exitCommand) {
final Command exit = new Command() {
private static final long serialVersionUID = -7428793574300520612L;
public void execute() {
DeckEditorQuest.this.dispose();
exitCommand.execute();
}
};
// do not change this!!!!
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent ev) {
customMenu.close();
}
});
setup();
customMenu = new DeckEditorQuestMenu(this, exit);
this.setJMenuBar(customMenu);
forge.quest.data.QuestData questData = AllZone.getQuestData();
Deck deck = null;
// open deck that the player used if QuestData has it
if (Constant.Runtime.HumanDeck[0] != null
&& questData.getDeckNames().contains(Constant.Runtime.HumanDeck[0].getName())) {
deck = questData.getDeck(Constant.Runtime.HumanDeck[0].getName());
} else {
deck = new Deck(Constant.GameType.Sealed);
deck.setName("");
}
// tell Gui_Quest_DeckEditor the name of the deck
customMenu.setPlayerDeckName(deck.getName());
CardPoolView bottomPool = deck.getMain();
CardPool cardpool = new CardPool();
cardpool.addAll(AllZone.getQuestData().getCardpool());
// remove bottom cards that are in the deck from the card pool
cardpool.removeAll(bottomPool);
// show cards, makes this user friendly, lol, well may, ha
setDecks(cardpool, bottomPool);
// this affects the card pool
topModel.sort(4, true);// sort by type
topModel.sort(3, true);// then sort by color
bottomModel.sort(1, true);
}// show(Command)
/**
* <p>
* setup.
* </p>
*/
public void setup() {
List<TableColumnInfo<CardPrinted>> columns = new ArrayList<TableColumnInfo<CardPrinted>>();
columns.add(new TableColumnInfo<CardPrinted>("Qty", 30, CardColumnPresets.fnQtyCompare, CardColumnPresets.fnQtyGet));
columns.add(new TableColumnInfo<CardPrinted>("Name", 180, CardColumnPresets.fnNameCompare, CardColumnPresets.fnNameGet));
columns.add(new TableColumnInfo<CardPrinted>("Cost", 70, CardColumnPresets.fnCostCompare, CardColumnPresets.fnCostGet));
columns.add(new TableColumnInfo<CardPrinted>("Color", 50, CardColumnPresets.fnColorCompare, CardColumnPresets.fnColorGet));
columns.add(new TableColumnInfo<CardPrinted>("Type", 100, CardColumnPresets.fnTypeCompare, CardColumnPresets.fnTypeGet));
columns.add(new TableColumnInfo<CardPrinted>("Stats", 40, CardColumnPresets.fnStatsCompare, CardColumnPresets.fnStatsGet));
columns.add(new TableColumnInfo<CardPrinted>("R", 35, CardColumnPresets.fnRarityCompare, CardColumnPresets.fnRarityGet));
columns.add(new TableColumnInfo<CardPrinted>("Set", 40, CardColumnPresets.fnSetCompare, CardColumnPresets.fnSetGet));
// Add NEW column here
setupTables(columns, true);
setSize(1024, 768);
this.setResizable(false);
Dimension screen = getToolkit().getScreenSize();
Rectangle bounds = getBounds();
bounds.width = 1024;
bounds.height = 768;
bounds.x = (screen.width - bounds.width) / 2;
bounds.y = (screen.height - bounds.height) / 2;
setBounds(bounds);
// TODO use this as soon the deck editor has resizable GUI
// //Use both so that when "un"maximizing, the frame isn't tiny
// setSize(1024, 740);
// setExtendedState(Frame.MAXIMIZED_BOTH);
}// setupAndDisplay()
public DeckEditorQuest() {
super(true, false);
try {
jbInit();
} catch (Exception ex) {
ErrorViewer.showError(ex);
}
}
private void jbInit() throws Exception {
jbInitTables("All Cards", "Your deck");
jScrollPane1.setBounds(new Rectangle(19, 20, 726, 346));
jScrollPane2.setBounds(new Rectangle(19, 458, 726, 218));
removeButton.setBounds(new Rectangle(180, 403, 146, 49));
// removeButton.setIcon(upIcon);
if (!OldGuiNewGame.useLAFFonts.isSelected())
removeButton.setFont(new java.awt.Font("Dialog", 0, 13));
removeButton.setText("Remove Card");
removeButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
removeButtonActionPerformed(e);
}
});
addButton.setText("Add Card");
addButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
addButtonActionPerformed(e);
}
});
// addButton.setIcon(downIcon);
if (!OldGuiNewGame.useLAFFonts.isSelected())
addButton.setFont(new java.awt.Font("Dialog", 0, 13));
addButton.setBounds(new Rectangle(23, 403, 146, 49));
analysisButton.setText("Deck Analysis");
analysisButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
analysisButton_actionPerformed(e);
}
});
if (!OldGuiNewGame.useLAFFonts.isSelected())
analysisButton.setFont(new java.awt.Font("Dialog", 0, 13));
analysisButton.setBounds(new Rectangle(578, 426, 166, 25));
cardView.jbInit();
/**
* Type filtering
*/
filterBoxes.land.setBounds(340, 400, 48, 20);
filterBoxes.creature.setBounds(385, 400, 65, 20);
filterBoxes.sorcery.setBounds(447, 400, 62, 20);
filterBoxes.instant.setBounds(505, 400, 60, 20);
filterBoxes.planeswalker.setBounds(558, 400, 85, 20);
filterBoxes.artifact.setBounds(638, 400, 58, 20);
filterBoxes.enchantment.setBounds(692, 400, 80, 20);
Font f = new Font("Tahoma", Font.PLAIN, 10);
for (JCheckBox box : filterBoxes.allTypes) {
if (!OldGuiNewGame.useLAFFonts.isSelected()) { box.setFont(f); }
box.setOpaque(false);
box.addItemListener(itemListenerUpdatesDisplay);
}
/**
* Color filtering
*/
filterBoxes.white.setBounds(340, 430, 40, 20);
filterBoxes.blue.setBounds(380, 430, 40, 20);
filterBoxes.black.setBounds(420, 430, 40, 20);
filterBoxes.red.setBounds(460, 430, 40, 20);
filterBoxes.green.setBounds(500, 430, 40, 20);
filterBoxes.colorless.setBounds(540, 430, 40, 20);
for (JCheckBox box : filterBoxes.allColors) {
box.setOpaque(false);
box.addItemListener(itemListenerUpdatesDisplay);
}
/**
* Other
*/
cardView.setBounds(new Rectangle(765, 23, 239, 687));
if (!OldGuiNewGame.useLAFFonts.isSelected())
statsLabel.setFont(new java.awt.Font("Dialog", 0, 14));
statsLabel.setText("Total - 0, Creatures - 0 Land - 0");
statsLabel.setBounds(new Rectangle(19, 672, 720, 31));
// Do not lower statsLabel any lower, we want this to be visible at 1024
// x 768 screen size
this.setTitle("Deck Editor");
gridLayout1.setColumns(1);
gridLayout1.setRows(0);
statsLabel2.setBounds(new Rectangle(19, 365, 720, 31));
statsLabel2.setText("Total - 0, Creatures - 0 Land - 0");
if (!OldGuiNewGame.useLAFFonts.isSelected())
statsLabel2.setFont(new java.awt.Font("Dialog", 0, 14));
jLabel1.setText("Click on the column name (like name or color) to sort the cards");
jLabel1.setBounds(new Rectangle(20, 1, 400, 19));
this.getContentPane().add(jScrollPane1, null);
this.getContentPane().add(jScrollPane2, null);
this.getContentPane().add(addButton, null);
this.getContentPane().add(removeButton, null);
this.getContentPane().add(analysisButton, null);
this.getContentPane().add(statsLabel2, null);
this.getContentPane().add(statsLabel, null);
this.getContentPane().add(jLabel1, null);
this.getContentPane().add(cardView, null);
for (JCheckBox box : filterBoxes.allTypes) {
this.getContentPane().add(box, null);
}
for (JCheckBox box : filterBoxes.allColors) {
this.getContentPane().add(box, null);
}
}
final void addButtonActionPerformed(final ActionEvent e) {
setTitle("Deck Editor : " + customMenu.getDeckName() + " : unsaved");
int n = topTable.getSelectedRow();
if (n == -1) { return; }
CardPrinted c = topModel.rowToCard(n).getKey();
bottomModel.addCard(c);
bottomModel.resort();
// remove from cardpool
top.remove(c);
// redraw top after deletion
updateDisplay();
fixSelection(topModel, topTable, n);
}
final void removeButtonActionPerformed(final ActionEvent e) {
setTitle("Deck Editor : " + customMenu.getDeckName() + " : unsaved");
int n = bottomTable.getSelectedRow();
if (n == -1) { return; }
CardPrinted c = bottomModel.rowToCard(n).getKey();
bottomModel.removeCard(c);
fixSelection(bottomModel, bottomTable, n);
top.add(c);
updateDisplay();
}
}

View File

@@ -0,0 +1,614 @@
package forge.gui.deckeditor;
import forge.AllZone;
import forge.Command;
import forge.Constant;
import forge.Constant.GameType;
import forge.card.CardCoreType;
import forge.card.CardRules;
import forge.card.CardDb;
import forge.card.CardRules.Predicates;
import forge.card.CardPool;
import forge.card.CardPoolView;
import forge.card.CardPrinted;
import forge.deck.Deck;
import forge.deck.DeckManager;
import forge.error.ErrorViewer;
import forge.gui.GuiUtils;
import forge.gui.ListChooser;
import forge.quest.data.QuestBattleManager;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.filechooser.FileFilter;
import org.apache.commons.lang3.StringUtils;
import org.apache.tools.ant.taskdefs.PathConvert.MapEntry;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map.Entry;
import java.util.Stack;
//presumes AllZone.getQuestData() is not null
/**
* <p>Gui_Quest_DeckEditor_Menu class.</p>
*
* @author Forge
* @version $Id$
*/
public class DeckEditorQuestMenu extends JMenuBar {
/** Constant <code>serialVersionUID=-4052319220021158574L</code> */
private static final long serialVersionUID = -4052319220021158574L;
//this should be false in the public version
//if true, the Quest Deck editor will let you edit the computer's decks
private final boolean canEditComputerDecks;
/** Constant <code>deckEditorName="Deck Editor"</code> */
private static final String deckEditorName = "Deck Editor";
//used for import and export, try to made the gui user friendly
/** Constant <code>previousDirectory</code> */
private static File previousDirectory = null;
private Command exitCommand;
private forge.quest.data.QuestData questData;
private Deck currentDeck;
//the class DeckDisplay is in the file "Gui_DeckEditor_Menu.java"
private DeckDisplay deckDisplay;
/**
* <p>Constructor for Gui_Quest_DeckEditor_Menu.</p>
*
* @param d a {@link forge.gui.deckeditor.DeckDisplay} object.
* @param exit a {@link forge.Command} object.
*/
public DeckEditorQuestMenu(DeckDisplay d, Command exit) {
//is a file named "edit" in this directory
//lame but it works, I don't like 2 versions of MTG Forge floating around
//one that lets you edit the AI decks and one that doesn't
File f = new File("edit");
if (f.exists()) canEditComputerDecks = true;
else canEditComputerDecks = false;
deckDisplay = d;
d.setTitle(deckEditorName);
questData = AllZone.getQuestData();
exitCommand = exit;
setupMenu();
}
/**
* <p>addImportExport.</p>
*
* @param menu a {@link javax.swing.JMenu} object.
* @param isHumanMenu a boolean.
*/
private void addImportExport(JMenu menu, final boolean isHumanMenu) {
JMenuItem import2 = new JMenuItem("Import");
JMenuItem export = new JMenuItem("Export");
import2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent a) {
importDeck();//importDeck(isHumanMenu);
}
});//import
export.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent a) {
exportDeck();
}
});//export
menu.add(import2);
menu.add(export);
}//addImportExport()
/**
* <p>exportDeck.</p>
*/
private void exportDeck() {
File filename = getExportFilename();
if (filename == null) return;
//write is an Object variable because you might just
//write one Deck object
Deck deck = cardPoolToDeck(deckDisplay.getBottom());
deck.setName(filename.getName());
try {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename));
out.writeObject(deck);
out.flush();
out.close();
} catch (Exception ex) {
ErrorViewer.showError(ex);
throw new RuntimeException("Gui_Quest_DeckEditor_Menu : exportDeck() error, " + ex);
}
exportDeckText(getExportDeckText(deck), filename.getAbsolutePath());
}//exportDeck()
/**
* <p>exportDeckText.</p>
*
* @param deckText a {@link java.lang.String} object.
* @param filename a {@link java.lang.String} object.
*/
private void exportDeckText(String deckText, String filename) {
//remove ".deck" extension
int cut = filename.indexOf(".");
filename = filename.substring(0, cut);
try {
FileWriter writer = new FileWriter(filename + ".txt");
writer.write(deckText);
writer.flush();
writer.close();
} catch (Exception ex) {
ErrorViewer.showError(ex);
throw new RuntimeException("Gui_Quest_DeckEditor_Menu : exportDeckText() error, " + ex.getMessage()
+ " : " + Arrays.toString(ex.getStackTrace()));
}
}//exportDeckText()
/**
* <p>getExportDeckText.</p>
*
* @param aDeck a {@link forge.deck.Deck} object.
* @return a {@link java.lang.String} object.
*/
private String getExportDeckText(Deck aDeck) {
//convert Deck into CardList
CardPoolView all = aDeck.getMain();
//sort by card name
Collections.sort( all.getOrderedList(), TableSorter.byNameThenSet );
StringBuffer sb = new StringBuffer();
String newLine = "\r\n";
sb.append(String.format("%d Total Cards%n%n", all.countAll()));
//creatures
sb.append(String.format("%d Creatures%n-------------%n", CardRules.Predicates.Presets.isCreature.aggregate(all, CardPoolView.fnToCard, CardPoolView.fnToCount)));
for (Entry<CardPrinted, Integer> e : CardRules.Predicates.Presets.isCreature.select(all, CardPoolView.fnToCard)) {
sb.append(String.format("%d x %s%n", e.getValue(), e.getKey().getName()));
}
//spells
sb.append(String.format("%d Spells%n----------%n", CardRules.Predicates.Presets.isNonCreatureSpell.aggregate(all, CardPoolView.fnToCard, CardPoolView.fnToCount)));
for (Entry<CardPrinted, Integer> e : CardRules.Predicates.Presets.isNonCreatureSpell.select(all, CardPoolView.fnToCard)) {
sb.append(String.format("%d x %s%n", e.getValue(), e.getKey().getName()));
}
//lands
sb.append(String.format("%d Land%n--------%n", CardRules.Predicates.Presets.isLand.aggregate(all, CardPoolView.fnToCard, CardPoolView.fnToCount)));
for (Entry<CardPrinted, Integer> e : CardRules.Predicates.Presets.isLand.select(all, CardPoolView.fnToCard)) {
sb.append(String.format("%d x %s%n", e.getValue(), e.getKey().getName()));
}
sb.append(newLine);
return sb.toString();
}//getExportDeckText
/**
* <p>getFileFilter.</p>
*
* @return a {@link javax.swing.filechooser.FileFilter} object.
*/
private FileFilter getFileFilter() {
FileFilter filter = new FileFilter() {
@Override
public boolean accept(File f) {
return f.getName().endsWith(".dck") || f.isDirectory();
}
@Override
public String getDescription() {
return "Deck File .dck";
}
};
return filter;
}//getFileFilter()
/**
* <p>getExportFilename.</p>
*
* @return a {@link java.io.File} object.
*/
private File getExportFilename() {
//Object o = null; // unused
JFileChooser save = new JFileChooser(previousDirectory);
save.setDialogTitle("Export Deck Filename");
save.setDialogType(JFileChooser.SAVE_DIALOG);
save.addChoosableFileFilter(getFileFilter());
save.setSelectedFile(new File(currentDeck.getName() + ".deck"));
int returnVal = save.showSaveDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = save.getSelectedFile();
String check = file.getAbsolutePath();
previousDirectory = file.getParentFile();
if (check.endsWith(".deck")) return file;
else return new File(check + ".deck");
}
return null;
}//getExportFilename()
/**
* <p>importDeck.</p>
*/
private void importDeck() {
File file = getImportFilename();
if (file == null) {
} else if (file.getName().endsWith(".dck")) {
try {
Deck newDeck = DeckManager.readDeck(file);
questData.addDeck(newDeck);
CardPool cardpool = new CardPool(questData.getCardpool());
CardPool decklist = new CardPool();
for (Entry<CardPrinted, Integer> s : newDeck.getMain()) {
CardPrinted cp = s.getKey();
decklist.add(cp, s.getValue());
cardpool.add(cp, s.getValue());
questData.getCardpool().add(cp, s.getValue());
}
deckDisplay.setDecks(cardpool, decklist);
} catch (Exception ex) {
ErrorViewer.showError(ex);
throw new RuntimeException("Gui_DeckEditor_Menu : importDeck() error, " + ex);
}
}
}//importDeck()
/**
* <p>getImportFilename.</p>
*
* @return a {@link java.io.File} object.
*/
private File getImportFilename() {
JFileChooser chooser = new JFileChooser(previousDirectory);
chooser.addChoosableFileFilter(getFileFilter());
int returnVal = chooser.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = chooser.getSelectedFile();
previousDirectory = file.getParentFile();
return file;
}
return null;
}//openFileDialog()
private final ActionListener addCardActionListener = new ActionListener() {
public void actionPerformed(final ActionEvent a) {
// Provide a model here: all unique cards to be displayed by only name (unlike default toString)
Iterable<CardPrinted> uniqueCards = CardDb.instance().getAllUniqueCards();
List<String> cards = new ArrayList<String>();
for (CardPrinted c : uniqueCards) { cards.add(c.getName()); }
Collections.sort(cards);
// use standard forge's list selection dialog
ListChooser<String> c = new ListChooser<String>("Cheat - Add Card to Your Cardpool", 0, 1, cards);
if (c.show()) {
String cardName = c.getSelectedValue();
DeckEditorQuest g = (DeckEditorQuest) deckDisplay;
g.getTop().add(CardDb.instance().getCard(cardName));
AllZone.getQuestData().getCardpool().add(CardDb.instance().getCard(cardName));
g.updateDisplay();
}
}
};
private final ActionListener openDeckActionListener = new ActionListener() {
public void actionPerformed(final ActionEvent a) {
String deckName = getUserInput_OpenDeck(questData.getDeckNames());
//check if user selected "cancel"
if (StringUtils.isBlank(deckName)) { return; }
setPlayerDeckName(deckName);
CardPool cards = new CardPool(questData.getCardpool().getView());
CardPoolView deck = questData.getDeck(deckName).getMain();
// show in pool all cards except ones used in deck
cards.removeAll(deck);
deckDisplay.setDecks(cards, deck);
}
};
private final ActionListener newDeckActionListener = new ActionListener() {
public void actionPerformed(final ActionEvent a) {
deckDisplay.setDecks(questData.getCardpool().getView(), new CardPool());
setPlayerDeckName("");
}
};
private final ActionListener renameDeckActionListener = new ActionListener() {
public void actionPerformed(final ActionEvent a) {
String deckName = getUserInput_GetDeckName(questData.getDeckNames());
//check if user cancels
if (StringUtils.isBlank(deckName)) { return; }
//is the current deck already saved and in QuestData?
if (questData.getDeckNames().contains(currentDeck.getName())) {
questData.removeDeck(currentDeck.getName());
}
currentDeck.setName(deckName);
Deck deck = cardPoolToDeck(deckDisplay.getBottom());
deck.setName(deckName);
questData.addDeck(deck);
setPlayerDeckName(deckName);
}
};
private final ActionListener saveDeckActionListener = new ActionListener() {
public void actionPerformed(ActionEvent a) {
String name = currentDeck.getName();
//check to see if name is set
if (name.equals("")) {
name = getUserInput_GetDeckName(questData.getDeckNames());
//check if user cancels
if (name.equals("")) return;
}
setPlayerDeckName(name);
Deck deck = cardPoolToDeck(deckDisplay.getBottom());
deck.setName(name);
questData.addDeck(deck);
}
};
private final ActionListener copyDeckActionListener = new ActionListener() {
public void actionPerformed(ActionEvent a) {
String name = getUserInput_GetDeckName(questData.getDeckNames());
//check if user cancels
if (name.equals("")) return;
setPlayerDeckName(name);
Deck deck = cardPoolToDeck(deckDisplay.getBottom());
deck.setName(name);
questData.addDeck(deck);
}
};
private final ActionListener deleteDeckActionListener = new ActionListener() {
public void actionPerformed(ActionEvent a) {
if (currentDeck.getName().equals("")) return;
int check = JOptionPane.showConfirmDialog(null, "Do you really want to delete this deck?",
"Delete", JOptionPane.YES_NO_OPTION);
if (check == JOptionPane.NO_OPTION) return; //stop here
questData.removeDeck(currentDeck.getName());
//show card pool
deckDisplay.setDecks(questData.getCardpool().getView(), new CardPool());
setPlayerDeckName("");
}
};
//the usual menu options that will be used
/**
* <p>setupMenu.</p>
*/
private void setupMenu() {
JMenuItem openDeck = new JMenuItem("Open");
JMenuItem newDeck = new JMenuItem("New");
JMenuItem rename = new JMenuItem("Rename");
JMenuItem save = new JMenuItem("Save");
JMenuItem copy = new JMenuItem("Copy");
JMenuItem delete = new JMenuItem("Delete");
JMenuItem exit = new JMenuItem("Exit");
JMenuItem addCard = new JMenuItem("Cheat - Add Card");
addCard.addActionListener(addCardActionListener);
openDeck.addActionListener(openDeckActionListener);
newDeck.addActionListener(newDeckActionListener);
rename.addActionListener(renameDeckActionListener);
save.addActionListener(saveDeckActionListener);
copy.addActionListener(copyDeckActionListener);
delete.addActionListener(deleteDeckActionListener);
//human
exit.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent a) {
DeckEditorQuestMenu.this.close();
}
});
JMenu deckMenu = new JMenu("Deck");
deckMenu.add(openDeck);
deckMenu.add(newDeck);
deckMenu.add(rename);
deckMenu.add(save);
deckMenu.add(copy);
if (Constant.Runtime.DevMode[0]) {
deckMenu.addSeparator();
deckMenu.add(addCard);
}
deckMenu.addSeparator();
addImportExport(deckMenu, true);
deckMenu.addSeparator();
deckMenu.add(delete);
deckMenu.addSeparator();
deckMenu.add(exit);
this.add(deckMenu);
}
/**
* <p>convertCardPoolToDeck.</p>
*
* @param list a {@link forge.CardPool} object.
* @return a {@link forge.deck.Deck} object.
*/
private Deck cardPoolToDeck(final CardPoolView list) {
//put CardPool into Deck main
Deck deck = new Deck(Constant.GameType.Sealed);
deck.addMain(list);
return deck;
}
//needs to be public because Gui_Quest_DeckEditor.show(Command) uses it
/**
* <p>setHumanPlayer.</p>
*
* @param deckName a {@link java.lang.String} object.
*/
public void setPlayerDeckName(String deckName) {
//the gui uses this, Gui_Quest_DeckEditor
currentDeck = new Deck(Constant.GameType.Sealed);
currentDeck.setName(deckName);
deckDisplay.setTitle(deckEditorName + " - " + deckName);
}
//only accepts numbers, letters or dashes up to 20 characters in length
/**
* <p>cleanString.</p>
*
* @param in a {@link java.lang.String} object.
* @return a {@link java.lang.String} object.
*/
private String cleanString(final String in) {
StringBuffer out = new StringBuffer();
char[] c = in.toCharArray();
for (int i = 0; i < c.length && i < 20; i++) {
if (Character.isLetterOrDigit(c[i]) || c[i] == '-' || c[i] == '_' || c[i] == ' ') { out.append(c[i]); }
}
return out.toString();
}
//if user cancels, returns ""
/**
* <p>getUserInput_GetDeckName.</p>
*
* @param nameList a {@link java.util.List} object.
* @return a {@link java.lang.String} object.
*/
private String getUserInput_GetDeckName(List<String> nameList) {
Object o = JOptionPane.showInputDialog(null, "", "Deck Name", JOptionPane.OK_CANCEL_OPTION);
if (o == null) return "";
String deckName = cleanString(o.toString());
if (nameList.contains(deckName) || deckName.equals("")) {
JOptionPane.showMessageDialog(null, "Please pick another deck name, a deck currently has that name.");
return getUserInput_GetDeckName(nameList);
}
return deckName;
}//getUserInput_GetDeckName()
//if user cancels, it will return ""
/**
* <p>getUserInput_OpenDeck.</p>
*
* @param deckNameList a {@link java.util.List} object.
* @return a {@link java.lang.String} object.
*/
private String getUserInput_OpenDeck(List<String> deckNameList) {
List<String> choices = deckNameList;
if (choices.size() == 0) {
JOptionPane.showMessageDialog(null, "No decks found", "Open Deck", JOptionPane.PLAIN_MESSAGE);
return "";
}
//Object o = JOptionPane.showInputDialog(null, "Deck Name", "Open Deck", JOptionPane.OK_CANCEL_OPTION, null,
// choices.toArray(), choices.toArray()[0]);
Object o = GuiUtils.getChoiceOptional("Select Deck", choices.toArray());
if (o == null) return "";
return o.toString();
}//getUserInput_OpenDeck()
//used by Gui_Quest_DeckEditor
/**
* <p>close.</p>
*/
public void close() {
exitCommand.execute();
}
//used by Gui_Quest_DeckEditor
/**
* <p>getDeckName.</p>
*
* @return a {@link java.lang.String} object.
*/
public String getDeckName() {
return currentDeck.getName();
}
}

View File

@@ -0,0 +1,97 @@
package forge.gui.deckeditor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.JCheckBox;
import net.slightlymagic.maxmtg.Predicate;
import forge.card.CardRules;
/**
* A structural class for some checkboxes need for a deck editor, contains no JPanel to store boxes on
* Checkboxes are public so the using class should place them in some container.
*/
class FilterCheckBoxes {
public final JCheckBox white;
public final JCheckBox blue;
public final JCheckBox black;
public final JCheckBox red;
public final JCheckBox green;
public final JCheckBox colorless;
public final JCheckBox land;
public final JCheckBox creature;
public final JCheckBox sorcery;
public final JCheckBox instant;
public final JCheckBox planeswalker;
public final JCheckBox artifact;
public final JCheckBox enchantment;
// Very handy for classes using mass operations on an array of checkboxes
public final List<JCheckBox> allColors;
public final List<JCheckBox> allTypes;
public FilterCheckBoxes(final boolean useGraphicalBoxes) {
if (useGraphicalBoxes) {
white = new GuiFilterCheckBox("white", "White");
blue = new GuiFilterCheckBox("blue", "Blue");
black = new GuiFilterCheckBox("black", "Black");
red = new GuiFilterCheckBox("red", "Red");
green = new GuiFilterCheckBox("green", "Green");
colorless = new GuiFilterCheckBox("colorless", "Colorless");
land = new GuiFilterCheckBox("land", "Land");
creature = new GuiFilterCheckBox("creature", "Creature");
sorcery = new GuiFilterCheckBox("sorcery", "Sorcery");
instant = new GuiFilterCheckBox("instant", "Instant");
planeswalker = new GuiFilterCheckBox("planeswalker", "Planeswalker");
artifact = new GuiFilterCheckBox("artifact", "Artifact");
enchantment = new GuiFilterCheckBox("enchant", "Enchantment");
} else {
white = new JCheckBox("W", true);
blue = new JCheckBox("U", true);
black = new JCheckBox("B", true);
red = new JCheckBox("R", true);
green = new JCheckBox("G", true);
colorless = new JCheckBox("C", true);
land = new JCheckBox("Land", true);
creature = new JCheckBox("Creature", true);
sorcery = new JCheckBox("Sorcery", true);
instant = new JCheckBox("Instant", true);
planeswalker = new JCheckBox("Planeswalker", true);
artifact = new JCheckBox("Artifact", true);
enchantment = new JCheckBox("Enchant", true);
}
allColors = Arrays.asList(new JCheckBox[]{ white, blue, black, red, green, colorless});
allTypes = Arrays.asList(new JCheckBox[]{ land, creature, sorcery, instant, planeswalker, artifact, enchantment });
}
public final Predicate<CardRules> buildFilter() {
List<Predicate<CardRules>> colors = new ArrayList<Predicate<CardRules>>();
if (white.isSelected()) { colors.add(CardRules.Predicates.Presets.isWhite); }
if (blue.isSelected()) { colors.add(CardRules.Predicates.Presets.isBlue); }
if (black.isSelected()) { colors.add(CardRules.Predicates.Presets.isBlack); }
if (red.isSelected()) { colors.add(CardRules.Predicates.Presets.isRed); }
if (green.isSelected()) { colors.add(CardRules.Predicates.Presets.isGreen); }
if (colorless.isSelected()) { colors.add(CardRules.Predicates.Presets.isColorless); }
Predicate<CardRules> filterByColor = colors.size() == 6 ? Predicate.getTrue(CardRules.class) : Predicate.or(colors);
List<Predicate<CardRules>> types = new ArrayList<Predicate<CardRules>>();
if (land.isSelected()) { types.add(CardRules.Predicates.Presets.isLand); }
if (creature.isSelected()) { types.add(CardRules.Predicates.Presets.isCreature); }
if (sorcery.isSelected()) { types.add(CardRules.Predicates.Presets.isSorcery); }
if (instant.isSelected()) { types.add(CardRules.Predicates.Presets.isInstant); }
if (planeswalker.isSelected()) { types.add(CardRules.Predicates.Presets.isPlaneswalker); }
if (artifact.isSelected()) { types.add(CardRules.Predicates.Presets.isArtifact); }
if (enchantment.isSelected()) { types.add(CardRules.Predicates.Presets.isEnchantment); }
Predicate<CardRules> filterByType = colors.size() == 7 ? Predicate.getTrue(CardRules.class) : Predicate.or(types);
return Predicate.and(filterByColor, filterByType);
}
}

View File

@@ -1,4 +1,4 @@
package forge;
package forge.gui.deckeditor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

View File

@@ -1,6 +1,15 @@
package forge;
package forge.gui.deckeditor;
import forge.AllZone;
import forge.BoosterDraft;
import forge.CardList;
import forge.Constant;
import forge.FileUtil;
import forge.HttpUtil;
import forge.Constant.GameType;
import forge.Constant.Runtime;
import forge.card.CardPoolView;
import forge.card.CardPrinted;
import forge.deck.Deck;
import forge.deck.DeckManager;
import forge.error.ErrorViewer;
@@ -15,10 +24,10 @@ import javax.swing.border.Border;
import javax.swing.border.TitledBorder;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import java.awt.Color;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
@@ -28,7 +37,7 @@ import java.util.Random;
* @author Forge
* @version $Id$
*/
public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConstants, NewConstants.LANG.Gui_BoosterDraft {
public class Gui_BoosterDraft extends JFrame implements NewConstants, NewConstants.LANG.Gui_BoosterDraft {
/**
* Constant <code>serialVersionUID=-6055633915602448260L</code>
*/
@@ -48,8 +57,7 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta
private JScrollPane jScrollPane2 = new JScrollPane();
private TitledBorder titledBorder1;
private TitledBorder titledBorder2;
private Border border3;
private TitledBorder titledBorder3;
private JLabel statsLabel = new JLabel();
private JTable allCardTable = new JTable();
private JTable deckTable = new JTable();
@@ -58,8 +66,8 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta
private GridLayout gridLayout1 = new GridLayout();
private JLabel statsLabel2 = new JLabel();
private JButton jButton1 = new JButton();
private CardDetailPanel detail = new CardDetailPanel(null);
private CardPicturePanel picture = new CardPicturePanel(null);
private CardViewPanelLite cardView = new CardViewPanelLite();
/**
* <p>showGui.</p>
@@ -102,18 +110,28 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta
addListeners();
// setupMenu();
List<TableColumnInfo<CardPrinted>> columns = new ArrayList<TableColumnInfo<CardPrinted>>();
columns.add(new TableColumnInfo<CardPrinted>("Qty", 30, CardColumnPresets.fnQtyCompare, CardColumnPresets.fnQtyGet));
columns.add(new TableColumnInfo<CardPrinted>("Name", 180, CardColumnPresets.fnNameCompare, CardColumnPresets.fnNameGet));
columns.add(new TableColumnInfo<CardPrinted>("Cost", 70, CardColumnPresets.fnCostCompare, CardColumnPresets.fnCostGet));
columns.add(new TableColumnInfo<CardPrinted>("Color", 50, CardColumnPresets.fnColorCompare, CardColumnPresets.fnColorGet));
columns.add(new TableColumnInfo<CardPrinted>("Type", 100, CardColumnPresets.fnTypeCompare, CardColumnPresets.fnTypeGet));
columns.add(new TableColumnInfo<CardPrinted>("Stats", 40, CardColumnPresets.fnStatsCompare, CardColumnPresets.fnStatsGet));
columns.add(new TableColumnInfo<CardPrinted>("R", 35, CardColumnPresets.fnRarityCompare, CardColumnPresets.fnRarityGet));
columns.add(new TableColumnInfo<CardPrinted>("Set", 40, CardColumnPresets.fnSetCompare, CardColumnPresets.fnSetGet));
columns.add(new TableColumnInfo<CardPrinted>("AI", 30, CardColumnPresets.fnAiStatusCompare, CardColumnPresets.fnAiStatusGet));
//construct allCardTable, get all cards
allCardModel = new TableModel(new CardList(), this);
allCardModel = new TableModel(cardView, columns);
allCardModel.addListeners(allCardTable);
allCardTable.setModel(allCardModel);
allCardModel.resizeCols(allCardTable);
//construct deckModel
deckModel = new TableModel(this);
deckModel = new TableModel(cardView, columns);
deckModel.addListeners(deckTable);
deckTable.setModel(deckModel);
deckModel.resizeCols(deckTable);
//add cards to GUI from deck
@@ -121,7 +139,7 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta
allCardTable.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
public void mousePressed(final MouseEvent e) {
if ((e.getModifiers() & InputEvent.BUTTON3_MASK) != 0) jButton1_actionPerformed(null);
}
});//MouseListener
@@ -130,8 +148,7 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta
//get stats from deck
deckModel.addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent ev) {
CardList deck = deckModel.getCards();
statsLabel.setText(getStats(deck));
statsLabel.setText(getStats(deckModel.getCards()));
}
});
@@ -139,8 +156,8 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta
//get stats from all cards
allCardModel.addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent ev) {
CardList deck = allCardModel.getCards();
statsLabel2.setText(getStats(deck));
statsLabel2.setText(getStats(allCardModel.getCards()));
}
});
@@ -149,29 +166,11 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta
setExtendedState(Frame.MAXIMIZED_BOTH);
}//setupAndDisplay()
/**
* <p>getStats.</p>
*
* @param deck a {@link forge.CardList} object.
* @return a {@link java.lang.String} object.
*/
private String getStats(CardList deck) {
int total = deck.size();
int creature = deck.getType("Creature").size();
int land = deck.getType("Land").size();
StringBuffer show = new StringBuffer();
show.append("Total - ").append(total).append(", Creatures - ").append(creature).append(", Land - ").append(land);
String[] color = Constant.Color.Colors;
for (int i = 0; i < 5; i++)
show.append(", ").append(color[i]).append(" - ").append(CardListUtil.getColor(deck, color[i]).size());
private String getStats(final CardPoolView deck) {
return DeckEditorBase.getStats(deck);
}
return show.toString();
}//getStats()
/**
* <p>Constructor for Gui_BoosterDraft.</p>
*/
public Gui_BoosterDraft() {
try {
jbInit();
@@ -180,20 +179,6 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta
}
}
/**
* <p>getCard.</p>
*
* @return a {@link forge.Card} object.
*/
public Card getCard() {
return detail.getCard();
}
/** {@inheritDoc} */
public void setCard(Card card) {
detail.setCard(card);
picture.setCard(card);
}
/**
* <p>jbInit.</p>
@@ -205,16 +190,16 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta
"Previously Picked Cards");
titledBorder2 = new TitledBorder(BorderFactory.createEtchedBorder(Color.white, new Color(148, 145, 140)),
"Choose one card");
border3 = BorderFactory.createEtchedBorder(Color.white, new Color(148, 145, 140));
titledBorder3 = new TitledBorder(border3, "Card Detail");
this.getContentPane().setLayout(null);
jScrollPane1.setBorder(titledBorder2);
jScrollPane1.setBounds(new Rectangle(19, 28, 661, 344));
jScrollPane2.setBorder(titledBorder1);
jScrollPane2.setBounds(new Rectangle(19, 478, 661, 184));
detail.setBorder(titledBorder3);
detail.setBounds(new Rectangle(693, 23, 239, 323));
picture.setBounds(new Rectangle(693, 348, 240, 340));
cardView.jbInit();
cardView.setBounds(new Rectangle(693, 23, 239, 665));
statsLabel.setFont(new java.awt.Font("Dialog", 0, 16));
statsLabel.setText("Total - 0, Creatures - 0 Land - 0");
statsLabel.setBounds(new Rectangle(19, 665, 665, 31));
@@ -237,8 +222,7 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta
jButton1_actionPerformed(e);
}
});
this.getContentPane().add(detail, null);
this.getContentPane().add(picture, null);
this.getContentPane().add(cardView, null);
this.getContentPane().add(jScrollPane1, null);
this.getContentPane().add(statsLabel2, null);
this.getContentPane().add(statsLabel, null);
@@ -258,13 +242,11 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta
if (n != -1) {
setTitle("Deck Editor - " + Constant.Runtime.HumanDeck[0].getName() + " - changed");
Card c = allCardModel.rowToCard(n);
CardPrinted c = allCardModel.rowToCard(n).getKey();
deckModel.addCard(c);
deckModel.resort();
if (limitedDeckEditor) {
allCardModel.removeCard(c);
}
//3 conditions" 0 cards left, select the same row, select next row
int size = allCardModel.getRowCount();
@@ -285,7 +267,7 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta
if (n != -1) {
setTitle("Deck Editor - " + Constant.Runtime.HumanDeck[0].getName() + " - changed");
Card c = deckModel.rowToCard(n);
CardPrinted c = deckModel.rowToCard(n).getKey();
deckModel.removeCard(c);
if (limitedDeckEditor) {
@@ -304,235 +286,6 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta
//if true, don't do anything else
/**
* <p>checkSaveDeck.</p>
*
* @return a boolean.
*/
private boolean checkSaveDeck() {
//a crappy way of checking if the deck has been saved
if (getTitle().endsWith("changed")) {
int n = JOptionPane.showConfirmDialog(null, ForgeProps.getLocalized(SAVE_MESSAGE),
ForgeProps.getLocalized(SAVE_TITLE), JOptionPane.YES_NO_CANCEL_OPTION);
if (n == JOptionPane.CANCEL_OPTION) return true;
else if (n == JOptionPane.YES_OPTION) saveItem_actionPerformed();
}
return false;
}//checkSaveDeck()
/**
* <p>newItem_actionPerformed.</p>
*/
private void newItem_actionPerformed() {
if (checkSaveDeck()) return;
setTitle("Deck Editor");
Deck deck = Constant.Runtime.HumanDeck[0];
while (deck.countMain() != 0)
deck.addSideboard(deck.removeMain(0));
//refreshGui();
}//newItem_actionPerformed
/**
* <p>closeItem_actionPerformed.</p>
*/
private void closeItem_actionPerformed() {
//check if saved, show dialog "yes, "no"
checkSaveDeck();
dispose();
}
/**
* <p>stats_actionPerformed.</p>
*
* @param list a {@link forge.CardList} object.
*/
private void stats_actionPerformed(CardList list) {
}
/**
* <p>saveAsItem_actionPerformed.</p>
*/
private void saveAsItem_actionPerformed() {
}//saveItem_actionPerformed()
/**
* <p>saveItem_actionPerformed.</p>
*/
private void saveItem_actionPerformed() {
}
/**
* <p>openItem_actionPerformed.</p>
*/
private void openItem_actionPerformed() {
}//openItem_actionPerformed()
/**
* <p>deleteItem_actionPerformed.</p>
*/
public void deleteItem_actionPerformed() {
}
/**
* <p>renameItem_actionPerformed.</p>
*/
public void renameItem_actionPerformed() {
String newName = "";
while (newName.equals("")) {
newName = JOptionPane.showInputDialog(null, ForgeProps.getLocalized(RENAME_MESSAGE),
ForgeProps.getLocalized(RENAME_TITLE), JOptionPane.QUESTION_MESSAGE);
if (newName == null) break;
}
//when the user selects "Cancel"
if (newName != null) {
//String oldName = Constant.Runtime.HumanDeck[0].getName(); //unused
Constant.Runtime.HumanDeck[0].setName(newName);
setTitle("Deck Editor - " + newName + " - changed");
}
}
/**
* <p>setupMenu.</p>
*/
@SuppressWarnings("unused")
// setupMenu
private void setupMenu() {
//final boolean[] isSaved = new boolean[1]; // unused
JMenuItem newItem = new JMenuItem("New");
JMenuItem openItem = new JMenuItem("Open");
JMenuItem saveItem = new JMenuItem("Save");
JMenuItem saveAsItem = new JMenuItem("Save As");
JMenuItem renameItem = new JMenuItem("Rename");
JMenuItem deleteItem = new JMenuItem("Delete");
JMenuItem statsPoolItem = new JMenuItem("Statistics - Card Pool");
JMenuItem statsDeckItem = new JMenuItem("Statistics - Deck");
JMenuItem closeItem = new JMenuItem("Close");
newItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
newItem_actionPerformed();
}
});
openItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
openItem_actionPerformed();
}
});
saveItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
saveItem_actionPerformed();
}
});
saveAsItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
saveAsItem_actionPerformed();
}
});
renameItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
renameItem_actionPerformed();
}
});
deleteItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
deleteItem_actionPerformed();
}
});
statsPoolItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
stats_actionPerformed(allCardModel.getCards());
}
});
statsDeckItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
stats_actionPerformed(deckModel.getCards());
}
});
closeItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
closeItem_actionPerformed();
}
});
JMenu fileMenu = new JMenu("Deck Actions");
fileMenu.add(newItem);
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.add(saveAsItem);
fileMenu.addSeparator();
fileMenu.add(renameItem);
fileMenu.add(deleteItem);
// fileMenu.add(statsPoolItem);
// fileMenu.add(statsDeckItem);
fileMenu.addSeparator();
fileMenu.add(closeItem);
JMenuBar menuBar = new JMenuBar();
menuBar.add(fileMenu);
this.setJMenuBar(menuBar);
}/*setupMenu(); */
//refresh Gui from deck, Gui shows the cards in the deck
// /**
// * <p>refreshGui.</p>
// */
/* private void refreshGui() {
Deck deck = Constant.Runtime.HumanDeck[0];
if (deck == null) //this is just a patch, i know
deck = new Deck(Constant.Runtime.GameType[0]);
allCardModel.clear();
deckModel.clear();
Card c;
//ReadDraftBoosterPack pack = new ReadDraftBoosterPack();
for (int i = 0; i < deck.countMain(); i++) {
c = AllZone.getCardFactory().getCard(deck.getMain(i), AllZone.getHumanPlayer());
//add rarity to card if this is a sealed card pool
//if (!Constant.Runtime.GameType[0].equals(Constant.GameType.Constructed))
// c.setRarity(pack.getRarity(c.getName()));
//;
deckModel.addCard(c);
}//for
if (deck.isSealed() || deck.isRegular()) {
//add sideboard to GUI
for (int i = 0; i < deck.countSideboard(); i++) {
c = AllZone.getCardFactory().getCard(deck.getSideboard(i), AllZone.getHumanPlayer());
//c.setRarity(pack.getRarity(c.getName()));
allCardModel.addCard(c);
}
} else {
* Braids: "getAllCards copies the entire array, but that does not
* seem to be needed here. Significant performance improvement is
* possible if this code used getCards instead (along with a for each
* loop instead of using get(i), if applicable)."
// CardList all = AllZone.getCardFactory().getAllCards();
// for (int i = 0; i < all.size(); i++)
// allCardModel.addCard(all.get(i));
}
allCardModel.resort();
deckModel.resort();
}//refreshGui()
*/
//updates Constant.Runtime.HumanDeck[0] from the cards shown in the GUI
/**
* <p>refreshDeck.</p>
@@ -546,15 +299,10 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta
Constant.Runtime.HumanDeck[0] = deck;
//update Deck with cards shown in GUI
CardList list = deckModel.getCards();
for (int i = 0; i < list.size(); i++)
deck.addMain(list.get(i).getName());
deck.addMain(deckModel.getCards());
if (deck.isSealed()) {
//add sideboard to deck
list = allCardModel.getCards();
for (int i = 0; i < list.size(); i++)
deck.addSideboard(list.get(i).getName());
deck.addSideboard(allCardModel.getCards());
}
}/* refreshDeck() */
@@ -569,7 +317,7 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta
if (n == -1) //is valid selection?
return;
Card c = allCardModel.rowToCard(n);
CardPrinted c = allCardModel.rowToCard(n).getKey();
deckModel.addCard(c);
deckModel.resort();
@@ -608,38 +356,9 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta
*
* @param list a {@link forge.CardList} object.
*/
private void showChoices(CardList list) {
private void showChoices(CardPoolView list) {
allCardModel.clear();
//ReadDraftBoosterPack pack = new ReadDraftBoosterPack();
Card c;
for (int i = 0; i < list.size(); i++) {
c = list.get(i);
//c.setRarity(pack.getRarity(c.getName()));
//String PC = c.getSVar("PicCount");
Random r = MyRandom.random;
//int n = 0;
//if (PC.matches("[0-9][0-9]?"))
// n = Integer.parseInt(PC);
//if (n > 1)
// c.setRandomPicture(r.nextInt(n));
if (c.getCurSetCode().equals(""))
c.setCurSetCode(c.getMostRecentSet());
if (!c.getCurSetCode().equals("")) {
int n = SetInfoUtil.getSetInfo_Code(c.getSets(), c.getCurSetCode()).PicCount;
if (n > 1)
c.setRandomPicture(r.nextInt(n - 1) + 1);
c.setImageFilename(CardUtil.buildFilename(c));
c.setRarity(SetInfoUtil.getSetInfo_Code(c.getSets(), c.getCurSetCode()).Rarity);
}
allCardModel.addCard(c);
}
allCardModel.addCards(list);
allCardModel.resort();
allCardTable.setRowSelectionInterval(0, 0);
@@ -655,10 +374,8 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta
Constant.Runtime.HumanDeck[0] = deck;
//add sideboard to deck
CardList list = deckModel.getCards();
for (int i = 0; i < list.size(); i++)
deck.addSideboard(list.get(i).getName() + "|" + list.get(i).getCurSetCode());
CardPoolView list = deckModel.getCards();
deck.addSideboard(list);
for (int i = 0; i < 20; i++) {
deck.addSideboard("Forest|" + BoosterDraft.LandSetCode[0]);

View File

@@ -0,0 +1,53 @@
package forge.gui.deckeditor;
import java.util.Map.Entry;
import net.slightlymagic.braids.util.lambda.Lambda1;
/**
* Holds single column set up for TableModel.
* Contains name, width + functions to retrieve column's value for compare and for display
* (they are different, in case of sets for instance)
*/
@SuppressWarnings("rawtypes")
public class TableColumnInfo<T> {
private final String name;
public int minWidth;
public int maxWidth;
public int nominalWidth;
public boolean isMinMaxApplied = true;
public final Lambda1<Comparable, Entry<T, Integer>> fnSort; // this will be used for sorting
public final Lambda1<Object, Entry<T, Integer>> fnDisplay; // this is used to display
public final String getName() { return name; }
public TableColumnInfo(final String colName,
final Lambda1<Comparable, Entry<T, Integer>> fieldSort,
final Lambda1<Object, Entry<T, Integer>> fieldDisplay) {
fnSort = fieldSort;
fnDisplay = fieldDisplay;
this.name = colName;
}
public TableColumnInfo(final String colName, final int width,
final Lambda1<Comparable, Entry<T, Integer>> fieldSort,
final Lambda1<Object, Entry<T, Integer>> fieldDisplay) {
this(colName, fieldSort, fieldDisplay);
this.maxWidth = width;
this.minWidth = width;
this.nominalWidth = width;
}
public TableColumnInfo(final String colName, final int wMin, final int width, final int wMax,
final Lambda1<Comparable, Entry<T, Integer>> fieldSort,
final Lambda1<Object, Entry<T, Integer>> fieldDisplay) {
this(colName, fieldSort, fieldDisplay);
this.maxWidth = wMax;
this.minWidth = wMin;
this.nominalWidth = width;
}
}

View File

@@ -0,0 +1,230 @@
package forge.gui.deckeditor;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import net.slightlymagic.braids.util.lambda.Lambda1;
import forge.Card;
import forge.SetInfoUtil;
import forge.card.CardPool;
import forge.card.CardPoolView;
import forge.card.CardPrinted;
import java.awt.event.*;
import java.util.Collections;
import java.util.List;
import java.util.Map.Entry;
/**
* <p>TableModel class.</p>
*
* @author Forge
* @version $Id$
*/
public class TableModel extends AbstractTableModel {
/**
*
*/
private static final long serialVersionUID = -6896726613116254828L;
@SuppressWarnings("rawtypes") // We use raw comparables to provide fields for sorting
private int sortColumn;
private boolean isSortAsc = true;
private CardPool data = new CardPool();
private final CardDisplay cardDisplay;
private final List<TableColumnInfo<CardPrinted>> columns;
public TableModel(final CardDisplay cd, List<TableColumnInfo<CardPrinted>> columnsToShow ) {
cardDisplay = cd;
columns = columnsToShow;
columns.get(4).isMinMaxApplied = false;
}
@SuppressWarnings("rawtypes")
private final TableColumnInfo<CardPrinted> columnAI = new TableColumnInfo<CardPrinted>("AI", 30,
new Lambda1<Comparable, Entry<CardPrinted, Integer>>() {
@Override public Comparable apply(final Entry<CardPrinted, Integer> from) {
return "n/a"; } },
new Lambda1<Object, Entry<CardPrinted, Integer>>() {
@Override public Object apply(final Entry<CardPrinted, Integer> from) {
return "n/a"; } });
/*
columnQty, columnName, columnCost,
columnColor, columnType, columnStats,
columnRarity, columnSet, columnAI
*/
public void resizeCols(final JTable table) {
TableColumn tableColumn = null;
for (int i = 0; i < table.getColumnCount(); i++) {
tableColumn = table.getColumnModel().getColumn(i);
TableColumnInfo<CardPrinted> colInfo = columns.get(i);
tableColumn.setPreferredWidth(colInfo.nominalWidth);
if (colInfo.isMinMaxApplied) {
tableColumn.setMinWidth(colInfo.minWidth);
tableColumn.setMaxWidth(colInfo.maxWidth);
}
}//for
}
public void clear() { data.clear(); }
public CardPoolView getCards() { return data.getView(); }
/**
* <p>removeCard.</p>
*
* @param c a {@link forge.Card} object.
*/
public void removeCard(final CardPrinted c) {
boolean wasThere = data.count(c) > 0;
if (wasThere) {
data.remove(c);
fireTableDataChanged();
}
}
public void addCard(final CardPrinted c) {
data.add(c);
fireTableDataChanged();
}
public void addCard(final CardPrinted c, final int count) {
data.add(c, count);
fireTableDataChanged();
}
public void addCard(final Entry<CardPrinted, Integer> e) {
data.add(e.getKey(), e.getValue());
fireTableDataChanged();
}
public void addCards(final Iterable<Entry<CardPrinted, Integer>> c) {
data.addAll(c);
fireTableDataChanged();
}
public void addAllCards(final Iterable<CardPrinted> c) {
data.addAllCards(c);
fireTableDataChanged();
}
public Entry<CardPrinted, Integer> rowToCard(final int row) {
return data.getOrderedList().get(row);
}
public int getRowCount() {
return data.countDistinct();
}
public int getColumnCount() {
return columns.size();
}
/** {@inheritDoc} */
@Override
public String getColumnName(int n) {
return columns.get(n).getName();
}
/** {@inheritDoc} */
public Object getValueAt(int row, int column) {
return columns.get(column).fnDisplay.apply(rowToCard(row));
}
class ColumnListener extends MouseAdapter {
protected JTable table;
public ColumnListener(JTable t) { table = t; }
public void mouseClicked(MouseEvent e) {
TableColumnModel colModel = table.getColumnModel();
int columnModelIndex = colModel.getColumnIndexAtX(e.getX());
int modelIndex = colModel.getColumn(columnModelIndex).getModelIndex();
if (modelIndex < 0) { return; }
if (sortColumn == modelIndex) {
isSortAsc = !isSortAsc;
}
else {
isSortAsc = true;
sortColumn = modelIndex;
}
for (int i = 0; i < columns.size(); i++) {
TableColumn column = colModel.getColumn(i);
column.setHeaderValue(getColumnName(column.getModelIndex()));
}
table.getTableHeader().repaint();
resort();
table.tableChanged(new TableModelEvent(TableModel.this));
table.repaint();
}
}
public void showSelectedCard(JTable table)
{
int row = table.getSelectedRow();
if (row != -1) {
CardPrinted cp = rowToCard(row).getKey();
cardDisplay.showCard(cp);
}
}
/**
* <p>addListeners.</p>
*
* @param table a {@link javax.swing.JTable} object.
*/
public void addListeners(final JTable table) {
//updates card detail, listens to any key strokes
table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent arg0) {
showSelectedCard(table);
}
});
table.addFocusListener(new FocusListener() {
@Override public void focusLost(FocusEvent e) {}
@Override public void focusGained(FocusEvent e) {
showSelectedCard(table);
}
});
table.getTableHeader().addMouseListener(new ColumnListener(table));
}//addCardListener()
public void resort() {
TableSorter sorter = new TableSorter(columns.get(sortColumn).fnSort, isSortAsc);
Collections.sort(data.getOrderedList(), sorter);
}
public void sort( int iCol, boolean isAsc )
{
sortColumn = iCol;
isSortAsc = isAsc;
resort();
}
}//CardTableModel

View File

@@ -0,0 +1,52 @@
package forge.gui.deckeditor;
import forge.card.CardPrinted;
import java.util.Comparator;
import java.util.Map.Entry;
import net.slightlymagic.braids.util.lambda.Lambda1;
/**
* <p>TableSorter class.</p>
*
* @author Forge
* @version $Id$
*/
@SuppressWarnings("unchecked") // Comparable needs <type>
public class TableSorter implements Comparator<Entry<CardPrinted, Integer>> {
private boolean ascending;
@SuppressWarnings("rawtypes")
private Lambda1<Comparable, Entry<CardPrinted, Integer>> field;
/**
* <p>Constructor for TableSorter.</p>
*
* @param in_all a {@link forge.CardList} object.
* @param in_column a int.
* @param in_ascending a boolean.
*/
@SuppressWarnings("rawtypes")
public TableSorter(Lambda1<Comparable, Entry<CardPrinted, Integer>> field, boolean in_ascending) {
this.field = field;
ascending = in_ascending;
}
@SuppressWarnings("rawtypes")
public static final TableSorter byNameThenSet = new TableSorter(
new Lambda1<Comparable, Entry<CardPrinted, Integer>>() {
@Override public Comparable apply(final Entry<CardPrinted, Integer> from) { return from.getKey(); }
}, true);
@SuppressWarnings("rawtypes")
@Override
public int compare(Entry<CardPrinted, Integer> arg0, Entry<CardPrinted, Integer> arg1) {
Comparable obj1 = field.apply(arg0);
Comparable obj2 = field.apply(arg1);
//System.out.println(String.format("%s vs %s _______ %s vs %s", arg0, arg1, obj1, obj2));
if (ascending) { return obj1.compareTo(obj2); }
else { return obj2.compareTo(obj1); }
}
}

View File

@@ -0,0 +1,2 @@
/** Forge Card Game */
package forge.gui.deckeditor;

View File

@@ -13,6 +13,7 @@ import arcane.ui.ScaledImagePanel.ScalingType;
import forge.Card;
import forge.CardContainer;
import forge.ImageCache;
import forge.card.CardPrinted;
import javax.swing.*;
import java.awt.*;
@@ -27,11 +28,12 @@ import java.awt.event.ComponentEvent;
* @author Clemens Koza
* @version V0.0 17.02.2010
*/
public class CardPicturePanel extends JPanel implements CardContainer {
public final class CardPicturePanel extends JPanel implements CardContainer {
/** Constant <code>serialVersionUID=-3160874016387273383L</code> */
private static final long serialVersionUID = -3160874016387273383L;
private Card card;
private CardPrinted cardPrinted;
// private JLabel label;
// private ImageIcon icon;
@@ -41,9 +43,9 @@ public class CardPicturePanel extends JPanel implements CardContainer {
/**
* <p>Constructor for CardPicturePanel.</p>
*
* @param card a {@link forge.Card} object.
* @param c a {@link forge.Card} object.
*/
public CardPicturePanel(Card card) {
public CardPicturePanel(final Card c) {
super(new BorderLayout());
// add(label = new JLabel(icon = new ImageIcon()));
add(panel = new ScaledImagePanel());
@@ -53,33 +55,48 @@ public class CardPicturePanel extends JPanel implements CardContainer {
addComponentListener(new ComponentAdapter() {
@Override
public void componentShown(ComponentEvent e) {
public void componentShown(final ComponentEvent e) {
update();
}
@Override
public void componentResized(ComponentEvent e) {
public void componentResized(final ComponentEvent e) {
update();
}
});
setCard(card);
setCard(c);
}
/**
* <p>update.</p>
*/
public void update() {
setCard(getCard());
public void update() { setCard(getCard()); }
public void setCard(final CardPrinted cp) {
card = null;
cardPrinted = cp;
if (!isShowing()) { return; }
setImage();
}
/** {@inheritDoc} */
public void setCard(Card card) {
this.card = card;
if (!isShowing()) return;
public void setCard(final Card c) {
card = c;
cardPrinted = null;
if (!isShowing()) { return; }
setImage();
}
private void setImage() {
Insets i = getInsets();
Image image = card == null ? null : ImageCache.getImage(card, getWidth() - i.left - i.right, getHeight()
- i.top - i.bottom);
Image image = null;
if (cardPrinted != null) {
image = ImageCache.getImage(cardPrinted, getWidth() - i.left - i.right, getHeight() - i.top - i.bottom); }
if (card != null && image == null) {
image = ImageCache.getImage(card, getWidth() - i.left - i.right, getHeight() - i.top - i.bottom); }
if (image != currentImange) {
currentImange = image;
@@ -103,6 +120,9 @@ public class CardPicturePanel extends JPanel implements CardContainer {
* @return a {@link forge.Card} object.
*/
public Card getCard() {
if ( card == null && cardPrinted != null ) {
card = cardPrinted.toForgeCard();
}
return card;
}
}

View File

@@ -78,12 +78,12 @@ public class FModel {
Constant.Runtime.UpldDrft[0] = preferences.uploadDraftAI;
Constant.Runtime.RndCFoil[0] = preferences.randCFoil;
final HttpUtil pinger = new HttpUtil();
/* final HttpUtil pinger = new HttpUtil();
if (pinger.getURL("http://cardforge.org/draftAI/ping.php").equals("pong")) {
Constant.Runtime.NetConn[0] = true;
} else {
} else {*/
Constant.Runtime.UpldDrft[0] = false;
}
// }
setBuildInfo(new BuildInfo());
}

View File

@@ -18,8 +18,6 @@ import java.util.*;
* @version $Id$
*/
public class QuestBattleManager {
/** Constant <code>aiDecks</code> */
private static transient Map<String, Deck> aiDecks = new HashMap<String, Deck>();
/** Constant <code>easyAIDecks</code> */
private static transient List<String> easyAIDecks;
/** Constant <code>mediumAIDecks</code> */
@@ -30,51 +28,10 @@ public class QuestBattleManager {
private static transient List<String> veryHardAIDecks;
static {
List<String> aiDeckNames = getAIDeckNames();
easyAIDecks = readFile(ForgeProps.getFile(NewConstants.QUEST.EASY), aiDeckNames);
mediumAIDecks = readFile(ForgeProps.getFile(NewConstants.QUEST.MEDIUM), aiDeckNames);
hardAIDecks = readFile(ForgeProps.getFile(NewConstants.QUEST.HARD), aiDeckNames);
veryHardAIDecks = readFile(ForgeProps.getFile(NewConstants.QUEST.VERYHARD), aiDeckNames);
}
/**
* <p>removeAIDeck.</p>
* Removes a deck object stored in the
*{@link forge.quest.gui.main.aiDecks} map.
*
* @param deckName a {@link java.lang.String} object.
*/
public static void removeAIDeck(String deckName) {
aiDecks.remove(deckName);
}
/**
* <p>addAIDeck.</p>
* Adds a deck object stored in the
*{@link forge.quest.gui.main.aiDecks} map.
*
* @param d a {@link forge.deck.Deck} object.
*/
public static void addAIDeck(Deck d) {
aiDecks.put(d.getName(), d);
}
/**
* <p>getAIDeckFromMap.</p>
* Returns a deck object stored in the
*{@link forge.quest.gui.main.aiDecks} map.
*
* @param deckName a {@link java.lang.String} object.
* @return a {@link forge.deck.Deck} object.
*/
public static Deck getAIDeckFromMap(String deckName) {
if (!aiDecks.containsKey(deckName)) {
ErrorViewer.showError(new Exception(),
"QuestData : getAIDeckFromMap(String deckName) error, deck name not found - %s", deckName);
}
return aiDecks.get(deckName);
easyAIDecks = readFile(ForgeProps.getFile(NewConstants.QUEST.EASY));
mediumAIDecks = readFile(ForgeProps.getFile(NewConstants.QUEST.MEDIUM));
hardAIDecks = readFile(ForgeProps.getFile(NewConstants.QUEST.HARD));
veryHardAIDecks = readFile(ForgeProps.getFile(NewConstants.QUEST.VERYHARD));
}
/**
@@ -88,19 +45,6 @@ public class QuestBattleManager {
return new ArrayList<String>(aiDecks.keySet());
}
/**
* <p>getDeckFromFile.</p>
* Returns a deck object built from a file name.
*
* @param deckName a {@link java.lang.String} object.
* @return a {@link forge.deck.Deck} object.
*/
public static Deck getAIDeckFromFile(String deckName) {
final File file = ForgeProps.getFile(NewConstants.QUEST.DECKS);
final DeckManager manager = new DeckManager(file);
return manager.getDeck(deckName);
}
/**
* <p>getOpponent.</p>
*
@@ -178,7 +122,7 @@ public class QuestBattleManager {
* @param aiDecks a {@link java.util.List} object.
* @return a {@link java.util.List} object.
*/
private static List<String> readFile(File file, List<String> aiDecks) {
private static List<String> readFile(File file) {
ArrayList<String> list = FileUtil.readFile(file);
//remove any blank lines
@@ -198,12 +142,6 @@ public class QuestBattleManager {
file);
}
for (String aList : list) {
if (!aiDecks.contains(aList)) {
aiDecks.add(aList);
}
}
return list;
}

View File

@@ -3,14 +3,22 @@ package forge.quest.data;
import forge.Card;
import forge.CardFilter;
import forge.Constant;
import forge.card.CardDb;
import forge.card.CardPrinted;
import forge.card.CardRarity;
import forge.card.CardRules;
import forge.properties.NewConstants;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.NoSuchElementException;
import org.apache.commons.lang3.StringUtils;
import net.slightlymagic.braids.util.generator.GeneratorFunctions;
import net.slightlymagic.maxmtg.Predicate;
import com.google.code.jyield.Generator;
@@ -61,47 +69,41 @@ public class QuestBoosterPack implements NewConstants {
*
* @return a {@link java.util.ArrayList} object.
*/
public ArrayList<String> getQuestStarterDeck(Generator<Card> allCards, int numCommon, int numUncommon, int numRare, boolean standardPool) {
ArrayList<String> names = new ArrayList<String>();
public List<CardPrinted> getQuestStarterDeck( final Predicate<CardPrinted> filter,
int numCommon, int numUncommon, int numRare ) {
ArrayList<CardPrinted> names = new ArrayList<CardPrinted>();
// Each color should have around the same amount of monocolored cards
// There should be 3 Colorless cards for every 4 cards in a single color
// There should be 1 Multicolor card for every 4 cards in a single color
ArrayList<String> started = new ArrayList<String>();
started.add("Multicolor");
List<Predicate<CardRules>> colorFilters = new ArrayList<Predicate<CardRules>>();
colorFilters.add(CardRules.Predicates.Presets.isMulticolor);
for (int i = 0; i < 4; i++) {
if (i != 2)
started.add(Constant.Color.Colorless);
if (i != 2) { colorFilters.add(CardRules.Predicates.Presets.isColorless); }
started.addAll(Arrays.asList(Constant.Color.onlyColors));
colorFilters.add(CardRules.Predicates.Presets.isWhite);
colorFilters.add(CardRules.Predicates.Presets.isRed);
colorFilters.add(CardRules.Predicates.Presets.isBlue);
colorFilters.add(CardRules.Predicates.Presets.isBlack);
colorFilters.add(CardRules.Predicates.Presets.isGreen);
}
if (standardPool) {
// filter Cards for cards appearing in Standard Sets
ArrayList<String> sets = new ArrayList<String>();
Iterable<CardPrinted> cardpool = CardDb.instance().getAllUniqueCards();
//TODO: It would be handy if the list of any sets can be chosen
// Can someone clarify that? I don't understand it. -Braids
sets.add("M12");
sets.add("NPH");
sets.add("MBS");
sets.add("SOM");
sets.add("M11");
sets.add("ROE");
sets.add("WWK");
sets.add("ZEN");
allCards = CardFilter.getSets(allCards, sets);
}
names.addAll(generateCards(allCards, numCommon, Constant.Rarity.Common, null, started));
names.addAll(generateCards(allCards, numUncommon, Constant.Rarity.Uncommon, null, started));
names.addAll(generateCards(allCards, numRare, Constant.Rarity.Rare, null, started));
names.addAll(generateDefinetlyColouredCards(cardpool,
Predicate.and(filter, CardPrinted.Predicates.Presets.isCommon), numCommon, colorFilters));
names.addAll(generateDefinetlyColouredCards(cardpool,
Predicate.and(filter, CardPrinted.Predicates.Presets.isUncommon), numUncommon, colorFilters));
names.addAll(generateDefinetlyColouredCards(cardpool,
Predicate.and(filter, CardPrinted.Predicates.Presets.isRareOrMythic), numRare, colorFilters));
return names;
}
/**
* Create the list of card names at random from the given pool.
*
@@ -112,92 +114,114 @@ public class QuestBoosterPack implements NewConstants {
* @param colorOrder we shuffle this as a side effect of calling this method
* @return a list of card names
*/
public ArrayList<String> generateCards(Generator<Card> allCards, int num, String rarity, String color, ArrayList<String> colorOrder)
public ArrayList<CardPrinted> generateDefinetlyColouredCards(
Iterable<CardPrinted> source,
Predicate<CardPrinted> filter,
int cntNeeded,
List<Predicate<CardRules>> allowedColors)
{
// If color is null, use colorOrder progression to grab cards
ArrayList<String> names = new ArrayList<String>();
ArrayList<CardPrinted> result = new ArrayList<CardPrinted>();
int size = colorOrder.size();
Collections.shuffle(colorOrder);
int size = allowedColors == null ? 0 : allowedColors.size();
Collections.shuffle(allowedColors);
allCards = CardFilter.getRarity(allCards, rarity);
int count = 0, i = 0;
int cntMade = 0, iAttempt = 0;
while (count < num) {
String name = null;
// This will prevent endless loop @ wh
int allowedMisses = (2 + size + 2) * cntNeeded; // lol, 2+2 is not magic constant!
if (color == null) {
final String color2 = colorOrder.get(i % size);
while (cntMade < cntNeeded && allowedMisses > 0) {
CardPrinted card = null;
if (size > 0) {
final Predicate<CardRules> color2 = allowedColors.get(iAttempt % size);
if (color2 != null) {
// Mantis Issue 77: avoid calling
// getCardName(Generator<Card>, String) with null as 2nd
// parameter.
name = getCardName(allCards, color2);
card = Predicate.and(filter, color2, CardPrinted.fnGetRules).random(source);
}
}
if (name == null) {
if (card == null) {
// We can't decide on a color, so just pick a card.
name = getCardName(allCards);
card = filter.random(source);
}
if (name != null && !names.contains(name)) {
names.add(name);
count++;
if (card != null && !result.contains(card)) {
result.add(card);
cntMade++;
}
i++;
else { allowedMisses--; }
iAttempt++;
}
return names;
return result;
}
/**
* Convenience for generateCards(cards, num, rarity, color, this.choices);
*
* @see #generateCards(Generator, int, String, String, ArrayList)
*/
public ArrayList<String> generateCards(Generator<Card> cards, int num, String rarity, String color) {
return generateCards(cards, num, rarity, color, choices);
public ArrayList<CardPrinted> generateDistinctCards(
final Iterable<CardPrinted> source,
final Predicate<CardPrinted> filter,
final int cntNeeded)
{
ArrayList<CardPrinted> result = new ArrayList<CardPrinted>();
int cntMade = 0, iAttempt = 0;
// This will prevent endless loop @ wh
int allowedMisses = (2 + 2) * cntNeeded; // lol, 2+2 is not magic constant!
while (cntMade < cntNeeded && allowedMisses > 0) {
CardPrinted card = filter.random(source);
if (card != null && !result.contains(card)) {
result.add(card);
cntMade++;
}
else { allowedMisses--; }
iAttempt++;
}
/**
* Retrieve a card name at random from the given pool of cards;
* the card must have a specific color.
*
* This forces one evaluation of the allCards Generator.
*
* @param allCards the card pool to use
* @param color a {@link java.lang.String} object.
* @return a random card name with the given color from allCards
*/
public String getCardName(Generator<Card> allCards, String color) {
return getCardName(CardFilter.getColor(allCards, color));
return result;
}
/**
* Fetch a random card name from the given pool.
*
* This forces one evaluation of the cards Generator.
*
* @param cards the card pool from which to select
* @return a card name from cards
*/
public String getCardName(Generator<Card> cards) {
Card selected = null;
try {
selected = GeneratorFunctions.selectRandom(cards);
}
catch (NoSuchElementException ignored) {
;
}
if (selected == null) {
// Previously, it was thought that this
// Only should happen if something is programmed wrong
// But empirical evidence contradicts this.
return null;
// Left if only for backwards compatibility
public ArrayList<CardPrinted> generateCards(int num, CardRarity rarity, String color) {
Predicate<CardPrinted> whatYouWant = getPredicateForConditions(rarity, color);
return generateDistinctCards(CardDb.instance().getAllUniqueCards(), whatYouWant, num);
}
return selected.getName();
public ArrayList<CardPrinted> generateCards(Predicate<CardPrinted> filter, int num, CardRarity rarity, String color) {
Predicate<CardPrinted> whatYouWant = Predicate.and(filter, getPredicateForConditions(rarity, color));
return generateDistinctCards(CardDb.instance().getAllUniqueCards(), whatYouWant, num);
}
protected Predicate<CardPrinted> getPredicateForConditions(CardRarity rarity, String color)
{
Predicate<CardPrinted> rFilter;
switch (rarity) {
case Rare: rFilter = CardPrinted.Predicates.Presets.isRareOrMythic; break;
case Common: rFilter = CardPrinted.Predicates.Presets.isCommon; break;
case Uncommon: rFilter = CardPrinted.Predicates.Presets.isUncommon; break;
default: rFilter = Predicate.getTrue(CardPrinted.class);
}
Predicate<CardRules> colorFilter;
if (StringUtils.isBlank(color)) {
colorFilter = Predicate.getTrue(CardRules.class);
} else {
String col = color.toLowerCase();
if (col.startsWith("wh")) colorFilter = CardRules.Predicates.Presets.isWhite;
else if (col.startsWith("bla")) colorFilter = CardRules.Predicates.Presets.isBlack;
else if (col.startsWith("blu")) colorFilter = CardRules.Predicates.Presets.isBlue;
else if (col.startsWith("re")) colorFilter = CardRules.Predicates.Presets.isRed;
else if (col.startsWith("col")) colorFilter = CardRules.Predicates.Presets.isColorless;
else if (col.startsWith("gre")) colorFilter = CardRules.Predicates.Presets.isGreen;
else if (col.startsWith("mul")) colorFilter = CardRules.Predicates.Presets.isMulticolor;
else colorFilter = Predicate.getTrue(CardRules.class);
}
return Predicate.and(rFilter, colorFilter, CardPrinted.fnGetRules);
}
}

View File

@@ -1,6 +1,11 @@
package forge.quest.data;
import forge.*;
import forge.card.CardDb;
import forge.card.CardPool;
import forge.card.CardPoolView;
import forge.card.CardPrinted;
import forge.card.CardRarity;
import forge.deck.Deck;
import forge.error.ErrorViewer;
import forge.game.GameLossReason;
@@ -17,6 +22,10 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.ArrayUtils;
import net.slightlymagic.maxmtg.Predicate;
import com.google.code.jyield.Generator;
import com.google.code.jyield.YieldUtils;
@@ -36,14 +45,13 @@ import com.google.code.jyield.YieldUtils;
* @author Forge
* @version $Id$
*/
public class QuestData {
public final class QuestData {
int rankIndex;
int win;
int lost;
int life;
//private int maxLife;
int questsPlayed;
@@ -55,11 +63,8 @@ public class QuestData {
Map<String, Deck> myDecks = new HashMap<String, Deck>();
//holds String card names
List<String> cardPool = new ArrayList<String>();
List<String> newCardList = new ArrayList<String>();
List<String> shopList = new ArrayList<String>();
CardPool cardPool = new CardPool();
CardPool shopList = new CardPool();
List<Integer> availableQuests = new ArrayList<Integer>();
List<Integer> completedQuests = new ArrayList<Integer>();
@@ -79,8 +84,8 @@ public class QuestData {
QuestInventory inventory = new QuestInventory();
//This field holds the version of the Quest Data
/** Constant <code>CURRENT_VERSION_NUMBER=1</code> */
public static final int CURRENT_VERSION_NUMBER = 1;
/** Constant <code>CURRENT_VERSION_NUMBER=2</code> */
public static final int CURRENT_VERSION_NUMBER = 2;
//This field places the version number into QD instance,
//but only when the object is created through the constructor
@@ -94,21 +99,17 @@ public class QuestData {
*/
public QuestData() {
for (int i = 0; i < QuestPreferences.getStartingBasic(); i++) {
cardPool.add("Forest");
cardPool.add("Mountain");
cardPool.add("Swamp");
cardPool.add("Island");
cardPool.add("Plains");
}
cardPool.add(CardDb.instance().getCard("Forest", "M10"), QuestPreferences.getStartingBasic());
cardPool.add(CardDb.instance().getCard("Mountain", "M10"), QuestPreferences.getStartingBasic());
cardPool.add(CardDb.instance().getCard("Swamp", "M10"), QuestPreferences.getStartingBasic());
cardPool.add(CardDb.instance().getCard("Island", "M10"), QuestPreferences.getStartingBasic());
cardPool.add(CardDb.instance().getCard("Plains", "M10"), QuestPreferences.getStartingBasic());
for (int i = 0; i < QuestPreferences.getStartingSnowBasic(); i++) {
cardPool.add("Snow-Covered Forest");
cardPool.add("Snow-Covered Mountain");
cardPool.add("Snow-Covered Swamp");
cardPool.add("Snow-Covered Island");
cardPool.add("Snow-Covered Plains");
}
cardPool.add(CardDb.instance().getCard("Snow-Covered Forest", "ICE"), QuestPreferences.getStartingSnowBasic());
cardPool.add(CardDb.instance().getCard("Snow-Covered Mountain", "ICE"), QuestPreferences.getStartingSnowBasic());
cardPool.add(CardDb.instance().getCard("Snow-Covered Swamp", "ICE"), QuestPreferences.getStartingSnowBasic());
cardPool.add(CardDb.instance().getCard("Snow-Covered Island", "ICE"), QuestPreferences.getStartingSnowBasic());
cardPool.add(CardDb.instance().getCard("Snow-Covered Plains", "ICE"), QuestPreferences.getStartingSnowBasic());
initTransients();
randomizeOpponents();
@@ -148,15 +149,18 @@ public class QuestData {
public void newGame(int difficulty, String m, boolean standardStart) {
setDifficulty(difficulty);
Generator<Card> allCards = YieldUtils.toGenerator(AllZone.getCardFactory());
Predicate<CardPrinted> filter = standardStart
? CardPrinted.Predicates.Presets.isStandard
: Predicate.getTrue(CardPrinted.class);
ArrayList<String> list = new ArrayList<String>();
list.addAll(boosterPack.getQuestStarterDeck(allCards, QuestPreferences.getStartingCommons(difficulty),
QuestPreferences.getStartingUncommons(difficulty), QuestPreferences.getStartingRares(difficulty), standardStart));
List<CardPrinted> list = boosterPack.getQuestStarterDeck(
filter,
QuestPreferences.getStartingCommons(difficulty),
QuestPreferences.getStartingUncommons(difficulty),
QuestPreferences.getStartingRares(difficulty));
//because cardPool already has basic land added to it
cardPool.addAll(list);
addAllCards(list);
credits = QuestPreferences.getStartingCredits();
mode = m;
@@ -183,26 +187,8 @@ public class QuestData {
}
//returns Strings of the card names
/**
* <p>getCardpool.</p>
*
* @return a {@link java.util.List} object.
*/
public List<String> getCardpool() {
//make a copy so the internal ArrrayList cannot be changed externally
return new ArrayList<String>(cardPool);
}
/**
* <p>setCardpool.</p>
*
* @param pool a {@link java.util.ArrayList} object.
* @since 1.0.15
*/
public void setCardpool(ArrayList<String> pool) {
cardPool = pool;
public CardPool getCardpool() {
return cardPool;
}
/**
@@ -210,12 +196,11 @@ public class QuestData {
*
* @return a {@link java.util.List} object.
*/
public List<String> getShopList() {
if (shopList != null) {
return new ArrayList<String>(shopList);
} else {
return null;
public CardPoolView getShopList() {
if (shopList.isEmpty()) {
generateCardsInShop();
}
return shopList;
}
/**
@@ -223,8 +208,11 @@ public class QuestData {
*
* @param list a {@link java.util.List} object.
*/
public void setShopList(List<String> list) {
shopList = list;
public void generateCardsInShop() {
ReadBoosterPack pack = new ReadBoosterPack();
CardPoolView fromBoosters = pack.getShopCards(getWin(), getLevel());
shopList.clear();
shopList.addAll(fromBoosters);
}
@@ -284,7 +272,7 @@ public class QuestData {
* <p>clearShopList.</p>
*/
public void clearShopList() {
shopList.clear();
if (null != shopList) { shopList.clear(); }
}
@@ -328,17 +316,7 @@ public class QuestData {
Deck d = myDecks.get(deckName);
//below is probably not needed
//remove old cards from card pool
for (int i = 0; i < d.countSideboard(); i++) {
d.removeSideboard(i);
}
//add all cards to card pool
for (int i = 0; i < cardPool.size(); i++) {
d.addSideboard(cardPool.get(i));
}
d.clearSideboard();
return d;
}
@@ -357,41 +335,24 @@ public class QuestData {
}
//get new cards that were added to your card pool by addCards()
/**
* <p>getAddedCards.</p>
*
* @return a {@link java.util.List} object.
*/
public List<String> getAddedCards() {
return new ArrayList<String>(newCardList);
}
//adds 11 cards, to the current card pool
//(I chose 11 cards instead of 15 in order to make things more challenging)
/**
* <p>addCards.</p>
*/
public ArrayList<String> addCards( List<String> setsFilter ) {
Generator<Card> cards = YieldUtils.toGenerator(AllZone.getCardFactory());
if ( setsFilter != null )
cards = CardFilter.getSets(cards, setsFilter);
public ArrayList<CardPrinted> addCards( List<String> setsFilter ) {
int nCommon = QuestPreferences.getNumCommon();
int nUncommon = QuestPreferences.getNumUncommon();
int nRare = QuestPreferences.getNumRare();
Predicate<CardPrinted> fSets = CardPrinted.Predicates.printedInSets(setsFilter, true);
ArrayList<String> newCards = new ArrayList<String>();
newCards.addAll(boosterPack.generateCards(cards, nCommon, Constant.Rarity.Common, null));
newCards.addAll(boosterPack.generateCards(cards, nUncommon, Constant.Rarity.Uncommon, null));
newCards.addAll(boosterPack.generateCards(cards, nRare, Constant.Rarity.Rare, null));
ArrayList<CardPrinted> newCards = new ArrayList<CardPrinted>();
newCards.addAll(boosterPack.generateCards(fSets, nCommon, CardRarity.Common, null));
newCards.addAll(boosterPack.generateCards(fSets, nUncommon, CardRarity.Uncommon, null));
newCards.addAll(boosterPack.generateCards(fSets, nRare, CardRarity.Rare, null));
cardPool.addAll(newCards);
//getAddedCards() uses newCardList
newCardList = newCards;
addAllCards(newCards);
return newCards;
}
@@ -401,95 +362,40 @@ public class QuestData {
* @param n a int.
* @return a {@link java.util.ArrayList} object.
*/
public ArrayList<String> addRandomRare(int n) {
Generator<Card> allCards = YieldUtils.toGenerator(AllZone.getCardFactory());
ArrayList<String> newCards = new ArrayList<String>();
newCards.addAll(boosterPack.generateCards(allCards, n, Constant.Rarity.Rare, null));
public ArrayList<CardPrinted> addRandomRare(int n) {
ArrayList<CardPrinted> newCards = new ArrayList<CardPrinted>();
newCards.addAll(boosterPack.generateCards(n, CardRarity.Rare, null));
cardPool.addAll(newCards);
newCardList.addAll(newCards);
addAllCards(newCards);
return newCards;
}
public void addAllCards(Iterable<CardPrinted> newCards) {
for (CardPrinted card : newCards) {
cardPool.add( card );
}
}
/**
* <p>addRandomRare.</p>
*
* @return a {@link java.lang.String} object.
*/
public String addRandomRare() {
public CardPrinted addRandomRare() {
return addRandomRare(1).get(0);
}
/**
* <p>addCard.</p>
*
* @param c a {@link forge.Card} object.
*/
public void addCard(Card c) {
cardPool.add(c.getName());
}
/**
* <p>addCard.</p>
*
* @param s a {@link java.lang.String} object.
*/
public void addCard(String s) {
cardPool.add(s);
}
/**
* <p>removeCard.</p>
*
* @param c a {@link forge.Card} object.
*/
public void removeCard(Card c) {
String s = c.getName();
if (!cardPool.contains(s)) {
return;
}
for (int i = 0; i < cardPool.size(); i++) {
String str = cardPool.get(i);
if (str.equals(s)) {
cardPool.remove(i);
break;
}
}
}
/**
* <p>addCardToShopList.</p>
*
* @param c a {@link forge.Card} object.
*/
public void addCardToShopList(Card c) {
shopList.add(c.getName());
public void addCardToShopList(CardPrinted c) {
shopList.add(c);
}
/**
* <p>removeCardFromShopList.</p>
*
* @param c a {@link forge.Card} object.
*/
public void removeCardFromShopList(Card c) {
String s = c.getName();
if (!shopList.contains(s)) {
return;
}
for (int i = 0; i < shopList.size(); i++) {
String str = shopList.get(i);
if (str.equals(s)) {
shopList.remove(i);
break;
}
}
}
public final int getCreditsRewardForAltWin(final GameLossReason whyAiLost) {
int rewardAltWinCondition = 0;
switch (whyAiLost) {
@@ -504,6 +410,9 @@ public class QuestData {
case DidNotLoseYet: // must be player's alternate win condition: felidar, helix pinnacle and like this
rewardAltWinCondition = QuestPreferences.getMatchRewardAltWinBonus();
break;
case SpellEffect: // Door to Nothingness or something like this
rewardAltWinCondition = QuestPreferences.getMatchRewardAltWinBonus();
break;
default: // this .checkstyle forces us to write some idiotic code
rewardAltWinCondition = 0;
}
@@ -569,18 +478,6 @@ public class QuestData {
//gets all of the cards that are in the cardpool
/**
* <p>getCards.</p>
*
* @return a {@link java.util.List} object.
*/
public List<String> getCards() {
//copy CardList in order to keep private variables private
//if we just return cardPool, it could be changed externally
return new ArrayList<String>(cardPool);
}
/**
* <p>getTotalNumberOfGames.</p>
*
@@ -723,6 +620,27 @@ public class QuestData {
return mode;
}
public double getSellMutliplier() {
double multi = 0.20 + (0.001 * getWin());
if (multi > 0.6)
multi = 0.6;
if (getMode().equals(forge.quest.data.QuestData.FANTASY)) {
if (getInventory().getItemLevel("Estates") == 1)
multi += 0.01;
else if (getInventory().getItemLevel("Estates") == 2)
multi += 0.0175;
else if (getInventory().getItemLevel("Estates") >= 3)
multi += 0.025;
}
return multi;
}
public int getSellPriceLimit() {
return getWin() <= 50 ? 1000 : Integer.MAX_VALUE;
}
//should be called first, because the difficultly won't change
/**
@@ -847,25 +765,6 @@ public class QuestData {
ForgeProps.getFile(NewConstants.QUEST.XMLDATA).exists();
}
/**
* <p>main.</p>
*
* @param args an array of {@link java.lang.String} objects.
*/
public static void main(String[] args) {
QuestData q = new QuestData();
for (int i = 0; i < 20; i++) {
q.addCards( null );
}
for (int i = 0; i < 10; i++) {
q.saveData();
q = QuestDataIO.loadData();
}
System.exit(1);
}
/**
* <p>Getter for the field <code>petManager</code>.</p>
*
@@ -877,14 +776,6 @@ public class QuestData {
//get new cards that were added to your card pool by addCards()
/**
* <p>addToNewList.</p>
*
* @param added a {@link java.util.ArrayList} object.
*/
public void addToNewList(ArrayList<String> added) {
newCardList.addAll(added);
}
/**
* <p>readResolve.</p>
@@ -913,4 +804,18 @@ public class QuestData {
public long getRandomSeed() {
return randomSeed;
}
public void buyCard(final CardPrinted card, final int value) {
if (credits >= value) {
credits -= value;
getCardpool().add(card);
shopList.remove(card);
}
}
public void sellCard(final CardPrinted card, final int price) {
if (price > 0) { credits += price; }
getCardpool().remove(card);
// remove from decks right here
}
}

View File

@@ -1,7 +1,15 @@
package forge.quest.data;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.mapper.MapperWrapper;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import forge.card.CardDb;
import forge.card.CardPrinted;
import forge.error.ErrorViewer;
import forge.properties.ForgeProps;
import forge.properties.NewConstants;
@@ -55,6 +63,8 @@ public class QuestDataIO {
}
IgnoringXStream xStream = new IgnoringXStream();
xStream.registerConverter(new CardReferenceToXml());
xStream.alias("cref", CardPrinted.class);
data = (QuestData) xStream.fromXML(xml.toString());
if (data.versionNumber != QuestData.CURRENT_VERSION_NUMBER) {
@@ -109,6 +119,12 @@ public class QuestDataIO {
newData.inventory.setItemLevel("Zeppelin", 1);
}
break;
case 1:
// card names are stored as plain text - need to read them from there
break;
}
//mark the QD as the latest version
@@ -130,11 +146,19 @@ public class QuestDataIO {
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(f));
GZIPOutputStream zout = new GZIPOutputStream(bout);
BufferedOutputStream bout_unp = new BufferedOutputStream(new FileOutputStream(f+".xml"));
XStream xStream = new XStream();
xStream.registerConverter(new CardReferenceToXml());
xStream.alias("cref", CardPrinted.class);
xStream.toXML(qd, zout);
xStream.toXML(qd, bout_unp);
zout.flush();
zout.close();
bout_unp.flush();
bout_unp.close();
} catch (Exception ex) {
ErrorViewer.showError(ex, "Error saving Quest Data.");
throw new RuntimeException(ex);
@@ -163,4 +187,31 @@ public class QuestDataIO {
};
}
}
private static class CardReferenceToXml implements Converter {
@SuppressWarnings("rawtypes")
@Override
public boolean canConvert(Class clasz) {
return clasz.equals(CardPrinted.class);
}
@Override
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
CardPrinted cref = (CardPrinted) source;
writer.addAttribute("s", cref.getSet());
writer.addAttribute("i", Integer.toString(cref.getArtIndex()));
if (cref.isFoil()) { writer.addAttribute("foil", "1"); }
writer.addAttribute("n", cref.getName());
}
@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
String name = reader.getAttribute("n");
String set = reader.getAttribute("s");
short index = Short.parseShort(reader.getAttribute("i"));
boolean foil = "1".equals(reader.getAttribute("foil"));
CardPrinted card = CardDb.instance().getCard(name, set, index);
return foil ? CardPrinted.makeFoiled(card) : card;
}
}
}

View File

@@ -1,6 +1,7 @@
package forge.quest.data;
import forge.*;
import forge.card.CardRarity;
import java.util.ArrayList;
@@ -97,13 +98,11 @@ public class QuestUtil {
int id = qa.getId();
Generator<Card> cards = YieldUtils.toGenerator(AllZone.getCardFactory());
if (id == 1) //White Dungeon
{
qa.addCompy("Divine Presence");
qa.setCardRewardList(pack.generateCards(cards, 3, Constant.Rarity.Rare, Constant.Color.White));
qa.setCardRewardList(pack.generateCards(3, CardRarity.Rare, Constant.Color.White));
} else if (id == 2) //Blue Dungeon
{
CardList humanList = new CardList();
@@ -118,17 +117,17 @@ public class QuestUtil {
qa.addCompy("Forced Fruition");
qa.setCardRewardList(pack.generateCards(cards, 3, Constant.Rarity.Rare, Constant.Color.Blue));
qa.setCardRewardList(pack.generateCards(3, CardRarity.Rare, Constant.Color.Blue));
} else if (id == 3) //Black Dungeon
{
qa.addCompy("Infernal Genesis");
qa.setCardRewardList(pack.generateCards(cards, 3, Constant.Rarity.Rare, Constant.Color.Black));
qa.setCardRewardList(pack.generateCards(3, CardRarity.Rare, Constant.Color.Black));
} else if (id == 4) //Red Dungeon
{
qa.addCompy("Furnace of Rath");
qa.setCardRewardList(pack.generateCards(cards, 3, Constant.Rarity.Rare, Constant.Color.Red));
qa.setCardRewardList(pack.generateCards(3, CardRarity.Rare, Constant.Color.Red));
} else if (id == 5) //Green Dungeon
{
CardList humanList = new CardList();
@@ -144,17 +143,17 @@ public class QuestUtil {
qa.addCompy("Eladamri's Vineyard");
qa.addCompy("Upwelling");
qa.setCardRewardList(pack.generateCards(cards, 3, Constant.Rarity.Rare, Constant.Color.Green));
qa.setCardRewardList(pack.generateCards(3, CardRarity.Rare, Constant.Color.Green));
} else if (id == 6) //Colorless Dungeon
{
for (int i = 0; i < 3; i++)
qa.addCompy("Eon Hub");
qa.setCardRewardList(pack.generateCards(cards, 3, Constant.Rarity.Rare, Constant.Color.Colorless));
qa.setCardRewardList(pack.generateCards(3, CardRarity.Rare, Constant.Color.Colorless));
} else if (id == 7) //Gold Dungeon
{
qa.addCompy("Darksteel Ingot");
qa.setCardRewardList(pack.generateCards(cards, 3, Constant.Rarity.Rare, "Multicolor"));
qa.setCardRewardList(pack.generateCards(3, CardRarity.Rare, "Multicolor"));
} else if (id == 8) {
CardList humanList = new CardList();
for (int i = 0; i < 3; i++) {
@@ -179,7 +178,7 @@ public class QuestUtil {
humanList.add(c);
}
qa.setHuman(humanList);
qa.setCardRewardList(pack.generateCards(cards, 3, Constant.Rarity.Rare, null));
qa.setCardRewardList(pack.generateCards(3, CardRarity.Rare, null));
} else if (id == 9) {
CardList humanList = new CardList();
Card c = AllZone.getCardFactory().getCard("Trusty Machete", AllZone.getHumanPlayer());
@@ -194,7 +193,7 @@ public class QuestUtil {
for (int i = 0; i < 3; i++)
qa.addCompy("Wall of Wood");
qa.setCardRewardList(pack.generateCards(cards, 4, Constant.Rarity.Rare, Constant.Color.Green));
qa.setCardRewardList(pack.generateCards(4, CardRarity.Rare, Constant.Color.Green));
} else if (id == 10) {
CardList humanList = new CardList();
@@ -232,7 +231,7 @@ public class QuestUtil {
qa.addCompy("Scathe Zombies");
qa.addCompy("Mass of Ghouls");
qa.setCardRewardList(pack.generateCards(cards, 4, Constant.Rarity.Rare, Constant.Color.Black));
qa.setCardRewardList(pack.generateCards(4, CardRarity.Rare, Constant.Color.Black));
} else if (id == 11) // The King's Contest
{
CardList humanList = new CardList();
@@ -247,7 +246,7 @@ public class QuestUtil {
qa.addCompy("Loyal Retainers");
qa.setCardRewardList(pack.generateCards(cards, 3, Constant.Rarity.Rare, null));
qa.setCardRewardList(pack.generateCards(3, CardRarity.Rare, null));
} else if (id == 12) // Barroom Brawl
{
CardList humanList = new CardList();
@@ -278,7 +277,7 @@ public class QuestUtil {
qa.addCompy("Lowland Giant");
qa.setCardRewardList(pack.generateCards(cards, 4, Constant.Rarity.Rare, null));
qa.setCardRewardList(pack.generateCards(4, CardRarity.Rare, null));
} else if (id == 13) // The Court Jester
{
CardList humanList = new CardList();
@@ -293,7 +292,7 @@ public class QuestUtil {
qa.addCompy("Teferi's Puzzle Box");
qa.setCardRewardList(pack.generateCards(cards, 4, Constant.Rarity.Rare, "Multicolor"));
qa.setCardRewardList(pack.generateCards(4, CardRarity.Rare, "Multicolor"));
} else if (id == 14) // Ancient Battlefield
{
CardList humanList = new CardList();
@@ -315,7 +314,7 @@ public class QuestUtil {
qa.addCompy(compySetupCards[i]);
}
qa.setCardRewardList(pack.generateCards(cards, 4, Constant.Rarity.Rare, null));
qa.setCardRewardList(pack.generateCards(4, CardRarity.Rare, null));
} else if (id == 15) // Don't Play With Matches
{
CardList humanList = new CardList();
@@ -337,7 +336,7 @@ public class QuestUtil {
qa.addCompy(compySetupCards[i]);
}
qa.setCardRewardList(pack.generateCards(cards, 4, Constant.Rarity.Rare, Constant.Color.Red));
qa.setCardRewardList(pack.generateCards(4, CardRarity.Rare, Constant.Color.Red));
} else if (id == 16) // Mines of Kazum Durl
{
CardList humanList = new CardList();
@@ -360,7 +359,7 @@ public class QuestUtil {
qa.addCompy(compySetupCards[i]);
}
qa.setCardRewardList(pack.generateCards(cards, 4, Constant.Rarity.Rare, Constant.Color.Green));
qa.setCardRewardList(pack.generateCards(4, CardRarity.Rare, Constant.Color.Green));
} else if (id == 17) // House Party
{
CardList humanList = new CardList();
@@ -382,7 +381,7 @@ public class QuestUtil {
qa.addCompy(compySetupCards[i]);
}
qa.setCardRewardList(pack.generateCards(cards, 4, Constant.Rarity.Rare, Constant.Color.Colorless));
qa.setCardRewardList(pack.generateCards(4, CardRarity.Rare, Constant.Color.Colorless));
} else if (id == 18) // Crows in the Field
{
CardList humanList = new CardList();
@@ -404,7 +403,7 @@ public class QuestUtil {
qa.addCompy(compySetupCards[i]);
}
qa.setCardRewardList(pack.generateCards(cards, 5, Constant.Rarity.Rare, null));
qa.setCardRewardList(pack.generateCards(5, CardRarity.Rare, null));
} else if (id == 19) // The Desert Caravan
{
CardList humanList = new CardList();
@@ -426,7 +425,7 @@ public class QuestUtil {
qa.addCompy(compySetupCards[i]);
}
qa.setCardRewardList(pack.generateCards(cards, 5, Constant.Rarity.Rare, null));
qa.setCardRewardList(pack.generateCards(5, CardRarity.Rare, null));
} else if (id == 20) // Blood Oath
{
CardList humanList = new CardList();
@@ -448,7 +447,7 @@ public class QuestUtil {
qa.addCompy(compySetupCards[i]);
}
qa.setCardRewardList(pack.generateCards(cards, 5, Constant.Rarity.Rare, Constant.Color.Colorless));
qa.setCardRewardList(pack.generateCards(5, CardRarity.Rare, Constant.Color.Colorless));
} else if (id == 21) // Private Domain
{
CardList humanList = new CardList();
@@ -467,7 +466,7 @@ public class QuestUtil {
for (int i = 0; i < 5; i++)
qa.addCompy(compySetupCards[i]);
qa.setCardRewardList(pack.generateCards(cards, 6, Constant.Rarity.Rare, null));
qa.setCardRewardList(pack.generateCards(6, CardRarity.Rare, null));
} else if (id == 22) // Pied Piper
{
CardList humanList = new CardList();
@@ -488,7 +487,7 @@ public class QuestUtil {
for (int i = 0; i < 2; i++)
qa.addCompy(compySetupCards[i]);
qa.setCardRewardList(pack.generateCards(cards, 3, Constant.Rarity.Rare, null));
qa.setCardRewardList(pack.generateCards(3, CardRarity.Rare, null));
}
}

View File

@@ -4,6 +4,8 @@ package forge.quest.gui.main;
import forge.*;
import forge.deck.Deck;
import forge.gui.GuiUtils;
import forge.gui.deckeditor.CardShop;
import forge.gui.deckeditor.DeckEditorQuest;
import forge.quest.data.QuestBattleManager;
import forge.quest.data.QuestData;
import forge.quest.data.item.QuestItemZeppelin;
@@ -588,7 +590,7 @@ public class QuestMainPanel extends QuestAbstractPanel {
}
};
Gui_Quest_DeckEditor g = new Gui_Quest_DeckEditor();
DeckEditorQuest g = new DeckEditorQuest();
g.show(exit);
g.setVisible(true);
@@ -617,7 +619,7 @@ public class QuestMainPanel extends QuestAbstractPanel {
}
};
Gui_CardShop g = new Gui_CardShop(questData);
CardShop g = new CardShop(questData);
g.show(exit);
g.setVisible(true);

View File

@@ -99,8 +99,6 @@ public class ApplicationView implements FView {
Log.error("Error loading preferences: " + exn);
}
OldGuiNewGame.loadDynamicGamedata();
SwingUtilities.invokeLater(new Runnable() { // NOPMD by Braids on 8/7/11 1:07 PM: this isn't a web app
public void run() {
final ForgePreferences finalPreferences = model.getPreferences();

View File

@@ -32,8 +32,12 @@ public final class Main {
final FModel model = new FModel(null);
Singletons.setModel(model);
// Need this soon after card factory is loaded
OldGuiNewGame.loadDynamicGamedata();
// TODO: this code should go elsewhere, like wherever we start a new game.
// It is only here to maintain semantic equality with the current code base.
model.resetGameState();
view.setModel(model);

View File

@@ -3,6 +3,7 @@ package forge.view.swing;
import arcane.ui.util.ManaSymbols;
import com.esotericsoftware.minlog.Log;
import forge.*;
import forge.card.CardPool;
import forge.deck.Deck;
import forge.deck.DeckManager;
import forge.deck.generate.*;
@@ -10,6 +11,8 @@ import forge.error.BugzReporter;
import forge.error.ErrorViewer;
import forge.gui.GuiUtils;
import forge.gui.ListChooser;
import forge.gui.deckeditor.Gui_BoosterDraft;
import forge.gui.deckeditor.DeckEditor;
import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.CardSizeType;
import forge.properties.ForgePreferences.StackOffsetType;
@@ -53,7 +56,7 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants.
// with the new IO, there's no reason to use different instances
private List<Deck> allDecks;
/** Constant <code>editor</code>. */
private static Gui_DeckEditor editor;
private static DeckEditor editor;
private JLabel titleLabel = new JLabel();
private JLabel jLabel2 = new JLabel();
@@ -317,13 +320,11 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants.
"choice <<" + safeToString(o) + ">> does not equal any of the sealedTypes.");
}
CardList sDeck = sd.getCardpool();
CardPool sDeck = sd.getCardpool();
if (sDeck.size() > 1) {
if (sDeck.countAll() > 1) {
for (int i = 0; i < sDeck.size(); i++) {
deck.addSideboard(sDeck.get(i).getName() + "|" + sDeck.get(i).getCurSetCode());
}
deck.addSideboard(sDeck);
for (int i = 0; i < Constant.Color.BasicLands.length; i++) {
for (int j = 0; j < 18; j++) {
@@ -340,7 +341,7 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants.
Constant.Runtime.HumanDeck[0] = deck;
Constant.Runtime.GameType[0] = Constant.GameType.Sealed;
Deck aiDeck = sd.buildAIDeck(sd.getCardpool());
Deck aiDeck = sd.buildAIDeck(sDeck.toForgeCardList());
aiDeck.setName("AI_" + sDeckName);
aiDeck.addMetaData("PlayerType", "AI");
deckManager.addDeck(aiDeck);
@@ -625,7 +626,7 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants.
final void deckEditorButtonActionPerformed(final ActionEvent e) {
if (editor == null) {
editor = new Gui_DeckEditor();
editor = new DeckEditor();
Command exit = new Command() {
private static final long serialVersionUID = -9133358399503226853L;
@@ -645,8 +646,8 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants.
// this for real, feel free.
// This make it so the second time you open the Deck Editor, typing a
// card name and pressing enter will filter
javax.swing.JRootPane rootPane = editor.getRootPane();
rootPane.setDefaultButton(editor.filterButton);
//javax.swing.JRootPane rootPane = editor.getRootPane();
//rootPane.setDefaultButton(editor.filterButton);
editor.setVisible(true);

View File

@@ -1,5 +1,9 @@
package forge;
import java.util.List;
import forge.card.CardPool;
import forge.card.CardPrinted;
import forge.deck.Deck;
import org.testng.annotations.Test;
@@ -17,15 +21,17 @@ public class BoosterDraftAITest {
Deck[] deck = ai.getDecks();
for (int outer = 0; outer < 7; outer++) {
System.out.print(deck[outer].countMain() + " - ");
Deck thisDeck = deck[outer];
System.out.print(thisDeck.countMain() + " - ");
List<CardPrinted> cards = thisDeck.getMain().toFlatList();
for (int i = 0; i < 16; i++)
System.out.print(deck[outer].getMain(i) + ", ");
System.out.print(cards.get(i) + ", ");
System.out.println("");
for (int i = 16; i < 22; i++)
System.out.print(deck[outer].getMain(i) + ", ");
System.out.print(cards.get(i) + ", ");
System.out.println("\n");
}//for outer
@@ -35,13 +41,14 @@ public class BoosterDraftAITest {
public void runTest(BoosterDraftAI ai) {
ReadDraftBoosterPack booster = new ReadDraftBoosterPack();
for (int outer = 0; outer < 1; outer++) {
CardList allBooster = new CardList();
CardPool allBooster = new CardPool();
for (int i = 0; i < 21; i++)
allBooster.addAll(booster.getBoosterPack());
int stop = allBooster.size();
CardList forgeCardlist = allBooster.toForgeCardList();
int stop = forgeCardlist.size();
for (int i = 0; i < stop; i++) {
ai.choose(allBooster, i);
forgeCardlist.remove(ai.choose(forgeCardlist, i));
}
//ai.checkDeckList(ai.deck);
}

View File

@@ -1,5 +1,7 @@
package forge;
import forge.card.CardPoolView;
import forge.card.CardPrinted;
import forge.deck.Deck;
import org.testng.annotations.Test;
@@ -28,14 +30,14 @@ public class BoosterDraftTest implements BoosterDraft {
*
* @return a {@link forge.CardList} object.
*/
public CardList nextChoice() {
public CardPoolView nextChoice() {
n--;
ReadDraftBoosterPack pack = new ReadDraftBoosterPack();
return pack.getBoosterPack();
}
/** {@inheritDoc} */
public void setChoice(Card c) {
public void setChoice(CardPrinted c) {
System.out.println(c.getName());
}

View File

@@ -1,7 +1,12 @@
package forge;
import net.slightlymagic.maxmtg.Predicate;
import org.testng.annotations.Test;
import forge.card.CardRules;
import forge.card.CardPoolView;
/**
* Unit test for simple App.
@@ -16,9 +21,9 @@ public class BoosterDraft_1Test {
public void BoosterDraft_1Test1() throws Exception {
BoosterDraft_1 draft = new BoosterDraft_1();
while (draft.hasNextChoice()) {
CardList list = draft.nextChoice();
System.out.println(list.size());
draft.setChoice(list.get(0));
CardPoolView list = draft.nextChoice();
System.out.println(list.countAll());
draft.setChoice(Predicate.getTrue(CardRules.class).first(list, CardPoolView.fnToCard, CardPoolView.fnToReference));
}
}
}

View File

@@ -1,6 +1,7 @@
package forge;
import forge.deck.Deck;
import forge.gui.deckeditor.Gui_BoosterDraft;
import org.testng.Assert;
import org.testng.annotations.Test;

View File

@@ -1,27 +0,0 @@
package forge;
import org.testng.Assert;
import org.testng.annotations.Test;
/**
* Created by IntelliJ IDEA.
* User: dhudson
*/
@Test(groups = {"UnitTest"})
public class GuiFilterTest {
/**
*
*
*/
@Test(groups = {"UnitTest", "fast"})
public void guiFilterTest1() {
try {
GuiFilter dialog = new GuiFilter(null, null);
dialog.setVisible(true);
Assert.assertNotNull(dialog);
dialog.dispose();
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@@ -1,30 +0,0 @@
package forge;
import org.testng.Assert;
import org.testng.annotations.Test;
import javax.swing.*;
/**
* Created by IntelliJ IDEA.
* User: dhudson
*/
@Test(groups = {"UnitTest"})
public class GuiQuestFilterTest {
/**
*
*
*/
@Test(groups = {"UnitTest", "fast"})
public void guiQuestFilterTest1() {
try {
GuiQuestFilter dialog = new GuiQuestFilter(null, null);
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setVisible(true);
Assert.assertNotNull(dialog);
dialog.dispose();
} catch (Exception e) {
e.printStackTrace();
}
}
}