Added option to start quests with a precon deck

This commit is contained in:
Fnoed
2012-03-04 03:39:31 +00:00
parent 1a7dce2204
commit 2fe2dad81f
6 changed files with 965 additions and 911 deletions

1
.gitattributes vendored
View File

@@ -11529,6 +11529,7 @@ src/main/java/forge/quest/data/QuestDuel.java svneol=native#text/plain
src/main/java/forge/quest/data/QuestEvent.java -text src/main/java/forge/quest/data/QuestEvent.java -text
src/main/java/forge/quest/data/QuestEventManager.java svneol=native#text/plain src/main/java/forge/quest/data/QuestEventManager.java svneol=native#text/plain
src/main/java/forge/quest/data/QuestPreferences.java svneol=native#text/plain src/main/java/forge/quest/data/QuestPreferences.java svneol=native#text/plain
src/main/java/forge/quest/data/QuestStartPool.java -text
src/main/java/forge/quest/data/QuestUtil.java svneol=native#text/plain src/main/java/forge/quest/data/QuestUtil.java svneol=native#text/plain
src/main/java/forge/quest/data/QuestUtilCards.java -text src/main/java/forge/quest/data/QuestUtilCards.java -text
src/main/java/forge/quest/data/bazaar/QuestStallDefinition.java svneol=native#text/plain src/main/java/forge/quest/data/bazaar/QuestStallDefinition.java svneol=native#text/plain

View File

@@ -1,12 +1,5 @@
package forge.gui.home.quest; package forge.gui.home.quest;
import java.io.File;
import java.io.FilenameFilter;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JOptionPane;
import forge.AllZone; import forge.AllZone;
import forge.Command; import forge.Command;
import forge.Singletons; import forge.Singletons;
@@ -17,6 +10,15 @@ import forge.properties.NewConstants;
import forge.quest.data.QuestData; import forge.quest.data.QuestData;
import forge.quest.data.QuestDataIO; import forge.quest.data.QuestDataIO;
import forge.quest.data.QuestPreferences.QPref; import forge.quest.data.QuestPreferences.QPref;
import forge.quest.data.QuestStartPool;
import javax.swing.*;
import java.io.File;
import java.io.FilenameFilter;
import java.util.HashMap;
import java.util.Map;
import static forge.quest.data.QuestStartPool.*;
/** /**
* TODO: Write javadoc for this type. * TODO: Write javadoc for this type.
@@ -139,6 +141,16 @@ public enum CSubmenuQuestData implements ICSubmenu {
"ControlQuest() > newQuest(): Error starting new quest!"); "ControlQuest() > newQuest(): Error starting new quest!");
} }
final QuestStartPool startPool;
final String startPrecon = view.getPrecon();
if (view.getRadCompleteStart().isSelected()) {
startPool = COMPLETE;
} else if (view.getRadStandardStart().isSelected()) {
startPool = STANDARD;
} else {
startPool = PRECON;
}
final Object o = JOptionPane.showInputDialog(null, "Poets will remember your quest as:", "Quest Name", JOptionPane.OK_CANCEL_OPTION); final Object o = JOptionPane.showInputDialog(null, "Poets will remember your quest as:", "Quest Name", JOptionPane.OK_CANCEL_OPTION);
if (o == null) { return; } if (o == null) { return; }
@@ -151,7 +163,7 @@ public enum CSubmenuQuestData implements ICSubmenu {
} }
// Give the user a few cards to build a deck // Give the user a few cards to build a deck
newdata.newGame(difficulty, mode, view.getCbStandardStart().isSelected()); newdata.newGame(difficulty, mode, startPool, startPrecon);
newdata.setName(questName); newdata.setName(questName);
newdata.saveData(); newdata.saveData();

View File

@@ -1,22 +1,17 @@
package forge.gui.home.quest; package forge.gui.home.quest;
import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.SwingConstants;
import net.miginfocom.swing.MigLayout;
import forge.gui.home.EMenuGroup; import forge.gui.home.EMenuGroup;
import forge.gui.home.EMenuItem; import forge.gui.home.EMenuItem;
import forge.gui.home.ICSubmenu; import forge.gui.home.ICSubmenu;
import forge.gui.home.IVSubmenu; import forge.gui.home.IVSubmenu;
import forge.gui.toolbox.FCheckBox; import forge.gui.toolbox.*;
import forge.gui.toolbox.FLabel; import forge.quest.data.QuestData;
import forge.gui.toolbox.FPanel;
import forge.gui.toolbox.FRadioButton; import net.miginfocom.swing.MigLayout;
import forge.gui.toolbox.FScrollPane;
import forge.gui.toolbox.FSkin; import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/** /**
* Singleton instance of "Colors" submenu in "Constructed" group. * Singleton instance of "Colors" submenu in "Constructed" group.
@@ -35,10 +30,15 @@ public enum VSubmenuQuestData implements IVSubmenu {
private final JRadioButton radMedium = new FRadioButton("Medium"); private final JRadioButton radMedium = new FRadioButton("Medium");
private final JRadioButton radHard = new FRadioButton("Hard"); private final JRadioButton radHard = new FRadioButton("Hard");
private final JRadioButton radExpert = new FRadioButton("Expert"); private final JRadioButton radExpert = new FRadioButton("Expert");
private final JRadioButton radFantasy = new FRadioButton("Fantasy"); private final JRadioButton radFantasy = new FRadioButton("Fantasy");
private final JRadioButton radClassic = new FRadioButton("Classic"); private final JRadioButton radClassic = new FRadioButton("Classic");
private final JCheckBox cbStandardStart = new FCheckBox("Standard (Type 2) Starting Pool"); private final JRadioButton radCompleteStart = new FRadioButton("Unrestricted Starting Pool");
private final JRadioButton radStandardStart = new FRadioButton("Standard (Type 2) Starting Pool");
private final JRadioButton radPreconStart = new FRadioButton("Preconstructed Deck: ");
private final JComboBox cbxPrecon = new JComboBox();
private final FLabel btnEmbark = new FLabel.Builder().opaque(true).hoverable(true).text("Embark!").build(); private final FLabel btnEmbark = new FLabel.Builder().opaque(true).hoverable(true).text("Embark!").build();
/* (non-Javadoc) /* (non-Javadoc)
@@ -73,14 +73,32 @@ public enum VSubmenuQuestData implements IVSubmenu {
group1.add(radMedium); group1.add(radMedium);
group1.add(radHard); group1.add(radHard);
group1.add(radExpert); group1.add(radExpert);
radEasy.setSelected(true); radEasy.setSelected(true);
radClassic.setSelected(true);
final ButtonGroup group2 = new ButtonGroup(); final ButtonGroup group2 = new ButtonGroup();
group2.add(radFantasy); group2.add(radFantasy);
group2.add(radClassic); group2.add(radClassic);
radClassic.setSelected(true);
final ActionListener preconListener = new ActionListener() {
@Override public void actionPerformed(ActionEvent actionEvent) {
cbxPrecon.setEnabled(radPreconStart.isSelected());
}
};
for (String preconDeck : QuestData.getPrecons().getNames()) {
cbxPrecon.addItem(preconDeck);
}
final ButtonGroup group3 = new ButtonGroup();
group3.add(radCompleteStart);
radCompleteStart.addActionListener(preconListener);
group3.add(radStandardStart);
radStandardStart.addActionListener(preconListener);
group3.add(radPreconStart);
radPreconStart.addActionListener(preconListener);
radCompleteStart.setSelected(true);
cbxPrecon.setEnabled(false);
final JPanel pnlOptions = new JPanel(); final JPanel pnlOptions = new JPanel();
pnlOptions.setOpaque(false); pnlOptions.setOpaque(false);
pnlOptions.setLayout(new MigLayout("insets 0, gap 0")); pnlOptions.setLayout(new MigLayout("insets 0, gap 0"));
@@ -91,8 +109,11 @@ public enum VSubmenuQuestData implements IVSubmenu {
pnlOptions.add(radMedium, constraints + ", gap 7.5% 2.5% 0 0"); pnlOptions.add(radMedium, constraints + ", gap 7.5% 2.5% 0 0");
pnlOptions.add(radClassic, constraints + ", wrap"); pnlOptions.add(radClassic, constraints + ", wrap");
pnlOptions.add(radHard, constraints + ", gap 7.5% 2.5% 0 0"); pnlOptions.add(radHard, constraints + ", gap 7.5% 2.5% 0 0");
pnlOptions.add(cbStandardStart, constraints + ", wrap"); pnlOptions.add(radCompleteStart, constraints + ", wrap");
pnlOptions.add(radExpert, constraints + ", gap 7.5% 2.5% 0 0, wrap"); pnlOptions.add(radExpert, constraints + ", gap 7.5% 2.5% 0 0 ");
pnlOptions.add(radStandardStart, constraints + ", wrap");
pnlOptions.add(radPreconStart, constraints + ", wrap, skip");
pnlOptions.add(cbxPrecon, "gap 20 0, w 30%!, h 35px!, wrap, skip");
pnlOptions.add(btnEmbark, "w 40%!, h 30px!, gap 30% 0 20px 0, span 3 1"); pnlOptions.add(btnEmbark, "w 40%!, h 30px!, gap 30% 0 20px 0, span 3 1");
@@ -111,7 +132,7 @@ public enum VSubmenuQuestData implements IVSubmenu {
pnlViewport.add(scr, "w 96%!, pushy, growy, gap 2% 0 0 30px"); pnlViewport.add(scr, "w 96%!, pushy, growy, gap 2% 0 0 30px");
pnlViewport.add(pnlTitleNew, "w 96%, h 36px!, gap 2% 0 0 10px"); pnlViewport.add(pnlTitleNew, "w 96%, h 36px!, gap 2% 0 0 10px");
pnlViewport.add(pnlOptions, "w 96%!, h 200px!, gap 2% 0 0 20px"); pnlViewport.add(pnlOptions, "w 96%!, h 250px!, gap 2% 0 0 20px");
pnl.add(new FScrollPane(pnlViewport), "w 100%!, h 100%!"); pnl.add(new FScrollPane(pnlViewport), "w 100%!, h 100%!");
} }
@@ -192,11 +213,24 @@ public enum VSubmenuQuestData implements IVSubmenu {
return radClassic; return radClassic;
} }
/** @return {@link javax.swing.JCheckBox} */ public JRadioButton getRadCompleteStart() {
public JCheckBox getCbStandardStart() { return radCompleteStart;
return cbStandardStart;
} }
/** @return {@link javax.swing.JCheckBox} */
public JRadioButton getRadStandardStart() {
return radStandardStart;
}
public JRadioButton getRadPreconStart() {
return radPreconStart;
}
public String getPrecon() {
return (String) cbxPrecon.getSelectedItem();
}
/** @return {@link forge.gui.toolbox.FLabel} */ /** @return {@link forge.gui.toolbox.FLabel} */
public FLabel getBtnEmbark() { public FLabel getBtnEmbark() {
return btnEmbark; return btnEmbark;

View File

@@ -17,28 +17,19 @@
*/ */
package forge.quest.data; package forge.quest.data;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import forge.Singletons; import forge.Singletons;
import forge.deck.Deck; import forge.deck.Deck;
import forge.item.CardPrinted; import forge.item.*;
import forge.item.InventoryItem;
import forge.item.ItemPool;
import forge.item.ItemPoolView;
import forge.item.PreconDeck;
import forge.properties.ForgeProps; import forge.properties.ForgeProps;
import forge.properties.NewConstants; import forge.properties.NewConstants;
import forge.quest.data.QuestPreferences.QPref; import forge.quest.data.QuestPreferences.QPref;
import forge.quest.data.item.QuestInventory; import forge.quest.data.item.QuestInventory;
import forge.quest.data.pet.QuestPetManager; import forge.quest.data.pet.QuestPetManager;
import forge.util.Predicate; import forge.util.*;
import forge.util.StorageView;
import forge.util.IStorage; import java.util.ArrayList;
import forge.util.IStorageView; import java.util.HashMap;
import forge.util.MyRandom; import java.util.List;
//when you create QuestDataOld and AFTER you copy the AI decks over //when you create QuestDataOld and AFTER you copy the AI decks over
//you have to call one of these two methods below //you have to call one of these two methods below
@@ -172,8 +163,8 @@ public final class QuestData {
private transient QuestEvent currentEvent; private transient QuestEvent currentEvent;
// This is used by shop. Had no idea where else to place this // This is used by shop. Had no idea where else to place this
private static transient IStorageView<PreconDeck> preconManager = new StorageView<PreconDeck>(new PreconReader( private static transient IStorageView<PreconDeck> preconManager =
ForgeProps.getFile(NewConstants.Quest.PRECONS))); new StorageView<PreconDeck>(new PreconReader(ForgeProps.getFile(NewConstants.Quest.PRECONS)));
/** The Constant RANK_TITLES. */ /** The Constant RANK_TITLES. */
public static final String[] RANK_TITLES = new String[] { "Level 0 - Confused Wizard", "Level 1 - Mana Mage", public static final String[] RANK_TITLES = new String[] { "Level 0 - Confused Wizard", "Level 1 - Mana Mage",
@@ -235,22 +226,34 @@ public final class QuestData {
* *
* @param diff * @param diff
* the diff * the diff
* @param m0de * @param mode
* the m0de * the mode
* @param standardStart * @param startPool
* the standard start * the start type
*/ */
public void newGame(final int diff, final String m0de, final boolean standardStart) { public void newGame(final int diff, final String mode, final QuestStartPool startPool, final String preconName) {
this.setDifficulty(diff); this.setDifficulty(diff);
final Predicate<CardPrinted> filter = standardStart ? Singletons.getModel().getFormats().getStandard() this.mode = mode;
.getFilterPrinted() : CardPrinted.Predicates.Presets.IS_TRUE;
this.myCards.setupNewGameCardPool(filter, diff);
this.setCredits(Singletons.getModel().getQuestPreferences().getPreferenceInt(QPref.STARTING_CREDITS, diff));
this.mode = m0de;
this.life = this.mode.equals(QuestData.FANTASY) ? 15 : 20; this.life = this.mode.equals(QuestData.FANTASY) ? 15 : 20;
final Predicate<CardPrinted> filter;
switch (startPool) {
case PRECON:
myCards.addPreconDeck(preconManager.get(preconName));
return;
case STANDARD:
filter = Singletons.getModel().getFormats().getStandard().getFilterPrinted();
break;
default: //Unrestricted
filter = CardPrinted.Predicates.Presets.IS_TRUE;
break;
}
this.setCredits(Singletons.getModel().getQuestPreferences().getPreferenceInt(QPref.STARTING_CREDITS, diff));
this.myCards.setupNewGameCardPool(filter, diff);
} }
// All belongings // All belongings

View File

@@ -0,0 +1,7 @@
package forge.quest.data;
public enum QuestStartPool {
COMPLETE,
STANDARD,
PRECON
}

View File

@@ -17,30 +17,21 @@
*/ */
package forge.quest.data; package forge.quest.data;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import net.slightlymagic.braids.util.lambda.Lambda1;
import forge.Singletons; import forge.Singletons;
import forge.card.BoosterGenerator; import forge.card.BoosterGenerator;
import forge.card.CardEdition; import forge.card.CardEdition;
import forge.card.FormatCollection; import forge.card.FormatCollection;
import forge.deck.Deck; import forge.deck.Deck;
import forge.item.BoosterPack; import forge.item.*;
import forge.item.CardDb;
import forge.item.CardPrinted;
import forge.item.FatPack;
import forge.item.InventoryItem;
import forge.item.ItemPool;
import forge.item.ItemPoolView;
import forge.item.OpenablePack;
import forge.item.PreconDeck;
import forge.item.TournamentPack;
import forge.quest.BoosterUtils; import forge.quest.BoosterUtils;
import forge.quest.data.QuestPreferences.QPref; import forge.quest.data.QuestPreferences.QPref;
import forge.util.MyRandom; import forge.util.MyRandom;
import forge.util.Predicate; import forge.util.Predicate;
import net.slightlymagic.braids.util.lambda.Lambda1;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
/** /**
* This is a helper class to execute operations on QuestData. It has been * This is a helper class to execute operations on QuestData. It has been
@@ -222,11 +213,15 @@ public final class QuestUtilCards {
if (this.q.getCredits() >= value) { if (this.q.getCredits() >= value) {
this.q.setCredits(this.q.getCredits() - value); this.q.setCredits(this.q.getCredits() - value);
this.q.getShopList().remove(precon); this.q.getShopList().remove(precon);
this.q.getMyDecks().add(precon.getDeck()); addPreconDeck(precon);
this.addAllCards(precon.getDeck().getMain().toFlatList());
} }
} }
void addPreconDeck(PreconDeck precon) {
this.q.getMyDecks().add(precon.getDeck());
this.addAllCards(precon.getDeck().getMain().toFlatList());
}
/** /**
* Sell card. * Sell card.
* *
@@ -357,7 +352,9 @@ public final class QuestUtilCards {
*/ */
public void generateTournamentsInShop(final int count) { public void generateTournamentsInShop(final int count) {
Predicate<CardEdition> hasTournament = CardEdition.Predicates.HAS_TOURNAMENT_PACK; Predicate<CardEdition> hasTournament = CardEdition.Predicates.HAS_TOURNAMENT_PACK;
this.q.getShopList().addAllFlat(hasTournament.random(Singletons.getModel().getEditions(), count, TournamentPack.FN_FROM_SET)); this.q.getShopList().addAllFlat(hasTournament.random(Singletons.getModel().getEditions(),
count,
TournamentPack.FN_FROM_SET));
} }
public void generateFatPacksInShop(final int count) { public void generateFatPacksInShop(final int count) {