Support creating quick gauntlets for mobile game

Support AI opponents using preconstructed decks in gauntlets
This commit is contained in:
drdev
2014-08-08 23:09:04 +00:00
parent 8ef560c93d
commit 0275d222ec
9 changed files with 200 additions and 108 deletions

View File

@@ -3,25 +3,19 @@ package forge.screens.home.gauntlet;
import forge.UiCommand;
import forge.Singletons;
import forge.control.FControl;
import forge.deck.Deck;
import forge.deck.DeckgenUtil;
import forge.deck.DeckgenUtil.DeckTypes;
import forge.deck.DeckType;
import forge.game.GameType;
import forge.game.player.RegisteredPlayer;
import forge.gauntlet.GauntletData;
import forge.gauntlet.GauntletIO;
import forge.gauntlet.GauntletUtil;
import forge.gui.SOverlayUtils;
import forge.gui.framework.ICDoc;
import forge.model.FModel;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Controls the "quick gauntlet" submenu in the home UI.
@@ -55,25 +49,9 @@ public enum CSubmenuGauntletQuick implements ICDoc {
@Override
public void initialize() {
view.getBtnStart().addActionListener(actStartGame);
updateData();
view.getGauntletLister().setSelectedIndex(0);
view.getLstDecks().initialize();
}
private void updateData() {
final File[] files = GauntletIO.getGauntletFilesUnlocked();
final List<GauntletData> data = new ArrayList<GauntletData>();
for (final File f : files) {
data.add(GauntletIO.loadGauntlet(f));
}
view.getGauntletLister().setGauntlets(data);
}
private void startGame() {
// Start game overlay
SwingUtilities.invokeLater(new Runnable() {
@@ -85,62 +63,19 @@ public enum CSubmenuGauntletQuick implements ICDoc {
});
// Find appropriate filename for new save, create and set new save file.
final File[] arrFiles = GauntletIO.getGauntletFilesQuick();
final Set<String> setNames = new HashSet<String>();
for (File f : arrFiles) { setNames.add(f.getName()); }
List<DeckType> allowedDeckTypes = new ArrayList<DeckType>();
if (view.getBoxColorDecks().isSelected()) { allowedDeckTypes.add(DeckType.COLOR_DECK); }
if (view.getBoxThemeDecks().isSelected()) { allowedDeckTypes.add(DeckType.THEME_DECK); }
if (view.getBoxUserDecks().isSelected()) { allowedDeckTypes.add(DeckType.CUSTOM_DECK); }
if (view.getBoxQuestDecks().isSelected()) { allowedDeckTypes.add(DeckType.QUEST_OPPONENT_DECK); }
if (view.getBoxPreconDecks().isSelected()) { allowedDeckTypes.add(DeckType.PRECONSTRUCTED_DECK); }
int num = 1;
while (setNames.contains(GauntletIO.PREFIX_QUICK + num + GauntletIO.SUFFIX_DATA)) { num++; }
FModel.getGauntletData().setName(GauntletIO.PREFIX_QUICK + num);
// Pull user deck
final Deck userDeck = view.getLstDecks().getPlayer().getDeck();
// Generate gauntlet decks
final int numOpponents = view.getSliOpponents().getValue();
final List<DeckTypes> lstDecktypes = new ArrayList<DeckTypes>();
final List<String> lstEventNames = new ArrayList<String>();
final List<Deck> lstGauntletDecks = new ArrayList<Deck>();
Deck tempDeck;
int randType;
if (view.getBoxColorDecks().isSelected()) { lstDecktypes.add(DeckTypes.COLORS); }
if (view.getBoxThemeDecks().isSelected()) { lstDecktypes.add(DeckTypes.THEMES); }
if (view.getBoxUserDecks().isSelected()) { lstDecktypes.add(DeckTypes.CUSTOM); }
if (view.getBoxQuestDecks().isSelected()) { lstDecktypes.add(DeckTypes.QUESTEVENTS); }
for (int i = 0; i < numOpponents; i++) {
randType = (int) Math.round(Math.random() * (lstDecktypes.size() - 1));
if (lstDecktypes.get(randType).equals(DeckTypes.COLORS)) {
tempDeck = DeckgenUtil.getRandomColorDeck(true);
lstEventNames.add("Random colors deck");
}
else if (lstDecktypes.get(randType).equals(DeckTypes.CUSTOM)) {
tempDeck = DeckgenUtil.getRandomCustomDeck();
lstEventNames.add(tempDeck.getName());
}
else {
tempDeck = DeckgenUtil.getRandomQuestDeck();
lstEventNames.add(tempDeck.getName());
}
lstGauntletDecks.add(tempDeck);
}
final GauntletData gd = FModel.getGauntletData();
gd.setDecks(lstGauntletDecks);
gd.setEventNames(lstEventNames);
gd.setUserDeck(userDeck);
// Reset all variable fields to 0, stamps and saves automatically.
gd.reset();
final Deck aiDeck = gd.getDecks().get(gd.getCompleted());
final GauntletData gd = GauntletUtil.createQuickGauntlet(view.getLstDecks().getPlayer().getDeck(), view.getSliOpponents().getValue(), allowedDeckTypes);
List<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>();
FControl fc = Singletons.getControl();
starter.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(fc.getGuiPlayer()));
starter.add(new RegisteredPlayer(aiDeck).setPlayer(fc.getAiPlayer()));
starter.add(new RegisteredPlayer(gd.getDecks().get(gd.getCompleted())).setPlayer(fc.getAiPlayer()));
fc.startMatch(GameType.Gauntlet, starter);
}

View File

@@ -1,5 +1,6 @@
package forge.screens.home.gauntlet;
import forge.deck.DeckType;
import forge.deckchooser.FDeckChooser;
import forge.gui.framework.DragCell;
import forge.gui.framework.DragTab;
@@ -46,13 +47,13 @@ public enum VSubmenuGauntletQuick implements IVSubmenu<CSubmenuGauntletQuick> {
private final SkinnedSlider sliOpponents = new SkinnedSlider(SwingConstants.HORIZONTAL, 5, 50, 20);
//private SkinnedSlider sliGamesPerMatch = new SkinnedSlider(JSlider.HORIZONTAL, 1, 7, 3);
private final JCheckBox boxUserDecks = new FCheckBox("Custom User Decks");
private final JCheckBox boxQuestDecks = new FCheckBox("Quest Decks");
private final JCheckBox boxColorDecks = new FCheckBox("Fully random color Decks");
private final JCheckBox boxThemeDecks = new FCheckBox("Semi-random theme Decks");
private final JCheckBox boxUserDecks = new FCheckBox(DeckType.CUSTOM_DECK.toString());
private final JCheckBox boxPreconDecks = new FCheckBox(DeckType.PRECONSTRUCTED_DECK.toString());
private final JCheckBox boxQuestDecks = new FCheckBox(DeckType.QUEST_OPPONENT_DECK.toString());
private final JCheckBox boxColorDecks = new FCheckBox(DeckType.COLOR_DECK.toString());
private final JCheckBox boxThemeDecks = new FCheckBox(DeckType.THEME_DECK.toString());
private final FDeckChooser lstDecks = new FDeckChooser(false);
private final QuickGauntletLister gauntletList = new QuickGauntletLister();
private final FLabel lblOptions = new FLabel.Builder().fontSize(16)
.fontStyle(Font.BOLD).text("OPTIONS").fontAlign(SwingConstants.CENTER).build();
@@ -73,6 +74,7 @@ public enum VSubmenuGauntletQuick implements IVSubmenu<CSubmenuGauntletQuick> {
lblTitle.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2));
boxUserDecks.setSelected(true);
boxPreconDecks.setSelected(true);
boxQuestDecks.setSelected(true);
boxThemeDecks.setSelected(true);
boxColorDecks.setSelected(true);
@@ -93,6 +95,7 @@ public enum VSubmenuGauntletQuick implements IVSubmenu<CSubmenuGauntletQuick> {
pnlOptions.add(lblDesc3, "w 96%!, gap 2% 0 0 0");
pnlOptions.setCornerDiameter(0);
pnlOptions.add(boxUserDecks, "w 96%!, h 30px!, gap 2% 0 0 5px");
pnlOptions.add(boxPreconDecks, "w 96%!, h 30px!, gap 2% 0 0 5px");
pnlOptions.add(boxQuestDecks, "w 96%!, h 30px!, gap 2% 0 0 5px");
pnlOptions.add(boxThemeDecks, "w 96%!, h 30px!, gap 2% 0 0 5px");
pnlOptions.add(boxColorDecks, "w 96%!, h 30px!, gap 2% 0 0 0");
@@ -148,16 +151,16 @@ public enum VSubmenuGauntletQuick implements IVSubmenu<CSubmenuGauntletQuick> {
return this.lstDecks;
}
/** @return {@link forge.screens.home.gauntlet.QuickGauntletLister} */
public QuickGauntletLister getGauntletLister() {
return this.gauntletList;
}
/** @return {@link javax.swing.JCheckBox} */
public JCheckBox getBoxUserDecks() {
return boxUserDecks;
}
/** @return {@link javax.swing.JCheckBox} */
public JCheckBox getBoxPreconDecks() {
return boxPreconDecks;
}
/** @return {@link javax.swing.JCheckBox} */
public JCheckBox getBoxQuestDecks() {
return boxQuestDecks;