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; + + } }