diff --git a/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java b/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java
index 7fa024953db..2e41a985139 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java
@@ -378,7 +378,7 @@ public class NewTableDialog extends MageDialog {
private void btnOKActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnOKActionPerformed
GameTypeView gameType = (GameTypeView) cbGameType.getSelectedItem();
- MatchOptions options = new MatchOptions(this.txtName.getText(), gameType.getName());
+ MatchOptions options = new MatchOptions(this.txtName.getText(), gameType.getName(), false, 2);
options.getPlayerTypes().add("Human");
for (TablePlayerPanel player : players) {
options.getPlayerTypes().add(player.getPlayerType());
diff --git a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.form b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.form
index bcce7a2ac50..9268a0ec612 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.form
+++ b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.form
@@ -29,11 +29,8 @@
-
-
-
-
-
+
+
@@ -175,6 +172,7 @@
+
@@ -191,7 +189,12 @@
-
+
+
+
+
+
+
@@ -200,6 +203,7 @@
+
@@ -377,17 +381,19 @@
-
-
-
-
-
+
+
-
+
+
+
+
+
+
diff --git a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java
index 6ad35039fb0..90cc1b2bd37 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java
@@ -170,6 +170,8 @@ public class NewTournamentDialog extends MageDialog {
pnlPacks = new javax.swing.JPanel();
lblNbrPlayers = new javax.swing.JLabel();
spnNumPlayers = new javax.swing.JSpinner();
+ lblNbrSeats = new javax.swing.JLabel();
+ spnNumSeats = new javax.swing.JSpinner();
pnlDraftOptions = new javax.swing.JPanel();
jLabel6 = new javax.swing.JLabel();
cbDraftTiming = new javax.swing.JComboBox();
@@ -277,6 +279,14 @@ public class NewTournamentDialog extends MageDialog {
}
});
+ lblNbrSeats.setText("Seats:");
+
+ spnNumSeats.addChangeListener(new javax.swing.event.ChangeListener() {
+ public void stateChanged(javax.swing.event.ChangeEvent evt) {
+ spnNumSeatsStateChanged(evt);
+ }
+ });
+
jLabel6.setText("Timing:");
cbDraftTiming.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
@@ -358,6 +368,8 @@ public class NewTournamentDialog extends MageDialog {
lblQuitRatio.setText("Allowed quit %:");
spnQuitRatio.setToolTipText("Players with quit % more than this value can't join this table");
+ spnNumSeats.setToolTipText("The number of seats for each duel. If more than 2, will set number of wins to 1");
+ spnNumPlayers.setToolTipText("The total number of players who will draft");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
@@ -373,7 +385,11 @@ public class NewTournamentDialog extends MageDialog {
.addGroup(layout.createSequentialGroup()
.addComponent(lblNbrPlayers)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(spnNumPlayers, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addComponent(spnNumPlayers, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(lblNbrSeats)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(spnNumSeats, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(lblPacks)
.addComponent(lblPlayer1))
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@@ -504,6 +520,8 @@ public class NewTournamentDialog extends MageDialog {
.addComponent(lblNumRounds))
.addComponent(lblNbrPlayers, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(spnNumPlayers)
+ .addComponent(lblNbrSeats, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(spnNumSeats)
.addComponent(pnlDraftOptions, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(lblPlayer1, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE))
@@ -533,7 +551,8 @@ public class NewTournamentDialog extends MageDialog {
private void btnOkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnOkActionPerformed
TournamentTypeView tournamentType = (TournamentTypeView) cbTournamentType.getSelectedItem();
- TournamentOptions tOptions = new TournamentOptions(this.txtName.getText());
+ int numSeats = (Integer)this.spnNumSeats.getValue();
+ TournamentOptions tOptions = new TournamentOptions(this.txtName.getText(), "", numSeats);
tOptions.setTournamentType(tournamentType.getName());
tOptions.setPassword(txtPassword.getText());
tOptions.getPlayerTypes().add("Human");
@@ -653,13 +672,51 @@ public class NewTournamentDialog extends MageDialog {
this.hideDialog();
}//GEN-LAST:event_btnCancelActionPerformed
+ private void updateNumSeats() {
+ int numPlayers = (Integer)this.spnNumPlayers.getValue();
+ int numSeats = (Integer)this.spnNumSeats.getValue();
+
+ if (numSeats > 2) {
+ TournamentTypeView tournamentType = (TournamentTypeView) cbTournamentType.getSelectedItem();
+ if (numSeats >= tournamentType.getMinPlayers()) {
+ createPlayers(numSeats - 1);
+ spnNumPlayers.setValue(numSeats);
+ } else {
+ numSeats = tournamentType.getMinPlayers();
+ createPlayers(numSeats - 1);
+ spnNumPlayers.setValue(numSeats);
+ spnNumSeats.setValue(numSeats);
+ }
+ spnNumWins.setValue(1);
+ }
+ }
+
private void spnNumPlayersStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spnNumPlayersStateChanged
- int numPlayers = (Integer)this.spnNumPlayers.getValue() - 1;
- createPlayers(numPlayers);
+ int numPlayers = (Integer)this.spnNumPlayers.getValue();
+ createPlayers(numPlayers - 1);
+ int numSeats = (Integer)this.spnNumSeats.getValue();
+ if (numSeats > 2 && numPlayers != numSeats) {
+ updateNumSeats();
+ }
}//GEN-LAST:event_spnNumPlayersStateChanged
+ private void spnNumSeatsStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spnNumSeatsStateChanged
+ int numSeats = (Integer)this.spnNumSeats.getValue();
+ if (numSeats > 2) {
+ this.spnNumPlayers.setEnabled(false);
+ } else {
+ this.spnNumPlayers.setEnabled(true);
+ }
+ updateNumSeats();
+ }//GEN-LAST:event_spnNumSeatsStateChanged
+
+
private void spnNumWinsnumPlayersChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spnNumWinsnumPlayersChanged
- // TODO add your handling code here:
+ int numSeats = (Integer)this.spnNumSeats.getValue();
+ int numWins = (Integer)this.spnNumSeats.getValue();
+ if (numSeats > 2) {
+ spnNumWins.setValue(1);
+ }
}//GEN-LAST:event_spnNumWinsnumPlayersChanged
private JFileChooser fcSelectDeck = null;
@@ -726,6 +783,8 @@ public class NewTournamentDialog extends MageDialog {
this.spnNumPlayers.setEnabled(tournamentType.getMinPlayers() != tournamentType.getMaxPlayers());
createPlayers((Integer) spnNumPlayers.getValue() - 1);
+ this.spnNumSeats.setModel(new SpinnerNumberModel(2, 2, tournamentType.getMaxPlayers(), 1));
+
if (tournamentType.isLimited()) {
this.isRandom = tournamentType.isRandom();
this.isRichMan = tournamentType.isRichMan();
@@ -914,6 +973,8 @@ public class NewTournamentDialog extends MageDialog {
}
+
+
private void drawPlayers() {
this.pnlOtherPlayers.removeAll();
for (TournamentPlayerPanel panel: players) {
@@ -1119,6 +1180,7 @@ public class NewTournamentDialog extends MageDialog {
private javax.swing.JLabel lblGameType;
private javax.swing.JLabel lblName;
private javax.swing.JLabel lblNbrPlayers;
+ private javax.swing.JLabel lblNbrSeats;
private javax.swing.JLabel lblNumRounds;
private javax.swing.JLabel lblNumWins;
private javax.swing.JLabel lblPacks;
@@ -1135,6 +1197,7 @@ public class NewTournamentDialog extends MageDialog {
private javax.swing.JSpinner spnConstructTime;
private javax.swing.JSpinner spnFreeMulligans;
private javax.swing.JSpinner spnNumPlayers;
+ private javax.swing.JSpinner spnNumSeats;
private javax.swing.JSpinner spnNumRounds;
private javax.swing.JSpinner spnNumWins;
private javax.swing.JSpinner spnQuitRatio;
diff --git a/Mage.Client/src/main/java/mage/client/table/TablesPanel.java b/Mage.Client/src/main/java/mage/client/table/TablesPanel.java
index 253a3e08cc4..b0df188e1a2 100644
--- a/Mage.Client/src/main/java/mage/client/table/TablesPanel.java
+++ b/Mage.Client/src/main/java/mage/client/table/TablesPanel.java
@@ -1272,7 +1272,7 @@ public class TablesPanel extends javax.swing.JPanel {
return;
}
- MatchOptions options = new MatchOptions("1", "Two Player Duel");
+ MatchOptions options = new MatchOptions("1", "Two Player Duel", false, 2);
options.getPlayerTypes().add("Human");
options.getPlayerTypes().add("Computer - mad");
options.setDeckType("Limited");
diff --git a/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java b/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java
index 0d69cf257a7..c18b777224e 100644
--- a/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java
+++ b/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java
@@ -43,6 +43,7 @@ import mage.game.events.TableEvent;
import mage.game.match.Match;
import mage.game.match.MatchOptions;
import mage.game.result.ResultProtos.TourneyQuitStatus;
+import mage.game.tournament.MultiplayerRound;
import mage.game.tournament.Tournament;
import mage.game.tournament.TournamentPairing;
import mage.game.tournament.TournamentPlayer;
@@ -114,6 +115,19 @@ public class TournamentController {
startMatch(event.getPair(), event.getMatchOptions());
}
break;
+ case START_MULTIPLAYER_MATCH:
+ if (!isAbort()) {
+ initTournament(); // set state
+ MatchOptions matchOptions = event.getMatchOptions();
+ if (matchOptions != null && event.getMultiplayerRound() != null) {
+ for (TournamentPlayer player : event.getMultiplayerRound().getAllPlayers()) {
+ matchOptions.getPlayerTypes().add(player.getPlayerType());
+ }
+ }
+
+ startMultiplayerMatch(event.getMultiplayerRound(), event.getMatchOptions());
+ }
+ break;
case END:
endTournament();
break;
@@ -264,6 +278,31 @@ public class TournamentController {
logger.fatal("TournamentController startMatch error", ex);
}
}
+
+ private void startMultiplayerMatch(MultiplayerRound round, MatchOptions matchOptions) {
+ try {
+ TableManager tableManager = TableManager.getInstance();
+ Table table = tableManager.createTable(GamesRoomManager.getInstance().getMainRoomId(), matchOptions);
+ table.setTournamentSubTable(true);
+ table.setTournament(tournament);
+ table.setState(TableState.WAITING);
+
+ for (TournamentPlayer player : round.getAllPlayers()) {
+ tableManager.addPlayer(getPlayerUserId(player.getPlayer().getId()), table.getId(), player.getPlayer(), player.getPlayerType(), player.getDeck());
+ }
+ table.setState(TableState.STARTING);
+ tableManager.startTournamentSubMatch(null, table.getId());
+ Match match = tableManager.getMatch(table.getId());
+ match.setTableId(tableId);
+ round.setMatch(match);
+ round.setTableId(table.getId());
+ for (TournamentPlayer player : round.getAllPlayers()) {
+ player.setState(TournamentPlayerState.DUELING);
+ }
+ } catch (GameException ex) {
+ logger.fatal("TournamentController startMatch error", ex);
+ }
+ }
private void startDraft(Draft draft) {
TableManager.getInstance().startDraft(tableId, draft);
diff --git a/Mage/src/main/java/mage/game/events/TableEvent.java b/Mage/src/main/java/mage/game/events/TableEvent.java
index f6409b770d9..2af79d52bb4 100644
--- a/Mage/src/main/java/mage/game/events/TableEvent.java
+++ b/Mage/src/main/java/mage/game/events/TableEvent.java
@@ -36,6 +36,7 @@ import mage.cards.decks.Deck;
import mage.game.Game;
import mage.game.draft.Draft;
import mage.game.match.MatchOptions;
+import mage.game.tournament.MultiplayerRound;
import mage.game.tournament.TournamentPairing;
/**
@@ -46,7 +47,7 @@ public class TableEvent extends EventObject implements ExternalEvent, Serializab
public enum EventType {
UPDATE, INFO, STATUS, START_DRAFT, START_MATCH, SIDEBOARD, CONSTRUCT, SUBMIT_DECK, END, END_GAME_INFO, ERROR,
- INIT_TIMER, RESUME_TIMER, PAUSE_TIMER, CHECK_STATE_PLAYERS
+ INIT_TIMER, RESUME_TIMER, PAUSE_TIMER, CHECK_STATE_PLAYERS, START_MULTIPLAYER_MATCH
}
private Game game;
@@ -58,6 +59,7 @@ public class TableEvent extends EventObject implements ExternalEvent, Serializab
private UUID playerId;
private Deck deck;
private TournamentPairing pair;
+ private MultiplayerRound round;
private MatchOptions options;
private int timeout;
private boolean withTime;
@@ -115,6 +117,13 @@ public class TableEvent extends EventObject implements ExternalEvent, Serializab
this.options = options;
this.eventType = eventType;
}
+
+ public TableEvent(EventType eventType, MultiplayerRound round, MatchOptions options) {
+ super(options);
+ this.round = round;
+ this.options = options;
+ this.eventType = eventType;
+ }
public Game getGame() {
return game;
@@ -151,6 +160,10 @@ public class TableEvent extends EventObject implements ExternalEvent, Serializab
public TournamentPairing getPair() {
return pair;
}
+
+ public MultiplayerRound getMultiplayerRound() {
+ return round;
+ }
public MatchOptions getMatchOptions() {
return options;
diff --git a/Mage/src/main/java/mage/game/events/TableEventSource.java b/Mage/src/main/java/mage/game/events/TableEventSource.java
index 3e3f1faee87..af2657bec0b 100644
--- a/Mage/src/main/java/mage/game/events/TableEventSource.java
+++ b/Mage/src/main/java/mage/game/events/TableEventSource.java
@@ -38,6 +38,7 @@ import mage.game.tournament.TournamentPairing;
import java.io.Serializable;
import java.util.UUID;
+import mage.game.tournament.MultiplayerRound;
/**
*
@@ -93,4 +94,8 @@ public class TableEventSource implements EventSource, Serializable {
public void fireTableEvent(EventType eventType, TournamentPairing pair, MatchOptions options) {
dispatcher.fireEvent(new TableEvent(eventType, pair, options));
}
+
+ public void fireTableEvent(EventType eventType, MultiplayerRound round, MatchOptions options) {
+ dispatcher.fireEvent(new TableEvent(eventType, round, options));
+ }
}
diff --git a/Mage/src/main/java/mage/game/match/MatchOptions.java b/Mage/src/main/java/mage/game/match/MatchOptions.java
index 930f88555fc..37901b91bea 100644
--- a/Mage/src/main/java/mage/game/match/MatchOptions.java
+++ b/Mage/src/main/java/mage/game/match/MatchOptions.java
@@ -52,21 +52,50 @@ public class MatchOptions implements Serializable {
protected String deckType;
protected boolean limited;
protected List playerTypes = new ArrayList<>();
+ protected boolean multiPlayer;
+ protected int numSeats;
protected String password;
protected SkillLevel skillLevel;
protected boolean rollbackTurnsAllowed;
protected int quitRatio;
protected boolean rated;
+ protected int numSeatsForMatch;
/**
* Time each player has during the game to play using his\her priority.
*/
protected MatchTimeLimit matchTimeLimit; // 0 = no priorityTime handling
- public MatchOptions(String name, String gameType) {
+ /*public MatchOptions(String name, String gameType) {
this.name = name;
this.gameType = gameType;
this.password = "";
+ this.multiPlayer = false;
+ this.numSeats = 2;
+ }*/
+
+ public MatchOptions(String name, String gameType, boolean multiPlayer, int numSeats ) {
+ this.name = name;
+ this.gameType = gameType;
+ this.password = "";
+ this.multiPlayer = multiPlayer;
+ this.numSeats = numSeats;
+ }
+
+ public void setNumSeats (int numSeats) {
+ this.numSeats = numSeats;
+ }
+
+ public int getNumSeats () {
+ return numSeats;
+ }
+
+ public void setMultiPlayer(boolean multiPlayer) {
+ this.multiPlayer = multiPlayer;
+ }
+
+ public boolean getMultiPlayer() {
+ return multiPlayer;
}
public String getName() {
diff --git a/Mage/src/main/java/mage/game/tournament/MultiplayerRound.java b/Mage/src/main/java/mage/game/tournament/MultiplayerRound.java
new file mode 100644
index 00000000000..2e69299aa34
--- /dev/null
+++ b/Mage/src/main/java/mage/game/tournament/MultiplayerRound.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2011 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+
+package mage.game.tournament;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import mage.game.match.Match;
+
+/**
+ *
+ * @author spjspj
+ */
+public class MultiplayerRound {
+
+ private final int roundNum;
+ private final Tournament tournament;
+ private final int numSeats;
+ private final List allPlayers = new ArrayList<>();
+ private Match match;
+ private UUID tableId;
+
+
+ public MultiplayerRound(int roundNum, Tournament tournament, int numSeats) {
+ this.roundNum = roundNum;
+ this.tournament = tournament;
+ this.numSeats = numSeats;
+ }
+
+ public List getAllPlayers () {
+ return allPlayers;
+ }
+
+ public TournamentPlayer getPlayer (int i) {
+ if (i >= 0 && i < numSeats && i < allPlayers.size()) {
+ return allPlayers.get(i);
+ }
+ return null;
+ }
+
+ public void addPairing(TournamentPairing match) {
+ this.allPlayers.add(match.getPlayer1());
+ this.allPlayers.add(match.getPlayer2());
+ }
+
+ public void addPlayer(TournamentPlayer player) {
+ this.allPlayers.add(player);
+ }
+
+ public int getRoundNumber() {
+ return this.roundNum;
+ }
+
+ public void setMatch (Match match) {
+ this.match = match;
+ }
+
+ public void setTableId (UUID tableId) {
+ this.tableId = tableId;
+ }
+
+ public boolean isRoundOver() {
+ boolean roundIsOver = true;
+ if (this.match != null) {
+ if (!this.match.hasEnded()) {
+ roundIsOver = false;
+ }
+ }
+ return roundIsOver;
+ }
+}
diff --git a/Mage/src/main/java/mage/game/tournament/TournamentImpl.java b/Mage/src/main/java/mage/game/tournament/TournamentImpl.java
index ebc7faf589c..b01048d3b65 100644
--- a/Mage/src/main/java/mage/game/tournament/TournamentImpl.java
+++ b/Mage/src/main/java/mage/game/tournament/TournamentImpl.java
@@ -261,6 +261,12 @@ public abstract class TournamentImpl implements Tournament {
}
updateResults();
}
+
+ protected void playMultiplayerRound(MultiplayerRound round) {
+ playMultiPlayerMatch(round);
+
+ updateResults(); // show points from byes
+ }
protected List getActivePlayers() {
List activePlayers = new ArrayList<>();
@@ -456,6 +462,10 @@ public abstract class TournamentImpl implements Tournament {
options.getMatchOptions().getPlayerTypes().add(pair.getPlayer2().getPlayerType());
tableEventSource.fireTableEvent(EventType.START_MATCH, pair, options.getMatchOptions());
}
+
+ public void playMultiPlayerMatch(MultiplayerRound round) {
+ tableEventSource.fireTableEvent(EventType.START_MULTIPLAYER_MATCH, round, options.getMatchOptions());
+ }
public void end() {
endTime = new Date();
diff --git a/Mage/src/main/java/mage/game/tournament/TournamentOptions.java b/Mage/src/main/java/mage/game/tournament/TournamentOptions.java
index 4a111ebcd74..3160e2598ac 100644
--- a/Mage/src/main/java/mage/game/tournament/TournamentOptions.java
+++ b/Mage/src/main/java/mage/game/tournament/TournamentOptions.java
@@ -41,15 +41,16 @@ public class TournamentOptions implements Serializable {
protected String name;
protected String tournamentType;
protected List playerTypes = new ArrayList<>();
- protected MatchOptions matchOptions = new MatchOptions("", "Two Player Duel");
+ protected MatchOptions matchOptions;
protected LimitedOptions limitedOptions;
protected boolean watchingAllowed = true;
protected int numberRounds;
protected String password;
protected int quitRatio;
- public TournamentOptions(String name) {
+ public TournamentOptions(String name, String matchType, int numSeats) {
this.name = name;
+ this.matchOptions = new MatchOptions("", matchType, numSeats > 2, numSeats);
}
public String getName() {
diff --git a/Mage/src/main/java/mage/game/tournament/TournamentSealedOptions.java b/Mage/src/main/java/mage/game/tournament/TournamentSealedOptions.java
index 586894a81c4..e3d1d0081f6 100644
--- a/Mage/src/main/java/mage/game/tournament/TournamentSealedOptions.java
+++ b/Mage/src/main/java/mage/game/tournament/TournamentSealedOptions.java
@@ -34,8 +34,8 @@ package mage.game.tournament;
*/
public class TournamentSealedOptions extends TournamentOptions {
- public TournamentSealedOptions(String name) {
- super(name);
+ public TournamentSealedOptions(String name, String matchType, int numSeats) {
+ super(name, matchType, numSeats);
}
}
diff --git a/Mage/src/main/java/mage/game/tournament/TournamentSingleElimination.java b/Mage/src/main/java/mage/game/tournament/TournamentSingleElimination.java
index 328d9c4ce1b..55ab5f8a0d5 100644
--- a/Mage/src/main/java/mage/game/tournament/TournamentSingleElimination.java
+++ b/Mage/src/main/java/mage/game/tournament/TournamentSingleElimination.java
@@ -28,6 +28,7 @@
package mage.game.tournament;
+import java.util.List;
import java.util.Map;
import java.util.UUID;
import mage.game.events.TableEvent;
@@ -50,16 +51,25 @@ public abstract class TournamentSingleElimination extends TournamentImpl {
entry.getValue().setResults("Auto Eliminated");
}
}
- while (this.getActivePlayers().size() > 1) {
- // check if some player got killed / disconnected meanwhile and update their state
- tableEventSource.fireTableEvent(TableEvent.EventType.CHECK_STATE_PLAYERS);
- Round round = createRoundRandom();
- playRound(round);
- eliminatePlayers(round);
+ if (options.matchOptions.getNumSeats() == 2) {
+ while (this.getActivePlayers().size() > 1) {
+ // check if some player got killed / disconnected meanwhile and update their state
+ tableEventSource.fireTableEvent(TableEvent.EventType.CHECK_STATE_PLAYERS);
+ Round round = createRoundRandom();
+ playRound(round);
+ eliminatePlayers(round);
+ }
+ } else {
+ MultiplayerRound round = new MultiplayerRound(0, this, options.matchOptions.getNumSeats());
+ for (TournamentPlayer player : getActivePlayers()) {
+ round.addPlayer(player);
+ }
+ playMultiplayerRound(round);
}
+
nextStep();
}
-
+
private void eliminatePlayers(Round round) {
for (TournamentPairing pair: round.getPairs()) {
pair.eliminatePlayers();
diff --git a/Mage/src/main/java/mage/game/tournament/TournamentSwiss.java b/Mage/src/main/java/mage/game/tournament/TournamentSwiss.java
index 54337d71cc6..faf2ffc9285 100644
--- a/Mage/src/main/java/mage/game/tournament/TournamentSwiss.java
+++ b/Mage/src/main/java/mage/game/tournament/TournamentSwiss.java
@@ -56,13 +56,19 @@ public abstract class TournamentSwiss extends TournamentImpl {
}
}
- while (this.getActivePlayers().size() > 1 && this.getNumberRounds() > this.getRounds().size()) {
- // check if some player got killed / disconnected meanwhile and update their state
- tableEventSource.fireTableEvent(TableEvent.EventType.CHECK_STATE_PLAYERS);
- // Swiss pairing
- Round round = createRoundSwiss();
- playRound(round);
+ if (options.matchOptions.getNumSeats() == 2) {
+ while (this.getActivePlayers().size() > 1 && this.getNumberRounds() > this.getRounds().size()) {
+ // check if some player got killed / disconnected meanwhile and update their state
+ tableEventSource.fireTableEvent(TableEvent.EventType.CHECK_STATE_PLAYERS);
+ // Swiss pairing
+ Round round = createRoundSwiss();
+ playRound(round);
+ }
+ } else {
+ MultiplayerRound round = createMultiplayerRound();
+ playMultiplayerRound(round);
}
+
nextStep();
}
@@ -70,33 +76,60 @@ public abstract class TournamentSwiss extends TournamentImpl {
List roundPlayers = getActivePlayers();
boolean isLastRound = (rounds.size() + 1 == getNumberRounds());
- RoundPairings roundPairings;
- if (roundPlayers.size() <= 16) {
- SwissPairingMinimalWeightMatching swissPairing = new SwissPairingMinimalWeightMatching(roundPlayers, rounds, isLastRound);
- roundPairings = swissPairing.getRoundPairings();
- } else {
- SwissPairingSimple swissPairing = new SwissPairingSimple(roundPlayers, rounds);
- roundPairings = swissPairing.getRoundPairings();
- }
-
- Round round = new Round(rounds.size() + 1, this);
- rounds.add(round);
- for (TournamentPairing pairing : roundPairings.getPairings()) {
- round.addPairing(pairing);
- }
- for (TournamentPlayer playerBye : roundPairings.getPlayerByes()) {
- // player free round - add to bye players of this round
- round.getPlayerByes().add(playerBye);
- if (isLastRound) {
- playerBye.setState(TournamentPlayerState.FINISHED);
+ Round round = null;
+ if (options.matchOptions.getNumSeats() == 2) {
+ RoundPairings roundPairings;
+ if (roundPlayers.size() <= 16) {
+ SwissPairingMinimalWeightMatching swissPairing = new SwissPairingMinimalWeightMatching(roundPlayers, rounds, isLastRound);
+ roundPairings = swissPairing.getRoundPairings();
} else {
- playerBye.setState(TournamentPlayerState.WAITING);
+ SwissPairingSimple swissPairing = new SwissPairingSimple(roundPlayers, rounds);
+ roundPairings = swissPairing.getRoundPairings();
+ }
+
+ round = new Round(rounds.size() + 1, this);
+ rounds.add(round);
+ for (TournamentPairing pairing : roundPairings.getPairings()) {
+ round.addPairing(pairing);
+ }
+ for (TournamentPlayer playerBye : roundPairings.getPlayerByes()) {
+ // player free round - add to bye players of this round
+ round.getPlayerByes().add(playerBye);
+ if (isLastRound) {
+ playerBye.setState(TournamentPlayerState.FINISHED);
+ } else {
+ playerBye.setState(TournamentPlayerState.WAITING);
+ }
+ playerBye.setStateInfo("Round Bye");
+ updateResults();
}
- playerBye.setStateInfo("Round Bye");
- updateResults();
}
return round;
}
+ public MultiplayerRound createMultiplayerRound() {
+ List roundPlayers = getActivePlayers();
+ boolean isLastRound = (rounds.size() + 1 == getNumberRounds());
+
+ MultiplayerRound round = null;
+ if (options.matchOptions.getNumSeats() > 2) {
+ RoundPairings roundPairings;
+ if (roundPlayers.size() <= 16) {
+ SwissPairingMinimalWeightMatching swissPairing = new SwissPairingMinimalWeightMatching(roundPlayers, rounds, isLastRound);
+ roundPairings = swissPairing.getRoundPairings();
+ } else {
+ SwissPairingSimple swissPairing = new SwissPairingSimple(roundPlayers, rounds);
+ roundPairings = swissPairing.getRoundPairings();
+ }
+
+ round = new MultiplayerRound(rounds.size() + 1, this, options.matchOptions.getNumSeats());
+ for (TournamentPairing pairing : roundPairings.getPairings()) {
+ round.addPairing(pairing);
+ }
+
+ }
+ return round;
+
+ }
}