mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 11:18:01 +00:00
Added a dialog to allow defining custom quest formats.
This commit is contained in:
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -12800,6 +12800,7 @@ src/main/java/forge/gui/home/quest/CSubmenuDuels.java -text
|
||||
src/main/java/forge/gui/home/quest/CSubmenuQuestData.java -text
|
||||
src/main/java/forge/gui/home/quest/CSubmenuQuestDecks.java -text
|
||||
src/main/java/forge/gui/home/quest/CSubmenuQuestPrefs.java -text
|
||||
src/main/java/forge/gui/home/quest/DialogCustomFormat.java -text
|
||||
src/main/java/forge/gui/home/quest/IVQuestStats.java -text
|
||||
src/main/java/forge/gui/home/quest/PnlEvent.java -text
|
||||
src/main/java/forge/gui/home/quest/QuestFileLister.java -text
|
||||
|
||||
@@ -22,6 +22,7 @@ import forge.properties.NewConstants;
|
||||
import forge.quest.QuestController;
|
||||
import forge.quest.QuestMode;
|
||||
import forge.quest.QuestStartPool;
|
||||
import forge.quest.data.GameFormatQuest;
|
||||
import forge.quest.data.QuestData;
|
||||
import forge.quest.data.QuestPreferences.QPref;
|
||||
import forge.quest.io.QuestDataIO;
|
||||
@@ -37,6 +38,8 @@ public enum CSubmenuQuestData implements ICDoc {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
private GameFormatQuest userFormat = new GameFormatQuest("Custom", new ArrayList<String>(), new ArrayList<String>());
|
||||
|
||||
private final Map<String, QuestData> arrQuests = new HashMap<String, QuestData>();
|
||||
|
||||
private final VSubmenuQuestData view = VSubmenuQuestData.SINGLETON_INSTANCE;
|
||||
@@ -50,10 +53,23 @@ public enum CSubmenuQuestData implements ICDoc {
|
||||
private final ActionListener preconListener = new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent actionEvent) {
|
||||
view.getCbxFormat().setEnabled(view.getRadRotatingStart().isSelected());
|
||||
view.getCbxFormat().setEnabled(view.getRadRotatingStart().isSelected() && !view.getBoxCustom().isSelected());
|
||||
view.getCbxPrecon().setEnabled(view.getRadPreconStart().isSelected());
|
||||
view.getBoxPersist().setEnabled(view.getRadRotatingStart().isSelected());
|
||||
view.getBoxCustom().setEnabled(view.getRadRotatingStart().isSelected());
|
||||
view.getBtnCustom().setEnabled(view.getRadRotatingStart().isSelected() && view.getBoxCustom().isSelected());
|
||||
}
|
||||
};
|
||||
private final ActionListener customFormatListener = new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent actionEvent) {
|
||||
if (actionEvent.getActionCommand().equals("Define")) {
|
||||
new DialogCustomFormat(userFormat);
|
||||
} else {
|
||||
System.out.println("Custom Format button event = " + actionEvent.getActionCommand());
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/* (non-Javadoc)
|
||||
@@ -67,6 +83,8 @@ public enum CSubmenuQuestData implements ICDoc {
|
||||
view.getRadUnrestricted().addActionListener(preconListener);
|
||||
view.getRadRotatingStart().addActionListener(preconListener);
|
||||
view.getRadPreconStart().addActionListener(preconListener);
|
||||
view.getBoxCustom().addActionListener(preconListener);
|
||||
view.getBtnFormatCustom().addActionListener(customFormatListener);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@@ -174,7 +192,13 @@ public enum CSubmenuQuestData implements ICDoc {
|
||||
}
|
||||
|
||||
// Give the user a few cards to build a deck
|
||||
Singletons.getModel().getQuest().newGame(questName, difficulty, mode, startPool, rotatingFormat, startPrecon, view.getBoxPersist().isSelected());
|
||||
final boolean useCustomFormat = (view.getRadRotatingStart().isSelected() && view.getBoxCustom().isSelected());
|
||||
if (useCustomFormat && userFormat != null) {
|
||||
userFormat.updateFilters();
|
||||
}
|
||||
Singletons.getModel().getQuest().newGame(questName, difficulty, mode, startPool, rotatingFormat, startPrecon,
|
||||
useCustomFormat ? userFormat : null,
|
||||
view.getBoxPersist().isSelected());
|
||||
Singletons.getModel().getQuest().save();
|
||||
|
||||
// Save in preferences.
|
||||
|
||||
162
src/main/java/forge/gui/home/quest/DialogCustomFormat.java
Normal file
162
src/main/java/forge/gui/home/quest/DialogCustomFormat.java
Normal file
@@ -0,0 +1,162 @@
|
||||
package forge.gui.home.quest;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.GridLayout;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.TreeMap;
|
||||
|
||||
|
||||
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.JDialog;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.WindowConstants;
|
||||
|
||||
import forge.card.CardEdition;
|
||||
import forge.quest.data.GameFormatQuest;
|
||||
import forge.Singletons;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
public class DialogCustomFormat extends JDialog {
|
||||
|
||||
private static final long serialVersionUID = 3155211532871888181L;
|
||||
private JScrollPane scrollPane;
|
||||
private final JButton btnOK = new JButton("OK");
|
||||
private final JButton btnCancel = new JButton("Cancel");
|
||||
private final JPanel buttonPanel = new JPanel();
|
||||
private GameFormatQuest customFormat;
|
||||
private JCheckBox [] choices;
|
||||
private String [] codes;
|
||||
|
||||
|
||||
/**
|
||||
* Create the dialog.
|
||||
*
|
||||
* @param userFormat
|
||||
* GameFormatQuest, the user-defined format to update
|
||||
*
|
||||
*/
|
||||
public DialogCustomFormat(GameFormatQuest userFormat) {
|
||||
|
||||
customFormat = userFormat;
|
||||
if (customFormat == null) {
|
||||
throw new RuntimeException("Null GameFormatQuest in DialogCustomFormat");
|
||||
}
|
||||
|
||||
this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
|
||||
TreeMap<Integer, CardEdition> sortedMap = new TreeMap<Integer, CardEdition>();
|
||||
|
||||
for (CardEdition ce : Singletons.getModel().getEditions()) {
|
||||
if (isSelectable(ce.getCode())) {
|
||||
sortedMap.put(new Integer(ce.getIndex()), ce);
|
||||
}
|
||||
}
|
||||
|
||||
final int numEditions = sortedMap.size();
|
||||
final int rows = 30;
|
||||
final int columns = numEditions <= rows ? 1 : 1 + ((numEditions - 1) / rows);
|
||||
|
||||
List<CardEdition> sortedEditions = new ArrayList<CardEdition>(sortedMap.values());
|
||||
choices = new JCheckBox[rows * columns];
|
||||
codes = new String[rows * columns];
|
||||
|
||||
int getIdx = 0;
|
||||
int putIdx = 0;
|
||||
|
||||
JPanel p = new JPanel();
|
||||
p.setSize(600, 400);
|
||||
p.setLayout(new GridLayout(rows, columns, 10, 0));
|
||||
|
||||
for (int row = 1; row < rows; row++) {
|
||||
for (int col = 1; col < columns + 1; col++) {
|
||||
getIdx = (row - 1) + ((col - 1) * (rows - 1));
|
||||
CardEdition edition = getIdx < numEditions ? sortedEditions.get(getIdx) : null;
|
||||
choices[putIdx] = (edition != null ? new JCheckBox(edition.getName()) : new JCheckBox());
|
||||
|
||||
if (edition == null) {
|
||||
choices[putIdx].setEnabled(false);
|
||||
codes[putIdx] = new String("");
|
||||
}
|
||||
else {
|
||||
if (customFormat.isSetLegal(edition.getCode()) && !(customFormat.getAllowedSetCodes().isEmpty())) {
|
||||
choices[putIdx].setSelected(true);
|
||||
}
|
||||
codes[putIdx] = new String(edition.getCode());
|
||||
}
|
||||
p.add(choices[putIdx]);
|
||||
putIdx++;
|
||||
}
|
||||
}
|
||||
scrollPane = new JScrollPane(p);
|
||||
|
||||
getContentPane().add(scrollPane, BorderLayout.CENTER);
|
||||
btnOK.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
updateCustomFormat();
|
||||
dispose();
|
||||
}
|
||||
});
|
||||
buttonPanel.add(btnOK, BorderLayout.WEST);
|
||||
btnCancel.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
dispose();
|
||||
}
|
||||
});
|
||||
buttonPanel.add(btnCancel, BorderLayout.EAST);
|
||||
getContentPane().add(buttonPanel, BorderLayout.SOUTH);
|
||||
|
||||
this.setSize(600, 450);
|
||||
this.setLocationRelativeTo(null);
|
||||
this.setTitle("Choose sets for custom format:");
|
||||
this.setVisible(true);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Make some sets unselectable (currently only Alpha and Beta).
|
||||
* Note that these sets can still be (theoretically) unlocked
|
||||
* later, for an exorbitant price. There'd be nothing to be
|
||||
* gained from allowing these initially (Unlimited already covers
|
||||
* their cardbase), and a lot to be lost (namely, easy early access
|
||||
* to extremely expensive cards...) --BBU
|
||||
*
|
||||
* @param setCode
|
||||
* String, set code
|
||||
* @return boolean, this set can be selected.
|
||||
*
|
||||
*/
|
||||
private boolean isSelectable(final String setCode) {
|
||||
if (setCode == null) {
|
||||
return true;
|
||||
}
|
||||
return !(setCode.equals("LEA") || setCode.equals("LEB"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the custom format in accordance with the selections.
|
||||
*/
|
||||
void updateCustomFormat() {
|
||||
if (customFormat == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
for (int i = 0; i < choices.length; i++) {
|
||||
if (choices[i] != null) {
|
||||
if (choices[i].isSelected()) {
|
||||
customFormat.addAllowedSet(codes[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@ import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.swing.ButtonGroup;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.JComboBox;
|
||||
import javax.swing.JLabel;
|
||||
@@ -76,6 +77,8 @@ public enum VSubmenuQuestData implements IVSubmenu {
|
||||
private final JRadioButton radUnrestricted = new FRadioButton("Unrestricted Starting Pool");
|
||||
private final JRadioButton radRotatingStart = new FRadioButton("Format: ");
|
||||
private final JComboBox cbxFormat = new JComboBox();
|
||||
private final FCheckBox boxFormatCustom = new FCheckBox("Custom");
|
||||
private final JButton btnFormatCustom = new JButton("Define");
|
||||
|
||||
private final JRadioButton radPreconStart = new FRadioButton("Preconstructed Deck: ");
|
||||
private final JComboBox cbxPrecon = new JComboBox();
|
||||
@@ -145,6 +148,8 @@ public enum VSubmenuQuestData implements IVSubmenu {
|
||||
cbxFormat.setEnabled(false);
|
||||
boxFormatPersist.setSelected(true);
|
||||
boxFormatPersist.setEnabled(false);
|
||||
boxFormatCustom.setEnabled(false);
|
||||
btnFormatCustom.setEnabled(false);
|
||||
radUnrestricted.setSelected(true);
|
||||
cbxPrecon.setEnabled(false);
|
||||
radMedium.setEnabled(true);
|
||||
@@ -161,7 +166,9 @@ public enum VSubmenuQuestData implements IVSubmenu {
|
||||
pnlOptions.add(radUnrestricted, constraints);
|
||||
|
||||
pnlOptions.add(radMedium, constraints + ", gap 1% 4% 0 5px");
|
||||
pnlOptions.add(radRotatingStart, constraints);
|
||||
pnlOptions.add(radRotatingStart, constraints + ", w 23%!, h 27px!, split 3");
|
||||
pnlOptions.add(boxFormatCustom, constraints + ", w 12%!, h 27px!");
|
||||
pnlOptions.add(btnFormatCustom, constraints + ", w 12%!, h 27px!");
|
||||
|
||||
pnlOptions.add(radHard, constraints + ", gap 1% 4% 0 5px");
|
||||
pnlOptions.add(cbxFormat, constraints);
|
||||
@@ -267,6 +274,20 @@ public enum VSubmenuQuestData implements IVSubmenu {
|
||||
return boxFormatPersist;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return {@link javax.swing.JCheckBox}
|
||||
*/
|
||||
public JCheckBox getBoxCustom() {
|
||||
return boxFormatCustom;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return {@link javax.swing.JButton}
|
||||
*/
|
||||
public JButton getBtnCustom() {
|
||||
return btnFormatCustom;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return {@link javax.swing.JRadioButton}
|
||||
*/
|
||||
@@ -311,6 +332,14 @@ public enum VSubmenuQuestData implements IVSubmenu {
|
||||
return btnEmbark;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return {@link forge.gui.toolbox.JButton}
|
||||
*/
|
||||
public JButton getBtnFormatCustom() {
|
||||
return btnFormatCustom;
|
||||
}
|
||||
|
||||
|
||||
//========== Overridden from IVDoc
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
||||
@@ -177,9 +177,6 @@ public class QuestController {
|
||||
this.questFormat = this.model == null ? null : this.model.getFormat();
|
||||
this.currentEvent = null;
|
||||
|
||||
// if (questFormat == null) { System.out.println("No quest."); }
|
||||
// else { System.out.println("Quest = " + questFormat.getName()); }
|
||||
|
||||
this.getChallengesManager().randomizeOpponents();
|
||||
this.getDuelsManager().randomizeOpponents();
|
||||
}
|
||||
@@ -211,16 +208,17 @@ public class QuestController {
|
||||
* @param startPool the start type
|
||||
* @param startFormat the format of starting pool
|
||||
* @param preconName the precon name
|
||||
* @param userFormat user-defined format, if any
|
||||
* @param persist
|
||||
* enforce the format for the whole quest
|
||||
*/
|
||||
public void newGame(final String name, final int diff, final QuestMode mode, final QuestStartPool startPool,
|
||||
final String startFormat, final String preconName, final boolean persist) {
|
||||
final String startFormat, final String preconName, final GameFormatQuest userFormat, final boolean persist) {
|
||||
|
||||
if (persist && startPool == QuestStartPool.Rotating) {
|
||||
this.load(new QuestData(name, diff, mode, startFormat));
|
||||
this.load(new QuestData(name, diff, mode, startFormat, userFormat));
|
||||
} else {
|
||||
this.load(new QuestData(name, diff, mode, null));
|
||||
this.load(new QuestData(name, diff, mode, null, null));
|
||||
}
|
||||
|
||||
final Predicate<CardPrinted> filter;
|
||||
@@ -230,7 +228,11 @@ public class QuestController {
|
||||
return;
|
||||
|
||||
case Rotating:
|
||||
if (userFormat != null) {
|
||||
filter = userFormat.getFilterPrinted();
|
||||
} else {
|
||||
filter = Singletons.getModel().getFormats().getFormat(startFormat).getFilterPrinted();
|
||||
}
|
||||
break;
|
||||
|
||||
default: // Unrestricted
|
||||
|
||||
@@ -199,7 +199,6 @@ public final class GameFormatQuest {
|
||||
|
||||
for (CardEdition ce : Singletons.getModel().getEditions()) {
|
||||
if (!isSetLegal(ce.getCode())) {
|
||||
// System.out.println("Added " + ce.getCode() + " to the list.");
|
||||
exSets.add(ce.getCode());
|
||||
}
|
||||
}
|
||||
@@ -219,8 +218,8 @@ public final class GameFormatQuest {
|
||||
} else if (this.allowedSetCodes.contains(setCode)) {
|
||||
return; // Already on the list
|
||||
}
|
||||
// System.out.println("Adding " + setCode + " to allowed sets!");
|
||||
this.allowedSetCodes.add(setCode);
|
||||
updateFilters();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -67,11 +67,15 @@ public final class QuestData {
|
||||
* quest name
|
||||
* @param formatString
|
||||
* String, persistent format for the quest (null if none).
|
||||
* @param userFormat
|
||||
* user-defined format, if any (null if none).
|
||||
*/
|
||||
public QuestData(String name2, int diff, QuestMode mode2, final String formatString) {
|
||||
public QuestData(String name2, int diff, QuestMode mode2, final String formatString, GameFormatQuest userFormat) {
|
||||
this.name = name2;
|
||||
|
||||
if (formatString == null) {
|
||||
if (userFormat != null) {
|
||||
format = userFormat;
|
||||
} else if (formatString == null) {
|
||||
format = null;
|
||||
} else {
|
||||
format = new GameFormatQuest(Singletons.getModel().getFormats().getFormat(formatString));
|
||||
|
||||
Reference in New Issue
Block a user