diff --git a/.gitattributes b/.gitattributes
index 1637a9d18f9..3cb0c604c21 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -12744,6 +12744,7 @@ src/main/java/forge/gui/framework/SLayoutIO.java -text
src/main/java/forge/gui/framework/SOverflowUtil.java -text
src/main/java/forge/gui/framework/SRearrangingUtil.java -text
src/main/java/forge/gui/framework/SResizingUtil.java -text
+src/main/java/forge/gui/framework/VEmptyDoc.java -text
src/main/java/forge/gui/framework/package-info.java svneol=native#text/plain
src/main/java/forge/gui/home/CMainMenu.java -text
src/main/java/forge/gui/home/EMenuGroup.java -text
@@ -12762,6 +12763,8 @@ src/main/java/forge/gui/home/gauntlet/VSubmenuGauntletBuild.java -text
src/main/java/forge/gui/home/gauntlet/VSubmenuGauntletContests.java -text
src/main/java/forge/gui/home/gauntlet/VSubmenuGauntletLoad.java -text
src/main/java/forge/gui/home/gauntlet/VSubmenuGauntletQuick.java -text
+src/main/java/forge/gui/home/multiplayer/CSubmenuMultiTest.java -text
+src/main/java/forge/gui/home/multiplayer/VSubmenuMultiTest.java -text
src/main/java/forge/gui/home/package-info.java svneol=native#text/plain
src/main/java/forge/gui/home/quest/CSubmenuChallenges.java -text
src/main/java/forge/gui/home/quest/CSubmenuDuels.java -text
@@ -12818,6 +12821,7 @@ src/main/java/forge/gui/match/controllers/CPicture.java -text
src/main/java/forge/gui/match/controllers/CPlayers.java -text
src/main/java/forge/gui/match/controllers/CStack.java -text
src/main/java/forge/gui/match/controllers/package-info.java svneol=native#text/plain
+src/main/java/forge/gui/match/nonsingleton/CEmptyDoc.java -text
src/main/java/forge/gui/match/nonsingleton/CField.java -text
src/main/java/forge/gui/match/nonsingleton/CHand.java -text
src/main/java/forge/gui/match/nonsingleton/VField.java -text
diff --git a/res/layouts/home_default.xml b/res/layouts/home_default.xml
index 86576748184..2a661eed3dd 100644
--- a/res/layouts/home_default.xml
+++ b/res/layouts/home_default.xml
@@ -17,6 +17,7 @@
HOME_GAUNTLETLOAD
HOME_GAUNTLETQUICK
HOME_GAUNTLETCONTESTS
+ HOME_MULTITEST
HOME_CONSTRUCTED
HOME_DRAFT
HOME_SEALED
diff --git a/res/layouts/match_default.xml b/res/layouts/match_default.xml
index d35f7bbd47d..95a9086682e 100644
--- a/res/layouts/match_default.xml
+++ b/res/layouts/match_default.xml
@@ -13,16 +13,16 @@
BUTTON_DOCK
|
- FIELD_0
+ FIELD_1
|
- HAND_1
+ HAND_0
|
CARD_DETAIL
|
- FIELD_1
+ FIELD_0
|
CARD_PICTURE
diff --git a/src/main/java/forge/control/FControl.java b/src/main/java/forge/control/FControl.java
index 4df71907c3b..75e4e4472d7 100644
--- a/src/main/java/forge/control/FControl.java
+++ b/src/main/java/forge/control/FControl.java
@@ -270,7 +270,8 @@ public enum FControl {
children = display.getComponentsInLayer(JLayeredPane.MODAL_LAYER);
if (children.length != 0) { children[0].setSize(display.getSize()); }
}
-
+
+ /** @return {@link forge.game.player.Player} */
public Player getPlayer() {
return AllZone.getHumanPlayer();
}
diff --git a/src/main/java/forge/game/GameNew.java b/src/main/java/forge/game/GameNew.java
index 43e626957f1..17bde73e024 100644
--- a/src/main/java/forge/game/GameNew.java
+++ b/src/main/java/forge/game/GameNew.java
@@ -62,7 +62,8 @@ public class GameNew {
newGameCleanup();
newMatchCleanup();
-
+
+ Singletons.getModel().getPreferences().actuateMatchPreferences();
Card.resetUniqueNumber();
for( PlayerStartsGame p : players ) {
@@ -284,9 +285,9 @@ public class GameNew {
private static void newMatchCleanup() {
if (Singletons.getModel().getMatchState().getGamesPlayedCount() != 0) { return; }
-
// TODO restore this functionality!!!
//VMatchUI.SINGLETON_INSTANCE.getViewDevMode().getDocument().setVisible(Preferences.DEV_MODE);
+
final List allFields = VMatchUI.SINGLETON_INSTANCE.getFieldViews();
for (final VField field : allFields) {
@@ -297,8 +298,6 @@ public class GameNew {
VAntes.SINGLETON_INSTANCE.clearAnteCards();
AllZone.getInputControl().resetInput();
Singletons.getModel().getMatchState().reset();
-
- Singletons.getModel().getPreferences().actuateMatchPreferences();
}
// this is where the computer cheats
diff --git a/src/main/java/forge/game/phase/PhaseUtil.java b/src/main/java/forge/game/phase/PhaseUtil.java
index 2ba259d76c1..eff33e64888 100644
--- a/src/main/java/forge/game/phase/PhaseUtil.java
+++ b/src/main/java/forge/game/phase/PhaseUtil.java
@@ -26,7 +26,6 @@ import com.google.common.base.Predicate;
import forge.AllZone;
import forge.AllZoneUtil;
import forge.Card;
-
import forge.CardLists;
import forge.CardPredicates.Presets;
import forge.Singletons;
@@ -426,8 +425,8 @@ public class PhaseUtil {
final Player p = Singletons.getModel().getGameState().getPhaseHandler().getPlayerTurn();
final CMatchUI t = CMatchUI.SINGLETON_INSTANCE;
- // Index of field; computer is 0, human is 1
- int i = p.isComputer() ? 0 : 1;
+ // Index of field; computer is 1, human is 0
+ int i = p.isComputer() ? 1 : 0;
switch(s) {
case UPKEEP:
diff --git a/src/main/java/forge/game/player/ComputerUtil.java b/src/main/java/forge/game/player/ComputerUtil.java
index 98e92c010bc..17892cb68f3 100644
--- a/src/main/java/forge/game/player/ComputerUtil.java
+++ b/src/main/java/forge/game/player/ComputerUtil.java
@@ -30,7 +30,6 @@ import com.google.common.collect.Iterables;
import forge.AllZone;
import forge.AllZoneUtil;
import forge.Card;
-
import forge.CardLists;
import forge.CardPredicates;
import forge.CardPredicates.Presets;
diff --git a/src/main/java/forge/gui/framework/DragCell.java b/src/main/java/forge/gui/framework/DragCell.java
index 1300f8ced75..c090d2e47c4 100644
--- a/src/main/java/forge/gui/framework/DragCell.java
+++ b/src/main/java/forge/gui/framework/DragCell.java
@@ -271,6 +271,7 @@ public final class DragCell extends JPanel implements ILocalRepaint {
/** Adds a document to the tabs.
* @param doc0 {@link forge.gui.framework.IVDoc} */
public void addDoc(final IVDoc doc0) {
+ if (doc0 instanceof VEmptyDoc) { return; }
allDocs.add(doc0);
doc0.setParentCell(this);
pnlHead.add(doc0.getTabLabel(), "h 100%!, gap " + tabPaddingPx + "px " + tabPaddingPx + "px 0 0", allDocs.size() - 1);
diff --git a/src/main/java/forge/gui/framework/EDocID.java b/src/main/java/forge/gui/framework/EDocID.java
index 58de37e3b9b..4a3f78a237c 100644
--- a/src/main/java/forge/gui/framework/EDocID.java
+++ b/src/main/java/forge/gui/framework/EDocID.java
@@ -16,6 +16,7 @@ import forge.gui.home.gauntlet.VSubmenuGauntletBuild;
import forge.gui.home.gauntlet.VSubmenuGauntletContests;
import forge.gui.home.gauntlet.VSubmenuGauntletLoad;
import forge.gui.home.gauntlet.VSubmenuGauntletQuick;
+import forge.gui.home.multiplayer.VSubmenuMultiTest;
import forge.gui.home.quest.VSubmenuChallenges;
import forge.gui.home.quest.VSubmenuDuels;
import forge.gui.home.quest.VSubmenuQuestData;
@@ -69,6 +70,7 @@ public enum EDocID { /** */
HOME_GAUNTLETLOAD (VSubmenuGauntletLoad.SINGLETON_INSTANCE), /** */
HOME_GAUNTLETQUICK (VSubmenuGauntletQuick.SINGLETON_INSTANCE), /** */
HOME_GAUNTLETCONTESTS (VSubmenuGauntletContests.SINGLETON_INSTANCE), /** */
+ HOME_MULTITEST (VSubmenuMultiTest.SINGLETON_INSTANCE), /** */
HOME_PREFERENCES (VSubmenuPreferences.SINGLETON_INSTANCE), /** */
HOME_AVATARS (VSubmenuAvatars.SINGLETON_INSTANCE), /** */
HOME_DECKEDITOR (VSubmenuDeckEditor.SINGLETON_INSTANCE), /** */
@@ -91,10 +93,18 @@ public enum EDocID { /** */
// Non-user battlefields (AI or teammate), use setDoc to register.
FIELD_0 (null), /** */
FIELD_1 (null), /** */
+ FIELD_2 (null), /** */
+ FIELD_3 (null), /** */
+ FIELD_4 (null), /** */
+ FIELD_5 (null), /** */
+ FIELD_6 (null), /** */
+ FIELD_7 (null), /** */
// Non-user hands (AI or teammate), use setDoc to register.
HAND_0 (null), /** */
- HAND_1 (null);
+ HAND_1 (null), /** */
+ HAND_2 (null), /** */
+ HAND_3 (null);
// End enum declarations, start enum methods.
private IVDoc vDoc;
diff --git a/src/main/java/forge/gui/framework/VEmptyDoc.java b/src/main/java/forge/gui/framework/VEmptyDoc.java
new file mode 100644
index 00000000000..c91a0cc25c0
--- /dev/null
+++ b/src/main/java/forge/gui/framework/VEmptyDoc.java
@@ -0,0 +1,71 @@
+package forge.gui.framework;
+
+import forge.gui.match.nonsingleton.CEmptyDoc;
+
+/**
+ * An intentionally empty IVDoc to fill field slots unused
+ * by the current layout of a match UI.
+ */
+public class VEmptyDoc implements IVDoc {
+ // Fields used with interface IVDoc
+ private final CEmptyDoc control;
+ private final EDocID docID;
+
+ /**
+ * An intentionally empty IVDoc to fill field slots unused
+ * by the current layout of a match UI.
+ *
+ * @param id0 EDocID
+ */
+ public VEmptyDoc(final EDocID id0) {
+ id0.setDoc(this);
+ docID = id0;
+ control = new CEmptyDoc();
+ }
+
+ /* (non-Javadoc)
+ * @see forge.gui.framework.IVDoc#getDocumentID()
+ */
+ @Override
+ public EDocID getDocumentID() {
+ return docID;
+ }
+
+ /* (non-Javadoc)
+ * @see forge.gui.framework.IVDoc#getTabLabel()
+ */
+ @Override
+ public DragTab getTabLabel() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see forge.gui.framework.IVDoc#getLayoutControl()
+ */
+ @Override
+ public ICDoc getLayoutControl() {
+ return control;
+ }
+
+ /* (non-Javadoc)
+ * @see forge.gui.framework.IVDoc#setParentCell(forge.gui.framework.DragCell)
+ */
+ @Override
+ public void setParentCell(DragCell cell0) {
+ }
+
+ /* (non-Javadoc)
+ * @see forge.gui.framework.IVDoc#getParentCell()
+ */
+ @Override
+ public DragCell getParentCell() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see forge.gui.framework.IVDoc#populate()
+ */
+ @Override
+ public void populate() {
+ }
+}
diff --git a/src/main/java/forge/gui/home/EMenuGroup.java b/src/main/java/forge/gui/home/EMenuGroup.java
index e4c975478bd..fbadccc873a 100644
--- a/src/main/java/forge/gui/home/EMenuGroup.java
+++ b/src/main/java/forge/gui/home/EMenuGroup.java
@@ -11,6 +11,7 @@ public enum EMenuGroup { /** */
SANCTIONED ("Sanctioned Game Formats"), /** */
QUEST ("Quest Mode"), /** */
GAUNTLET ("Gauntlets"), /** */
+ MULTIPLAYER ("Multiplayer"), /** */
SETTINGS ("Game Settings"), /** */
UTILITIES ("Tools");
diff --git a/src/main/java/forge/gui/home/VMainMenu.java b/src/main/java/forge/gui/home/VMainMenu.java
index e114a4fbd0b..76f52ae006a 100644
--- a/src/main/java/forge/gui/home/VMainMenu.java
+++ b/src/main/java/forge/gui/home/VMainMenu.java
@@ -46,6 +46,7 @@ import forge.gui.home.gauntlet.VSubmenuGauntletBuild;
import forge.gui.home.gauntlet.VSubmenuGauntletContests;
import forge.gui.home.gauntlet.VSubmenuGauntletLoad;
import forge.gui.home.gauntlet.VSubmenuGauntletQuick;
+import forge.gui.home.multiplayer.VSubmenuMultiTest;
import forge.gui.home.quest.VSubmenuChallenges;
import forge.gui.home.quest.VSubmenuDuels;
import forge.gui.home.quest.VSubmenuQuestData;
@@ -109,6 +110,8 @@ public enum VMainMenu implements IVDoc {
allSubmenus.add(VSubmenuGauntletLoad.SINGLETON_INSTANCE);
allSubmenus.add(VSubmenuGauntletContests.SINGLETON_INSTANCE);
+ allSubmenus.add(VSubmenuMultiTest.SINGLETON_INSTANCE);
+
allSubmenus.add(VSubmenuPreferences.SINGLETON_INSTANCE);
allSubmenus.add(VSubmenuAvatars.SINGLETON_INSTANCE);
diff --git a/src/main/java/forge/gui/home/multiplayer/CSubmenuMultiTest.java b/src/main/java/forge/gui/home/multiplayer/CSubmenuMultiTest.java
new file mode 100644
index 00000000000..905b339f0bd
--- /dev/null
+++ b/src/main/java/forge/gui/home/multiplayer/CSubmenuMultiTest.java
@@ -0,0 +1,112 @@
+package forge.gui.home.multiplayer;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JRadioButton;
+import javax.swing.SwingUtilities;
+import javax.swing.SwingWorker;
+
+import forge.AllZone;
+import forge.Command;
+import forge.Singletons;
+import forge.deck.Deck;
+import forge.deck.DeckgenUtil;
+import forge.game.GameNew;
+import forge.game.GameType;
+import forge.game.PlayerStartsGame;
+import forge.game.player.PlayerType;
+import forge.gui.SOverlayUtils;
+import forge.gui.framework.ICDoc;
+import forge.gui.match.CMatchUI;
+
+/**
+ * Controls the deck editor submenu option in the home UI.
+ *
+ *
(C at beginning of class name denotes a control class.)
+ *
+ */
+public enum CSubmenuMultiTest implements ICDoc {
+ /** */
+ SINGLETON_INSTANCE;
+
+ private final VSubmenuMultiTest view = VSubmenuMultiTest.SINGLETON_INSTANCE;
+
+ /* (non-Javadoc)
+ * @see forge.control.home.IControlSubmenu#update()
+ */
+ @Override
+ public void initialize() {
+ // Checkbox event handling
+ view.getBtnStart().addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(final ActionEvent arg0) {
+ start();
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see forge.control.home.IControlSubmenu#update()
+ */
+ @Override
+ public void update() { }
+
+ /* (non-Javadoc)
+ * @see forge.gui.framework.ICDoc#getCommandOnSelect()
+ */
+ @Override
+ public Command getCommandOnSelect() {
+ return null;
+ }
+
+ private void start() {
+ // Retrieve selections
+ JRadioButton radTemp = null;
+ final int numFields;
+ final int numHands;
+
+ for (JRadioButton rad : view.getFieldRadios()) {
+ if (rad.isSelected()) { radTemp = rad; break; } }
+
+ numFields = (radTemp == null ? 2 : Integer.valueOf(radTemp.getText()));
+
+ radTemp = null;
+ for (JRadioButton rad : view.getHandRadios()) {
+ if (rad.isSelected()) { radTemp = rad; break; } }
+
+ numHands = (radTemp == null ? 1 : Integer.valueOf(radTemp.getText()));
+
+ // Boilerplate start game code
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ SOverlayUtils.startGameOverlay();
+ SOverlayUtils.showOverlay();
+ }
+ });
+
+ final SwingWorker |