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/QuestEventManager.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/QuestUtilCards.java -text
src/main/java/forge/quest/data/bazaar/QuestStallDefinition.java svneol=native#text/plain

View File

@@ -1,12 +1,5 @@
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.Command;
import forge.Singletons;
@@ -17,6 +10,15 @@ import forge.properties.NewConstants;
import forge.quest.data.QuestData;
import forge.quest.data.QuestDataIO;
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.
@@ -139,6 +141,16 @@ public enum CSubmenuQuestData implements ICSubmenu {
"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);
if (o == null) { return; }
@@ -151,7 +163,7 @@ public enum CSubmenuQuestData implements ICSubmenu {
}
// 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.saveData();

View File

@@ -1,22 +1,17 @@
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.EMenuItem;
import forge.gui.home.ICSubmenu;
import forge.gui.home.IVSubmenu;
import forge.gui.toolbox.FCheckBox;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FPanel;
import forge.gui.toolbox.FRadioButton;
import forge.gui.toolbox.FScrollPane;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.*;
import forge.quest.data.QuestData;
import net.miginfocom.swing.MigLayout;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* 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 radHard = new FRadioButton("Hard");
private final JRadioButton radExpert = new FRadioButton("Expert");
private final JRadioButton radFantasy = new FRadioButton("Fantasy");
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();
/* (non-Javadoc)
@@ -73,14 +73,32 @@ public enum VSubmenuQuestData implements IVSubmenu {
group1.add(radMedium);
group1.add(radHard);
group1.add(radExpert);
radEasy.setSelected(true);
radClassic.setSelected(true);
final ButtonGroup group2 = new ButtonGroup();
group2.add(radFantasy);
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();
pnlOptions.setOpaque(false);
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(radClassic, constraints + ", wrap");
pnlOptions.add(radHard, constraints + ", gap 7.5% 2.5% 0 0");
pnlOptions.add(cbStandardStart, constraints + ", wrap");
pnlOptions.add(radExpert, constraints + ", gap 7.5% 2.5% 0 0, wrap");
pnlOptions.add(radCompleteStart, constraints + ", 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");
@@ -111,7 +132,7 @@ public enum VSubmenuQuestData implements IVSubmenu {
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(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%!");
}
@@ -192,11 +213,24 @@ public enum VSubmenuQuestData implements IVSubmenu {
return radClassic;
}
/** @return {@link javax.swing.JCheckBox} */
public JCheckBox getCbStandardStart() {
return cbStandardStart;
public JRadioButton getRadCompleteStart() {
return radCompleteStart;
}
/** @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} */
public FLabel getBtnEmbark() {
return btnEmbark;

View File

@@ -17,28 +17,19 @@
*/
package forge.quest.data;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import forge.Singletons;
import forge.deck.Deck;
import forge.item.CardPrinted;
import forge.item.InventoryItem;
import forge.item.ItemPool;
import forge.item.ItemPoolView;
import forge.item.PreconDeck;
import forge.item.*;
import forge.properties.ForgeProps;
import forge.properties.NewConstants;
import forge.quest.data.QuestPreferences.QPref;
import forge.quest.data.item.QuestInventory;
import forge.quest.data.pet.QuestPetManager;
import forge.util.Predicate;
import forge.util.StorageView;
import forge.util.IStorage;
import forge.util.IStorageView;
import forge.util.MyRandom;
import forge.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
//when you create QuestDataOld and AFTER you copy the AI decks over
//you have to call one of these two methods below
@@ -172,8 +163,8 @@ public final class QuestData {
private transient QuestEvent currentEvent;
// This is used by shop. Had no idea where else to place this
private static transient IStorageView<PreconDeck> preconManager = new StorageView<PreconDeck>(new PreconReader(
ForgeProps.getFile(NewConstants.Quest.PRECONS)));
private static transient IStorageView<PreconDeck> preconManager =
new StorageView<PreconDeck>(new PreconReader(ForgeProps.getFile(NewConstants.Quest.PRECONS)));
/** The Constant RANK_TITLES. */
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
* the diff
* @param m0de
* the m0de
* @param standardStart
* the standard start
* @param mode
* the mode
* @param startPool
* 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);
final Predicate<CardPrinted> filter = standardStart ? Singletons.getModel().getFormats().getStandard()
.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.mode = mode;
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

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;
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.card.BoosterGenerator;
import forge.card.CardEdition;
import forge.card.FormatCollection;
import forge.deck.Deck;
import forge.item.BoosterPack;
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.item.*;
import forge.quest.BoosterUtils;
import forge.quest.data.QuestPreferences.QPref;
import forge.util.MyRandom;
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
@@ -222,10 +213,14 @@ public final class QuestUtilCards {
if (this.q.getCredits() >= value) {
this.q.setCredits(this.q.getCredits() - value);
this.q.getShopList().remove(precon);
addPreconDeck(precon);
}
}
void addPreconDeck(PreconDeck precon) {
this.q.getMyDecks().add(precon.getDeck());
this.addAllCards(precon.getDeck().getMain().toFlatList());
}
}
/**
* Sell card.
@@ -357,7 +352,9 @@ public final class QuestUtilCards {
*/
public void generateTournamentsInShop(final int count) {
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) {