Initial commit of the Draft Tournament for Quests.

This commit is contained in:
Krazy
2014-05-31 21:04:29 +00:00
parent 24f4dd0e24
commit 289e1c35c5
27 changed files with 2560 additions and 31 deletions

View File

@@ -75,6 +75,9 @@ import forge.util.BuildInfo;
import forge.util.ITriggerEvent;
public class GuiDesktop implements IGuiBase {
private boolean showOverlay = true;
@Override
public void invokeInEdtLater(Runnable proc) {
SwingUtilities.invokeLater(proc);
@@ -212,11 +215,23 @@ public class GuiDesktop implements IGuiBase {
h.getLayoutControl().updateHand();
}
}
@Override
public void disableOverlay() {
showOverlay = false;
}
@Override
public void enableOverlay() {
showOverlay = true;
}
@Override
public void finishGame() {
new ViewWinLose(Singletons.getControl().getObservedGame());
SOverlayUtils.showOverlay();
if (showOverlay) {
SOverlayUtils.showOverlay();
}
}
@Override

View File

@@ -43,6 +43,7 @@ public enum EDocID { /** */
WORKSHOP_CARDDESIGNER (VCardDesigner.SINGLETON_INSTANCE), /** */
WORKSHOP_CARDSCRIPT (VCardScript.SINGLETON_INSTANCE), /** */
HOME_QUESTDRAFTS (VSubmenuQuestDraft.SINGLETON_INSTANCE), /** */
HOME_QUESTCHALLENGES (VSubmenuChallenges.SINGLETON_INSTANCE), /** */
HOME_QUESTDUELS (VSubmenuDuels.SINGLETON_INSTANCE), /** */
HOME_QUESTDATA (VSubmenuQuestData.SINGLETON_INSTANCE), /** */

View File

@@ -113,6 +113,14 @@ public enum FScreen {
true,
"Close Editor",
ForgeConstants.EDITOR_LAYOUT_FILE),
DECK_EDITOR_QUEST_TOURNAMENT(
VDeckEditorUI.SINGLETON_INSTANCE,
CDeckEditorUI.SINGLETON_INSTANCE,
"Quest Tournament Deck Editor",
FSkin.getImage(FSkinProp.IMG_PACK),
true,
"Close Editor",
ForgeConstants.EDITOR_LAYOUT_FILE),
QUEST_CARD_SHOP(
VDeckEditorUI.SINGLETON_INSTANCE,
CDeckEditorUI.SINGLETON_INSTANCE,

View File

@@ -0,0 +1,318 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.screens.deckeditor.controllers;
import java.util.Map.Entry;
import forge.card.MagicColor;
import forge.deck.Deck;
import forge.deck.DeckGroup;
import forge.deck.DeckSection;
import forge.gui.framework.DragCell;
import forge.gui.framework.FScreen;
import forge.item.PaperCard;
import forge.itemmanager.CardManager;
import forge.itemmanager.ItemManagerConfig;
import forge.limited.BoosterDraft;
import forge.limited.IBoosterDraft;
import forge.model.FModel;
import forge.properties.ForgePreferences.FPref;
import forge.screens.deckeditor.views.VAllDecks;
import forge.screens.deckeditor.views.VCurrentDeck;
import forge.screens.deckeditor.views.VDeckgen;
import forge.screens.home.quest.CSubmenuQuestDraft;
import forge.toolbox.FOptionPane;
import forge.util.ItemPool;
import forge.util.MyRandom;
/**
* Updates the deck editor UI as necessary draft selection mode.
*
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
*
* @author Forge
* @version $Id: CEditorDraftingProcess.java 24872 2014-02-17 07:35:47Z drdev $
*/
public class CEditorQuestDraftingProcess extends ACEditorBase<PaperCard, DeckGroup> {
private CSubmenuQuestDraft testDraftQuest;
public void setDraftQuest(CSubmenuQuestDraft testDraftQuest) {
this.testDraftQuest = testDraftQuest;
}
private IBoosterDraft boosterDraft;
private String ccAddLabel = "Add card";
private DragCell allDecksParent = null;
private DragCell deckGenParent = null;
private boolean saved = false;
//========== Constructor
/**
* Updates the deck editor UI as necessary draft selection mode.
*/
public CEditorQuestDraftingProcess() {
super(FScreen.DRAFTING_PROCESS);
final CardManager catalogManager = new CardManager(false);
final CardManager deckManager = new CardManager(false);
//hide filters and options panel so more of pack is visible by default
catalogManager.setHideViewOptions(1, true);
deckManager.setCaption("Draft Picks");
catalogManager.setAlwaysNonUnique(true);
deckManager.setAlwaysNonUnique(true);
this.setCatalogManager(catalogManager);
this.setDeckManager(deckManager);
}
/**
* Show gui.
*
* @param inBoosterDraft
* the in_booster draft
*/
public final void showGui(final IBoosterDraft inBoosterDraft) {
this.boosterDraft = inBoosterDraft;
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.ACEditorBase#onAddItems()
*/
@Override
protected void onAddItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
if (toAlternate) { return; }
// can only draft one at a time, regardless of the requested quantity
PaperCard card = items.iterator().next().getKey();
this.getDeckManager().addItem(card, 1);
// get next booster pack
this.boosterDraft.setChoice(card);
if (this.boosterDraft.hasNextChoice()) {
this.showChoices(this.boosterDraft.nextChoice());
}
else {
this.boosterDraft.finishedDrafting();
this.saveDraft();
}
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.ACEditorBase#onRemoveItems()
*/
@Override
protected void onRemoveItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
}
@Override
protected void buildAddContextMenu(EditorContextMenuBuilder cmb) {
cmb.addMoveItems("Draft", null);
}
@Override
protected void buildRemoveContextMenu(EditorContextMenuBuilder cmb) {
// no valid remove options
}
/**
* <p>
* showChoices.
* </p>
*
* @param list
* a {@link forge.CardList} object.
*/
private void showChoices(final ItemPool<PaperCard> list) {
int packNumber = ((BoosterDraft) boosterDraft).getCurrentBoosterIndex() + 1;
this.getCatalogManager().setCaption("Pack " + packNumber + " - Cards");
this.getCatalogManager().setPool(list);
} // showChoices()
/**
* <p>
* getPlayersDeck.
* </p>
*
* @return a {@link forge.deck.Deck} object.
*/
public Deck getPlayersDeck() {
final Deck deck = new Deck();
// add sideboard to deck
deck.getOrCreate(DeckSection.Sideboard).addAll(this.getDeckManager().getPool());
final String landSet = IBoosterDraft.LAND_SET_CODE[0].getCode();
final boolean isZendikarSet = landSet.equals("ZEN"); // we want to generate one kind of Zendikar lands at a time only
final boolean zendikarSetMode = MyRandom.getRandom().nextBoolean();
final int landsCount = 10;
for(String landName : MagicColor.Constant.BASIC_LANDS) {
int numArt = FModel.getMagicDb().getCommonCards().getArtCount(landName, landSet);
int minArtIndex = isZendikarSet ? (zendikarSetMode ? 1 : 5) : 1;
int maxArtIndex = isZendikarSet ? minArtIndex + 3 : numArt;
if (FModel.getPreferences().getPrefBoolean(FPref.UI_RANDOM_ART_IN_POOLS)) {
for (int i = minArtIndex; i <= maxArtIndex; i++) {
deck.get(DeckSection.Sideboard).add(landName, landSet, i, numArt > 1 ? landsCount : 30);
}
} else {
deck.get(DeckSection.Sideboard).add(landName, landSet, 30);
}
}
return deck;
} // getPlayersDeck()
/**
* <p>
* saveDraft.
* </p>
*/
private void saveDraft() {
String s = "Tournament Deck";
saved = true;
// Construct computer's decks and save draft
final Deck[] computer = this.boosterDraft.getDecks();
final DeckGroup finishedDraft = new DeckGroup(s);
finishedDraft.setHumanDeck((Deck) this.getPlayersDeck().copyTo(s));
finishedDraft.addAiDecks(computer);
CSubmenuQuestDraft.SINGLETON_INSTANCE.update();
FScreen.DRAFTING_PROCESS.close();
testDraftQuest.setCompletedDraft(finishedDraft, s);
}
//========== Overridden from ACEditorBase
@Override
protected CardLimit getCardLimit() {
return CardLimit.None;
}
/*
* (non-Javadoc)
*
* @see forge.gui.deckeditor.ACEditorBase#getController()
*/
@Override
public DeckController<DeckGroup> getDeckController() {
return null;
}
/*
* (non-Javadoc)
*
* @see forge.gui.deckeditor.ACEditorBase#updateView()
*/
@Override
public void resetTables() {
}
/*
* (non-Javadoc)
*
* @see forge.gui.deckeditor.ACEditorBase#show(forge.Command)
*/
@Override
public void update() {
this.getCatalogManager().setup(ItemManagerConfig.DRAFT_PACK);
this.getDeckManager().setup(ItemManagerConfig.DRAFT_POOL);
ccAddLabel = this.getBtnAdd().getText();
if (this.getDeckManager().getPool() == null) { //avoid showing next choice or resetting pool if just switching back to Draft screen
this.showChoices(this.boosterDraft.nextChoice());
this.getDeckManager().setPool((Iterable<PaperCard>) null);
}
else {
this.showChoices(this.getCatalogManager().getPool());
}
//Remove buttons
this.getBtnAdd().setVisible(false);
this.getBtnAdd4().setVisible(false);
this.getBtnRemove().setVisible(false);
this.getBtnRemove4().setVisible(false);
this.getBtnCycleSection().setVisible(false);
VCurrentDeck.SINGLETON_INSTANCE.getPnlHeader().setVisible(false);
deckGenParent = removeTab(VDeckgen.SINGLETON_INSTANCE);
allDecksParent = removeTab(VAllDecks.SINGLETON_INSTANCE);
// set catalog table to single-selection only mode
getCatalogManager().setAllowMultipleSelections(false);
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.controllers.ACEditorBase#canSwitchAway()
*/
@Override
public boolean canSwitchAway(boolean isClosing) {
if (isClosing && !saved) {
String userPrompt =
"This will end the current draft and you will not be able to resume.\n\n" +
"Leave anyway?";
return FOptionPane.showConfirmDialog(userPrompt, "Leave Draft?", "Leave", "Cancel", false);
}
return true;
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.controllers.ACEditorBase#resetUIChanges()
*/
@Override
public void resetUIChanges() {
//Re-rename buttons
this.getBtnAdd().setText(ccAddLabel);
//Re-add buttons
this.getBtnAdd4().setVisible(true);
this.getBtnRemove().setVisible(true);
this.getBtnRemove4().setVisible(true);
VCurrentDeck.SINGLETON_INSTANCE.getPnlHeader().setVisible(true);
//Re-add tabs
if (deckGenParent != null) {
deckGenParent.addDoc(VDeckgen.SINGLETON_INSTANCE);
}
if (allDecksParent != null) {
allDecksParent.addDoc(VAllDecks.SINGLETON_INSTANCE);
}
// set catalog table back to free-selection mode
getCatalogManager().setAllowMultipleSelections(true);
}
}

View File

@@ -0,0 +1,299 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.screens.deckeditor.controllers;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.google.common.base.Function;
import com.google.common.base.Supplier;
import forge.deck.Deck;
import forge.deck.DeckGroup;
import forge.deck.DeckSection;
import forge.gui.framework.DragCell;
import forge.gui.framework.FScreen;
import forge.item.InventoryItem;
import forge.item.PaperCard;
import forge.itemmanager.CardManager;
import forge.itemmanager.ColumnDef;
import forge.itemmanager.ItemManagerConfig;
import forge.itemmanager.views.ItemTableColumn;
import forge.model.FModel;
import forge.properties.ForgePreferences.FPref;
import forge.quest.QuestController;
import forge.quest.QuestEventDraft;
import forge.screens.deckeditor.SEditorIO;
import forge.screens.deckeditor.views.VAllDecks;
import forge.screens.deckeditor.views.VCurrentDeck;
import forge.screens.deckeditor.views.VDeckgen;
import forge.screens.home.quest.CSubmenuQuestDecks;
//import forge.quest.data.QuestBoosterPack;
/**
* Child controller for quest deck editor UI.
* <br><br>
* Card catalog and decks are drawn from a QuestController object.
*
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
*
* @author Forge
* @version $Id: CEditorQuest.java 24868 2014-02-17 05:08:05Z drdev $
*/
public final class CEditorQuestLimited extends ACEditorBase<PaperCard, DeckGroup> {
private final QuestController questData;
private final DeckController<DeckGroup> controller;
private final List<DeckSection> allSections = new ArrayList<DeckSection>();
private DragCell allDecksParent = null;
private DragCell deckGenParent = null;
private Map<PaperCard, Integer> decksUsingMyCards;
private final Function<Entry<InventoryItem, Integer>, Comparable<?>> fnDeckCompare = new Function<Entry<InventoryItem, Integer>, Comparable<?>>() {
@Override
public Comparable<?> apply(final Entry<InventoryItem, Integer> from) {
final Integer iValue = decksUsingMyCards.get(from.getKey());
return iValue == null ? Integer.valueOf(0) : iValue;
}
};
private final Function<Entry<? extends InventoryItem, Integer>, Object> fnDeckGet = new Function<Entry<? extends InventoryItem, Integer>, Object>() {
@Override
public Object apply(final Entry<? extends InventoryItem, Integer> from) {
final Integer iValue = decksUsingMyCards.get(from.getKey());
return iValue == null ? "" : iValue.toString();
}
};
/**
* Child controller for quest deck editor UI.
* <br><br>
* Card catalog and decks are drawn from a QuestController object.
*
* @param questData0 &emsp; {@link forge.quest.QuestController}
*/
public CEditorQuestLimited(final QuestController questData0) {
super(FScreen.DECK_EDITOR_QUEST_TOURNAMENT);
allSections.add(DeckSection.Main);
allSections.add(DeckSection.Sideboard);
this.questData = questData0;
final CardManager catalogManager = new CardManager(false);
final CardManager deckManager = new CardManager(false);
catalogManager.setCaption("Sideboard");
catalogManager.setAlwaysNonUnique(true);
deckManager.setAlwaysNonUnique(true);
this.setCatalogManager(catalogManager);
this.setDeckManager(deckManager);
final Supplier<DeckGroup> newCreator = new Supplier<DeckGroup>() {
@Override
public DeckGroup get() {
return new DeckGroup("");
}
};
this.controller = new DeckController<DeckGroup>(questData0.getDraftDecks(), this, newCreator);
controller.getView().getDeckManager().setup(ItemManagerConfig.DRAFT_POOL);
controller.setModel(questData0.getDraftDecks().get(QuestEventDraft.DECK_NAME));
}
/**
* Adds any card to the catalog and data pool.
*
* @param card {@link forge.item.PaperCard}
*/
public void addCheatCard(final PaperCard card, int qty) {
this.getCatalogManager().addItem(card, qty);
this.questData.getCards().getCardpool().add(card, qty);
}
// fills number of decks using each card
private Map<PaperCard, Integer> countDecksForEachCard() {
final Map<PaperCard, Integer> result = new HashMap<PaperCard, Integer>();
for (final Deck deck : this.questData.getMyDecks()) {
for (final Entry<PaperCard, Integer> e : deck.getMain()) {
final PaperCard card = e.getKey();
final Integer amount = result.get(card);
result.put(card, Integer.valueOf(amount == null ? 1 : 1 + amount.intValue()));
}
}
return result;
}
//=========== Overridden from ACEditorBase
@Override
protected CardLimit getCardLimit() {
if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) {
return CardLimit.Default;
}
return CardLimit.None; //if not enforcing deck legality, don't enforce default limit
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.ACEditorBase#onAddItems()
*/
@Override
protected void onAddItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
if (toAlternate) { return; }
// update view
this.getDeckManager().addItems(items);
this.getCatalogManager().removeItems(items);
this.getDeckController().notifyModelChanged();
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.ACEditorBase#onRemoveItems()
*/
@Override
protected void onRemoveItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
if (toAlternate) { return; }
// update view
this.getCatalogManager().addItems(items);
this.getDeckManager().removeItems(items);
this.getDeckController().notifyModelChanged();
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.ACEditorBase#buildAddContextMenu()
*/
@Override
protected void buildAddContextMenu(EditorContextMenuBuilder cmb) {
cmb.addMoveItems("Move", "to deck");
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.ACEditorBase#buildRemoveContextMenu()
*/
@Override
protected void buildRemoveContextMenu(EditorContextMenuBuilder cmb) {
cmb.addMoveItems("Move", "to sideboard");
}
private Deck getSelectedDeck(final DeckGroup model) {
return model.getHumanDeck();
}
/*
* (non-Javadoc)
*
* @see forge.gui.deckeditor.ACEditorBase#updateView()
*/
@Override
public void resetTables() {
final Deck toEdit = this.getSelectedDeck(this.controller.getModel());
this.getCatalogManager().setPool(toEdit.getOrCreate(DeckSection.Sideboard));
this.getDeckManager().setPool(toEdit.getMain());
}
//=========== Overridden from ACEditorBase
/*
* (non-Javadoc)
*
* @see forge.gui.deckeditor.ACEditorBase#getController()
*/
@Override
public DeckController<DeckGroup> getDeckController() {
return this.controller;
}
@Override
public void update() {
this.getCatalogManager().setup(getScreen() == FScreen.DECK_EDITOR_DRAFT ? ItemManagerConfig.DRAFT_POOL : ItemManagerConfig.SEALED_POOL);
this.getDeckManager().setup(ItemManagerConfig.DECK_EDITOR);
this.decksUsingMyCards = this.countDecksForEachCard();
final Map<ColumnDef, ItemTableColumn> colOverridesCatalog = new HashMap<ColumnDef, ItemTableColumn>();
final Map<ColumnDef, ItemTableColumn> colOverridesDeck = new HashMap<ColumnDef, ItemTableColumn>();
ItemTableColumn.addColOverride(ItemManagerConfig.QUEST_EDITOR_POOL, colOverridesCatalog, ColumnDef.NEW, this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewGet());
ItemTableColumn.addColOverride(ItemManagerConfig.QUEST_DECK_EDITOR, colOverridesDeck, ColumnDef.NEW, this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewGet());
ItemTableColumn.addColOverride(ItemManagerConfig.QUEST_DECK_EDITOR, colOverridesDeck, ColumnDef.DECKS, this.fnDeckCompare, this.fnDeckGet);
this.getCatalogManager().setup(ItemManagerConfig.QUEST_EDITOR_POOL, colOverridesCatalog);
this.getDeckManager().setup(ItemManagerConfig.QUEST_DECK_EDITOR, colOverridesDeck);
resetUI();
VCurrentDeck.SINGLETON_INSTANCE.getBtnSave().setVisible(true);
VCurrentDeck.SINGLETON_INSTANCE.getBtnImport().setVisible(false);
VCurrentDeck.SINGLETON_INSTANCE.getTxfTitle().setEnabled(false);
deckGenParent = removeTab(VDeckgen.SINGLETON_INSTANCE);
allDecksParent = removeTab(VAllDecks.SINGLETON_INSTANCE);
if (this.controller.getModel() == null) {
throw new RuntimeException("Expected deck group but found none!");
}
else {
this.controller.refreshModel();
}
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.controllers.ACEditorBase#canSwitchAway()
*/
@Override
public boolean canSwitchAway(boolean isClosing) {
if (SEditorIO.confirmSaveChanges(FScreen.DECK_EDITOR_QUEST_TOURNAMENT, isClosing)) {
FModel.getQuest().save();
return true;
}
return false;
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.controllers.ACEditorBase#resetUIChanges()
*/
@Override
public void resetUIChanges() {
CSubmenuQuestDecks.SINGLETON_INSTANCE.update();
//Re-add tabs
if (deckGenParent != null) {
deckGenParent.addDoc(VDeckgen.SINGLETON_INSTANCE);
}
if (allDecksParent != null) {
allDecksParent.addDoc(VAllDecks.SINGLETON_INSTANCE);
}
}
/**
* TODO: Write javadoc for this method.
* @param d0
*/
/*public void load(Deck deck) {
controller.setModel(deck);
}*/
}

View File

@@ -118,6 +118,7 @@ public enum VHomeUI implements IVTopLevelUI {
allSubmenus.add(VSubmenuDuels.SINGLETON_INSTANCE);
allSubmenus.add(VSubmenuChallenges.SINGLETON_INSTANCE);
allSubmenus.add(VSubmenuQuestDraft.SINGLETON_INSTANCE);
allSubmenus.add(VSubmenuQuestDecks.SINGLETON_INSTANCE);
allSubmenus.add(VSubmenuQuestData.SINGLETON_INSTANCE);
allSubmenus.add(VSubmenuQuestPrefs.SINGLETON_INSTANCE);

View File

@@ -0,0 +1,384 @@
package forge.screens.home.quest;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.JRadioButton;
import javax.swing.SwingUtilities;
import forge.Singletons;
import forge.UiCommand;
import forge.assets.FSkinProp;
import forge.deck.CardPool;
import forge.deck.Deck;
import forge.deck.DeckGroup;
import forge.deck.DeckSection;
import forge.game.GameType;
import forge.gui.framework.EDocID;
import forge.gui.framework.FScreen;
import forge.gui.framework.ICDoc;
import forge.itemmanager.DeckManager;
import forge.limited.BoosterDraft;
import forge.limited.LimitedPoolType;
import forge.model.FModel;
import forge.properties.ForgePreferences.FPref;
import forge.quest.QuestController;
import forge.quest.QuestEventDraft;
import forge.quest.data.QuestAchievements;
import forge.screens.deckeditor.CDeckEditorUI;
import forge.screens.deckeditor.controllers.CEditorQuestDraftingProcess;
import forge.screens.deckeditor.controllers.CEditorQuestLimited;
import forge.screens.deckeditor.views.VCurrentDeck;
import forge.screens.home.CHomeUI;
import forge.screens.home.quest.VSubmenuQuestDraft.Mode;
import forge.screens.home.sanctioned.CSubmenuDraft;
import forge.toolbox.FOptionPane;
import forge.toolbox.FSkin;
import forge.toolbox.JXButtonPanel;
import forge.util.storage.IStorage;
/**
* Controls the quest draft submenu in the home UI.
*
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
*
*/
public enum CSubmenuQuestDraft implements ICDoc {
SINGLETON_INSTANCE;
private static final DecimalFormat NUMBER_FORMATTER = new DecimalFormat("#,###");
@SuppressWarnings("serial")
@Override
public void initialize() {
final VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE;
if (FModel.getQuest().getDraftDecks() == null || !FModel.getQuest().getDraftDecks().contains(QuestEventDraft.DECK_NAME)) {
view.setMode(Mode.SELECT_TOURNAMENT);
} else if (!FModel.getQuest().getAchievements().isTournamentActive()) {
view.setMode(Mode.PREPARE_DECK);
} else {
view.setMode(Mode.TOURNAMENT_ACTIVE);
}
view.getBtnStartDraft().addActionListener(selectTournamentStart);
view.getBtnStartTournament().addActionListener(prepareDeckStart);
view.getBtnStartMatch().addActionListener(nextMatchStart);
view.getBtnEditDeck().setCommand(
new UiCommand() { @Override
public void run() { CSubmenuQuestDraft.this.editDeck(); } });
view.getBtnLeaveTournament().setCommand(
new UiCommand() { @Override
public void run() { CSubmenuQuestDraft.this.TEMP_END_TOURNAMENT(); } });
}
private void TEMP_END_TOURNAMENT() {
// TODO Integrate better
Deck deck = FModel.getQuest().getDraftDecks().get(QuestEventDraft.DECK_NAME).getHumanDeck();
FModel.getQuest().getCards().addAllCards(deck.getAllCardsInASinglePool().toFlatList());
if (FOptionPane.showOptionDialog("Add this draft to normal mode?", "Add Draft?", FSkin.getImage(FSkinProp.ICO_QUESTION), new String[] { "Yes", "No" }) == 0) {
String tournamentName = FModel.getQuest().getName() + " Tournament Deck " + new SimpleDateFormat("EEE d MMM yyyy HH-mm-ss").format(new Date());
DeckGroup original = FModel.getQuest().getDraftDecks().get(QuestEventDraft.DECK_NAME);
DeckGroup output = new DeckGroup(tournamentName);
for (Deck aiDeck : original.getAiDecks()) {
output.addAiDeck(copyDeck(aiDeck));
}
output.setHumanDeck(copyDeck(original.getHumanDeck(), tournamentName));
FModel.getDecks().getDraft().add(output);
CSubmenuDraft.SINGLETON_INSTANCE.update();
}
if (deck.get(DeckSection.Main).countAll() > 0) {
FModel.getQuest().getMyDecks().add(FModel.getQuest().getDraftDecks().get(QuestEventDraft.DECK_NAME).getHumanDeck());
FModel.getQuest().getMyDecks().get(QuestEventDraft.DECK_NAME).get(DeckSection.Sideboard).clear();
}
FModel.getQuest().getDraftDecks().delete(QuestEventDraft.DECK_NAME);
FModel.getQuest().getAchievements().endCurrentTournament();
FModel.getQuest().save();
VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE;
view.setMode(Mode.SELECT_TOURNAMENT);
view.populate();
CSubmenuQuestDraft.SINGLETON_INSTANCE.update();
}
private final ActionListener selectTournamentStart = new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
CSubmenuQuestDraft.this.startDraft();
}
};
private final ActionListener prepareDeckStart = new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
//TODO Refactor the deck getting to a single method
String message = GameType.QuestDraft.getDecksFormat().getDeckConformanceProblem(FModel.getQuest().getAssets().getDraftDeckStorage().get(QuestEventDraft.DECK_NAME).getHumanDeck());
if (message != null) {
//TODO Pref for allowing non-conformant decks
FOptionPane.showMessageDialog(message, "Deck Invalid");
return;
}
CSubmenuQuestDraft.this.startTournament();
}
};
private final ActionListener nextMatchStart = new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
QuestDraftUtils.startNextMatch();
}
};
private final KeyAdapter startOnEnter = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (KeyEvent.VK_ENTER == e.getKeyChar()) {
VSubmenuQuestDraft.SINGLETON_INSTANCE.getBtnStartDraft().doClick();
}
}
};
private final MouseAdapter startOnDblClick = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (MouseEvent.BUTTON1 == e.getButton() && 2 == e.getClickCount()) {
VSubmenuQuestDraft.SINGLETON_INSTANCE.getBtnStartDraft().doClick();
}
}
};
@Override
public void update() {
VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE;
if (FModel.getQuest().getAchievements() == null) {
return;
}
QuestDraftUtils.update();
QuestAchievements achievements = FModel.getQuest().getAchievements();
achievements.generateNewTournaments();
switch (view.getMode()) {
case SELECT_TOURNAMENT:
updateSelectTournament();
break;
case PREPARE_DECK:
updatePrepareDeck();
break;
case TOURNAMENT_ACTIVE:
updateTournamentActive();
break;
default:
break;
}
}
private void updateSelectTournament() {
VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE;
view.getLblCredits().setText("Available Credits: " + NUMBER_FORMATTER.format(FModel.getQuest().getAssets().getCredits()));
FModel.getQuest().getAchievements().generateNewTournaments();
view.getPnlTournaments().removeAll();
JXButtonPanel grpPanel = new JXButtonPanel();
boolean firstPanel = true;
for (QuestEventDraft draft : FModel.getQuest().getAchievements().getDraftEvents()) {
PnlDraftEvent draftPanel = new PnlDraftEvent(draft);
final JRadioButton button = draftPanel.getRadioButton();
if (firstPanel) {
button.setSelected(true);
SwingUtilities.invokeLater(new Runnable() {
@Override public void run() { button.requestFocusInWindow(); }
});
firstPanel = false;
}
grpPanel.add(draftPanel, button, "w 100%!, h 135px!, gapy 15px");
button.addKeyListener(startOnEnter);
button.addMouseListener(startOnDblClick);
}
view.getPnlTournaments().add(grpPanel, "w 100%!");
}
private void updatePrepareDeck() {
}
private void updateTournamentActive() {
VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE;
if (FModel.getQuest().getAchievements().getCurrentDraft() == null) {
return;
}
for (int i = 0; i < 15; i++) {
String playerID = FModel.getQuest().getAchievements().getCurrentDraft().getStandings()[i];
if (playerID.equals(QuestEventDraft.HUMAN)) {
playerID = FModel.getPreferences().getPref(FPref.PLAYER_NAME);
} else if (playerID.equals(QuestEventDraft.UNDETERMINED)) {
playerID = "Undetermined";
} else {
playerID = FModel.getQuest().getAchievements().getCurrentDraft().getAINames()[Integer.parseInt(playerID) - 1];
}
view.getLblsStandings()[i].setText(playerID);
}
}
public void setCompletedDraft(DeckGroup finishedDraft, String s) {
List<Deck> aiDecks = new ArrayList<Deck>(finishedDraft.getAiDecks());
finishedDraft.getAiDecks().clear();
for (int i = 0; i < aiDecks.size(); i++) {
Deck oldDeck = aiDecks.get(i);
Deck namedDeck = new Deck("AI Deck " + i);
namedDeck.putSection(DeckSection.Main, oldDeck.get(DeckSection.Main));
namedDeck.putSection(DeckSection.Sideboard, oldDeck.get(DeckSection.Sideboard));
finishedDraft.getAiDecks().add(namedDeck);
}
IStorage<DeckGroup> draft = FModel.getQuest().getDraftDecks();
draft.add(finishedDraft);
Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_QUEST_TOURNAMENT);
CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(new CEditorQuestLimited(FModel.getQuest()));
FModel.getQuest().save();
VSubmenuQuestDraft.SINGLETON_INSTANCE.setMode(Mode.PREPARE_DECK);
VSubmenuQuestDraft.SINGLETON_INSTANCE.populate();
}
private void editDeck() {
VCurrentDeck.SINGLETON_INSTANCE.setItemManager(new DeckManager(GameType.Draft));
Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_QUEST_TOURNAMENT);
CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(new CEditorQuestLimited(FModel.getQuest()));
FModel.getQuest().save();
}
private void startDraft() {
QuestEventDraft draftEvent = SSubmenuQuestUtil.getDraftEvent();
/*long creditsAvailable = FModel.getQuest().getAssets().getCredits();
if (creditsAvailable < draftEvent.getEntryFee()) {
FOptionPane.showMessageDialog("You need " + NUMBER_FORMATTER.format(draftEvent.getEntryFee() - creditsAvailable) + " more credits to enter this tournament.", "Not Enough Credits");
return;
}*/
boolean okayToEnter = FOptionPane.showConfirmDialog("This tournament costs " + draftEvent.getEntryFee() + " credits to enter.\nAre you sure you wish to enter?", "Enter Draft Tournament?");
if (!okayToEnter) {
return;
}
FModel.getQuest().getAchievements().setCurrentDraft(draftEvent);
//TODO What happens when the draft is quit early
FModel.getQuest().getAssets().subtractCredits(draftEvent.getEntryFee());
BoosterDraft draft = BoosterDraft.createDraft(LimitedPoolType.Block, FModel.getBlocks().get(draftEvent.getBlock()), draftEvent.getBoosterConfiguration());
final CEditorQuestDraftingProcess draftController = new CEditorQuestDraftingProcess();
draftController.showGui(draft);
draftController.setDraftQuest(CSubmenuQuestDraft.this);
Singletons.getControl().setCurrentScreen(FScreen.DRAFTING_PROCESS);
CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(draftController);
}
private void startTournament() {
VSubmenuQuestDraft.SINGLETON_INSTANCE.setMode(Mode.TOURNAMENT_ACTIVE);
VSubmenuQuestDraft.SINGLETON_INSTANCE.populate();
update();
// TODO All the stuff needed for the tournament itself
}
private Deck copyDeck(final Deck deck) {
Deck outputDeck = new Deck(deck.getName());
outputDeck.putSection(DeckSection.Main, new CardPool(deck.get(DeckSection.Main)));
outputDeck.putSection(DeckSection.Sideboard, new CardPool(deck.get(DeckSection.Sideboard)));
return outputDeck;
}
private Deck copyDeck(final Deck deck, final String deckName) {
Deck outputDeck = new Deck(deckName);
outputDeck.putSection(DeckSection.Main, new CardPool(deck.get(DeckSection.Main)));
outputDeck.putSection(DeckSection.Sideboard, new CardPool(deck.get(DeckSection.Sideboard)));
return outputDeck;
}
@Override
public UiCommand getCommandOnSelect() {
final QuestController qc = FModel.getQuest();
return new UiCommand() {
private static final long serialVersionUID = 6153589785507038445L;
@Override
public void run() {
if (qc.getAchievements() == null) {
CHomeUI.SINGLETON_INSTANCE.itemClick(EDocID.HOME_QUESTDATA);
}
}
};
}
}

View File

@@ -0,0 +1,88 @@
package forge.screens.home.quest;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.text.DecimalFormat;
import javax.swing.JPanel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import net.miginfocom.swing.MigLayout;
import forge.model.FModel;
import forge.quest.QuestEventDraft;
import forge.toolbox.FRadioButton;
import forge.toolbox.FSkin;
import forge.toolbox.FSkin.SkinColor;
import forge.toolbox.FTextArea;
public class PnlDraftEvent extends JPanel {
private static final long serialVersionUID = 7348489421342846451L;
private static final DecimalFormat NUMBER_FORMATTER = new DecimalFormat("#,###");
private final Color clr2 = new Color(255, 255, 0, 0);
private final SkinColor clr3 = FSkin.getColor(FSkin.Colors.CLR_THEME2).alphaColor(200);
private final FRadioButton radButton;
public PnlDraftEvent(final QuestEventDraft event) {
super();
radButton = new FRadioButton(event.getTitle());
radButton.setFont(FSkin.getBoldFont(20));
radButton.setIconTextGap(10);
final FTextArea eventBoosters = new FTextArea();
final FTextArea eventFee = new FTextArea();
String boosterList = "";
for (int i = 0; i < event.getBoosterConfiguration().length; i++) {
boosterList += FModel.getMagicDb().getEditions().get(event.getBoosterConfiguration()[i]).getName();
if (i != event.getBoosterConfiguration().length - 1) {
boosterList += " | ";
}
}
eventBoosters.setText(boosterList);
eventBoosters.setFont(FSkin.getFont(12));
eventFee.setText(NUMBER_FORMATTER.format(event.getEntryFee()) + " Credit Entry Fee");
eventFee.setFont(FSkin.getFont(12));
radButton.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent arg0) {
if (radButton.isSelected()) {
SSubmenuQuestUtil.setDraftEvent(event);
}
}
});
this.setOpaque(false);
this.setLayout(new MigLayout("insets 0, gap 0, wrap"));
this.add(radButton, "gap 25px 0 20px 0");
this.add(eventBoosters, "w 100% - 25px!, gap 25px 0 15px 0");
this.add(eventFee, "w 100% - 25px!, gap 25px 0 10px 0");
}
public FRadioButton getRadioButton() {
return radButton;
}
@Override
public void paintComponent(final Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
FSkin.setGraphicsGradientPaint(g2d, 0, 0, clr3, (int) (getWidth() * 0.75), 0, clr2);
g2d.fillRect(0, 0, (int) (getWidth() * 0.75), getHeight());
g2d.dispose();
}
}

View File

@@ -0,0 +1,181 @@
package forge.screens.home.quest;
import java.util.ArrayList;
import java.util.List;
import javax.swing.SwingUtilities;
import forge.GuiBase;
import forge.Singletons;
import forge.deck.DeckGroup;
import forge.game.Game;
import forge.game.GameType;
import forge.game.player.RegisteredPlayer;
import forge.gui.SOverlayUtils;
import forge.gui.framework.FScreen;
import forge.model.FModel;
import forge.quest.QuestEventDraft;
public class QuestDraftUtils {
private static List<DraftMatchup> matchups = new ArrayList<DraftMatchup>();
public static boolean matchInProgress = false;
private static boolean waitForUserInput = false;
public static void continueMatch(Game lastGame) {
if (lastGame.getMatch().isMatchOver()) {
matchInProgress = false;
}
if (!matchInProgress) {
// Reset other stuff
Singletons.getControl().endCurrentGame();
Singletons.getControl().setCurrentScreen(FScreen.HOME_SCREEN);
} else {
Singletons.getControl().endCurrentGame();
Singletons.getControl().startGameWithUi(lastGame.getMatch());
}
}
public static void startNextMatch() {
matchups.clear();
QuestEventDraft draft = FModel.getQuest().getAchievements().getCurrentDraft();
String[] currentStandings = draft.getStandings();
int currentSet = -1;
for (int i = currentStandings.length - 1; i >= 0; i--) {
if (!currentStandings[i].equals(QuestEventDraft.UNDETERMINED)) {
currentSet = i;
break;
}
}
switch (currentSet) {
case 7:
addMatchup(0, 1, draft);
addMatchup(2, 3, draft);
addMatchup(4, 5, draft);
addMatchup(6, 7, draft);
break;
case 11:
addMatchup(8, 9, draft);
addMatchup(10, 11, draft);
break;
case 13:
addMatchup(12, 13, draft);
break;
case 14:
default:
return;
}
update();
}
private static void addMatchup(final int player1, final int player2, final QuestEventDraft draft) {
DraftMatchup matchup = new DraftMatchup();
DeckGroup decks = FModel.getQuest().getAssets().getDraftDeckStorage().get(QuestEventDraft.DECK_NAME);
int humanIndex = -1;
int aiIndex = -1;
if (draft.getStandings()[player1].equals(QuestEventDraft.HUMAN)) {
humanIndex = player1;
aiIndex = player2;
} else if (draft.getStandings()[player2].equals(QuestEventDraft.HUMAN)) {
humanIndex = player2;
aiIndex = player1;
}
if (humanIndex > -1) {
matchup.hasHumanPlayer = true;
matchup.matchStarter.add(new RegisteredPlayer(decks.getHumanDeck()).setPlayer(GuiBase.getInterface().getGuiPlayer()));
int aiName = Integer.parseInt(draft.getStandings()[aiIndex]) - 1;
int aiDeckIndex = Integer.parseInt(draft.getStandings()[aiIndex]) - 1;
matchup.matchStarter.add(new RegisteredPlayer(decks.getAiDecks().get(aiDeckIndex)).setPlayer(GuiBase.getInterface().createAiPlayer(draft.getAINames()[aiName], draft.getAIIcons()[aiName])));
} else {
int aiName1 = Integer.parseInt(draft.getStandings()[player1]) - 1;
int aiName2 = Integer.parseInt(draft.getStandings()[player2]) - 1;
int aiDeckIndex = Integer.parseInt(draft.getStandings()[player1]) - 1;
matchup.matchStarter.add(new RegisteredPlayer(decks.getAiDecks().get(aiDeckIndex)).setPlayer(GuiBase.getInterface().createAiPlayer(draft.getAINames()[aiName1], draft.getAIIcons()[aiName1])));
aiDeckIndex = Integer.parseInt(draft.getStandings()[player2]) - 1;
matchup.matchStarter.add(new RegisteredPlayer(decks.getAiDecks().get(aiDeckIndex)).setPlayer(GuiBase.getInterface().createAiPlayer(draft.getAINames()[aiName2], draft.getAIIcons()[aiName2])));
}
matchups.add(matchup);
}
public static void update() {
if (matchups.isEmpty()) {
return;
}
if (waitForUserInput) {
return;
}
if (matchInProgress) {
return;
}
GuiBase.getInterface().enableOverlay();
DraftMatchup nextMatch = matchups.remove(0);
matchInProgress = true;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
SOverlayUtils.startGameOverlay();
SOverlayUtils.showOverlay();
}
});
if (!nextMatch.hasHumanPlayer) {
GuiBase.getInterface().disableOverlay();
waitForUserInput = false;
} else {
waitForUserInput = true;
}
GuiBase.getInterface().startMatch(GameType.QuestDraft, nextMatch.matchStarter);
}
public static void continueMatches() {
waitForUserInput = false;
update();
}
private static class DraftMatchup {
private List<RegisteredPlayer> matchStarter = new ArrayList<RegisteredPlayer>();
private boolean hasHumanPlayer = false;
}
}

View File

@@ -45,6 +45,7 @@ import java.util.List;
*/
public class SSubmenuQuestUtil {
private static QuestEvent event;
private static QuestEventDraft draftEvent;
/**
* <p>
@@ -240,6 +241,14 @@ public class SSubmenuQuestUtil {
public static void setEvent(final QuestEvent event0) {
SSubmenuQuestUtil.event = event0;
}
public static void setDraftEvent(final QuestEventDraft event0) {
SSubmenuQuestUtil.draftEvent = event0;
}
public static QuestEventDraft getDraftEvent() {
return draftEvent;
}
public static boolean checkActiveQuest(String location) {
QuestController qc = FModel.getQuest();

View File

@@ -0,0 +1,238 @@
package forge.screens.home.quest;
import java.awt.Font;
import javax.swing.JLabel;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;
import net.miginfocom.swing.MigLayout;
import forge.assets.FSkinProp;
import forge.gui.framework.DragCell;
import forge.gui.framework.DragTab;
import forge.gui.framework.EDocID;
import forge.screens.home.EMenuGroup;
import forge.screens.home.IVSubmenu;
import forge.screens.home.LblHeader;
import forge.screens.home.StartButton;
import forge.screens.home.VHomeUI;
import forge.toolbox.FLabel;
import forge.toolbox.FScrollPanel;
import forge.toolbox.FSkin;
/**
* Assembles Swing components of quest draft submenu singleton.
*
* <br><br><i>(V at beginning of class name denotes a view class.)</i>
*/
public enum VSubmenuQuestDraft implements IVSubmenu<CSubmenuQuestDraft> {
SINGLETON_INSTANCE;
protected static enum Mode {
SELECT_TOURNAMENT,
PREPARE_DECK,
TOURNAMENT_ACTIVE
}
private final DragTab tab = new DragTab("Tournaments");
private final LblHeader lblTitle = new LblHeader("Quest Mode: Draft Tournament");
private final FLabel lblCredits = new FLabel.Builder()
.icon(FSkin.getIcon(FSkinProp.ICO_QUEST_COINSTACK))
.iconScaleFactor(0.75)
.fontSize(13).build();
private final FScrollPanel pnlTournaments = new FScrollPanel(new MigLayout("insets 0, gap 0, wrap, ax center"), true,
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
private final JLabel lblInfo = new FLabel.Builder().text("Select a tournament to join:")
.fontStyle(Font.BOLD).fontSize(16)
.fontAlign(SwingConstants.LEFT).build();
private final StartButton btnStartDraft = new StartButton();
private final StartButton btnStartTournament = new StartButton();
private final StartButton btnStartMatch = new StartButton();
private final FLabel btnEditDeck = new FLabel.ButtonBuilder().text("Edit Deck").fontSize(24).build();
private final FLabel btnLeaveTournament = new FLabel.ButtonBuilder().text("Leave Tournament").fontSize(14).build();
private final JLabel lblsStandings[] = new JLabel[15];
private Mode mode = Mode.SELECT_TOURNAMENT;
private DragCell parentCell;
private VSubmenuQuestDraft() {
for (int i = 0; i < 15; i++) {
lblsStandings[i] = new FLabel.Builder().text("Standing Slot: " + i)
.fontStyle(Font.BOLD).fontSize(14)
.fontAlign(SwingConstants.LEFT).build();
}
}
public LblHeader getLblTitle() {
return lblTitle;
}
public FLabel getLblCredits() {
return lblCredits;
}
public FScrollPanel getPnlTournaments() {
return pnlTournaments;
}
public StartButton getBtnStartDraft() {
return btnStartDraft;
}
public StartButton getBtnStartTournament() {
return btnStartTournament;
}
public StartButton getBtnStartMatch() {
return btnStartMatch;
}
public FLabel getBtnEditDeck() {
return btnEditDeck;
}
public FLabel getBtnLeaveTournament() {
return btnLeaveTournament;
}
public JLabel[] getLblsStandings() {
return lblsStandings;
}
public void setMode(Mode mode) {
this.mode = mode;
}
public Mode getMode() {
return mode;
}
@Override
public EDocID getDocumentID() {
return EDocID.HOME_QUESTDRAFTS;
}
@Override
public DragTab getTabLabel() {
return tab;
}
@Override
public CSubmenuQuestDraft getLayoutControl() {
return CSubmenuQuestDraft.SINGLETON_INSTANCE;
}
@Override
public void setParentCell(DragCell cell0) {
this.parentCell = cell0;
}
@Override
public DragCell getParentCell() {
return parentCell;
}
@Override
public EMenuGroup getGroupEnum() {
return EMenuGroup.QUEST;
}
@Override
public String getMenuTitle() {
return "Tournaments";
}
@Override
public EDocID getItemEnum() {
return EDocID.HOME_QUESTDRAFTS;
}
@Override
public void populate() {
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().removeAll();
switch (mode) {
case SELECT_TOURNAMENT:
populateSelectTournament();
break;
case PREPARE_DECK:
populatePrepareDeck();
break;
case TOURNAMENT_ACTIVE:
populateTournamentActive();
break;
default:
break;
}
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().repaintSelf();
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().revalidate();
}
private void populateSelectTournament() {
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().setLayout(new MigLayout("insets 0, gap 0, ax right, wrap"));
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(lblTitle, "w 80%!, h 40px!, gap 0 0 15px 35px, ax right");
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(lblCredits, "h 25px!, gap 0 0 30px");
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(lblInfo, "h 30px!, gap 0 0 5px");
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(pnlTournaments, "w 95%, pushy, growy");
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(btnStartDraft, "gap 0 6% 30px 30px, ax center");
}
private void populatePrepareDeck() {
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().setLayout(new MigLayout("insets 0, gap 0, ax center, wrap"));
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(lblTitle, "w 80%!, h 40px!, gap 20% 0 15px 35px, ax right");
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(btnEditDeck, "w 150px, h 50px, gap 0 0 35% 0, ax center");
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(btnStartTournament, "gap 0 0 30px 0, ax center");
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(btnLeaveTournament, "w 100px, h 35px, gap 0 0 100px 0, ax center");
}
private void populateTournamentActive() {
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().setLayout(new MigLayout("insets 0, gap 0, ax center, wrap"));
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(lblTitle, "w 80%!, h 40px!, gap 20% 0 15px 35px, ax right");
FScrollPanel panel = new FScrollPanel(new MigLayout("insets 0, gap 0, wrap 4, ax center"), true,
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
String constraints = "w 200px!, h 30px!, ay center";
String groupingGap = ", gap 0 0 0 50px";
panel.add(lblsStandings[0], constraints);
panel.add(lblsStandings[8], constraints + ", span 1 2");
panel.add(lblsStandings[12], constraints + ", span 1 4");
panel.add(lblsStandings[14], constraints + ", span 1 8");
panel.add(lblsStandings[1], constraints + groupingGap);
panel.add(lblsStandings[2], constraints);
panel.add(lblsStandings[9], constraints + ", span 1 2");
panel.add(lblsStandings[3], constraints + groupingGap);
panel.add(lblsStandings[4], constraints);
panel.add(lblsStandings[10], constraints + ", span 1 2");
panel.add(lblsStandings[13], constraints + ", span 1 4");
panel.add(lblsStandings[5], constraints + groupingGap);
panel.add(lblsStandings[6], constraints);
panel.add(lblsStandings[11], constraints + ", span 1 2");
panel.add(lblsStandings[7], constraints);
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(panel, "gap 0 0 30px 0, ax center");
/*for (JLabel label : lblsStandings) {
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(label, "h 30px!, gap 0 0 5px");
}*/
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(btnStartMatch, "gap 0 0 30px 0, ax center");
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(btnLeaveTournament, "w 120px, h 35px, gap 0 0 100px 0, ax center");
}
}

View File

@@ -0,0 +1,151 @@
/** Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.screens.match;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import forge.GuiBase;
import forge.LobbyPlayer;
import forge.Singletons;
import forge.game.Game;
import forge.game.player.Player;
import forge.gui.SOverlayUtils;
import forge.gui.framework.FScreen;
import forge.model.FModel;
import forge.quest.QuestController;
import forge.screens.home.quest.CSubmenuChallenges;
import forge.screens.home.quest.CSubmenuDuels;
import forge.screens.home.quest.CSubmenuQuestDraft;
import forge.screens.home.quest.QuestDraftUtils;
import forge.screens.home.quest.VSubmenuQuestDraft;
/**
* <p>
* QuestWinLose.
* </p>
* Processes win/lose presentation for Quest events. This presentation is
* displayed by WinLoseFrame. Components to be added to pnlCustom in
* WinLoseFrame should use MigLayout.
*
*/
public class QuestDraftWinLose extends ControlWinLose {
private final transient ViewWinLose view;
private final transient QuestController qData;
/**
* Instantiates a new quest win lose handler.
*
* @param view0 ViewWinLose object
* @param match2
*/
public QuestDraftWinLose(final ViewWinLose view0, Game lastGame) {
super(view0, lastGame);
this.view = view0;
qData = FModel.getQuest();
}
/**
* <p>
* populateCustomPanel.
* </p>
* Checks conditions of win and fires various reward display methods
* accordingly.
*
* @return true, if successful
*/
@Override
public final boolean populateCustomPanel() {
QuestController quest = FModel.getQuest();
final LobbyPlayer questLobbyPlayer = GuiBase.getInterface().getQuestPlayer();
List<Player> players = lastGame.getRegisteredPlayers();
boolean gameHadHumanPlayer = false;
for (Player p : players) {
if (p.getLobbyPlayer().equals(questLobbyPlayer)) {
gameHadHumanPlayer = true;
break;
}
}
if (lastGame.getMatch().isMatchOver()) {
String winner = lastGame.getOutcome().getWinningPlayer().getName();
quest.getAchievements().getCurrentDraft().setWinner(winner);
quest.save();
}
if (!gameHadHumanPlayer) {
if (lastGame.getMatch().isMatchOver()) {
this.actionOnQuitMatch();
QuestDraftUtils.matchInProgress = false;
QuestDraftUtils.update();
} else {
this.actionOnContinue();
QuestDraftUtils.update();
}
return false;
}
view.getBtnRestart().setEnabled(false);
if (lastGame.getMatch().isMatchOver()) {
view.getBtnContinue().setEnabled(false);
//TODO Add match quit to quit button listeners before match is officially over
view.getBtnQuit().addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
QuestDraftUtils.matchInProgress = false;
QuestDraftUtils.continueMatches();
}
});
} else {
view.getBtnQuit().setEnabled(false);
}
CSubmenuQuestDraft.SINGLETON_INSTANCE.update();
VSubmenuQuestDraft.SINGLETON_INSTANCE.populate();
return false; //We're not awarding anything, so never display the custom panel.
}
public final void actionOnQuitMatch() {
CSubmenuDuels.SINGLETON_INSTANCE.update();
CSubmenuChallenges.SINGLETON_INSTANCE.update();
qData.setCurrentEvent(null);
qData.save();
FModel.getQuestPreferences().save();
Singletons.getControl().writeMatchPreferences();
Singletons.getControl().endCurrentGame();
Singletons.getControl().setCurrentScreen(FScreen.HOME_SCREEN);
SOverlayUtils.hideOverlay();
}
}

View File

@@ -1,18 +1,32 @@
package forge.screens.match;
import java.awt.Color;
import java.awt.Font;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import net.miginfocom.swing.MigLayout;
import forge.UiCommand;
import forge.game.*;
import forge.game.Game;
import forge.game.GameLog;
import forge.game.GameLogEntry;
import forge.game.GameLogEntryType;
import forge.game.GameOutcome;
import forge.game.player.Player;
import forge.model.FModel;
import forge.toolbox.*;
import forge.toolbox.FButton;
import forge.toolbox.FLabel;
import forge.toolbox.FOverlay;
import forge.toolbox.FScrollPane;
import forge.toolbox.FSkin;
import forge.toolbox.FSkin.SkinnedLabel;
import forge.toolbox.FSkin.SkinnedPanel;
import net.miginfocom.swing.MigLayout;
import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.StringSelection;
import forge.toolbox.FTextArea;
public class ViewWinLose {
@@ -24,7 +38,7 @@ public class ViewWinLose {
private final JPanel pnlOutcomes = new JPanel(new MigLayout("wrap, align center"));
private final Game game;
@SuppressWarnings("serial")
public ViewWinLose(final Game game0) {
@@ -48,6 +62,9 @@ public class ViewWinLose {
case Quest:
control = new QuestWinLose(this, game0);
break;
case QuestDraft:
control = new QuestDraftWinLose(this, game0);
break;
case Draft:
if (!FModel.getGauntletMini().isGauntletDraft()) {
break;

View File

@@ -19,8 +19,6 @@ package forge.view.arcane;
import forge.FThreads;
import forge.game.card.Card;
import forge.model.FModel;
import forge.properties.ForgePreferences.FPref;
import forge.screens.match.CMatchUI;
import forge.screens.match.controllers.CPrompt;
import forge.toolbox.FScrollPane;
@@ -58,7 +56,7 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen
/** Constant <code>STACK_SPACING_Y=0.07f</code>. */
private static final float STACK_SPACING_Y = 0.07f;
private final int creatureStackMax = 4;
//private final int creatureStackMax = 4;
private final int landStackMax = 5;
private final int tokenStackMax = 5;
private final int othersStackMax = 4;
@@ -186,7 +184,7 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen
return allTokens;
}
private final CardStackRow collectAllCreatures() {
/*private final CardStackRow collectAllCreatures() {
final CardStackRow allCreatures = new CardStackRow();
outerLoop:
//
@@ -236,7 +234,7 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen
allCreatures.add(insertIndex == -1 ? allCreatures.size() : insertIndex, stack);
}
return allCreatures;
}
}*/
@Override
public final CardPanel addCard(final Card card) {