From e2fd0299c750bafc23a332988dd1294ddfe0993f Mon Sep 17 00:00:00 2001 From: BetaSteward Date: Tue, 8 Feb 2011 11:34:28 -0500 Subject: [PATCH] fixed multi-human drafting --- .../src/main/java/mage/client/MageFrame.java | 4 ++- .../client/deckeditor/DeckEditorPanel.java | 4 +-- .../mage/client/dialog/JoinTableDialog.java | 4 +-- .../mage/client/dialog/NewTableDialog.java | 2 +- .../client/dialog/NewTournamentDialog.form | 4 +-- .../client/dialog/NewTournamentDialog.java | 2 +- .../client/dialog/TableWaitingDialog.java | 8 ++--- .../java/mage/client/draft/DraftPanel.form | 14 +++++++- .../java/mage/client/draft/DraftPanel.java | 27 ++++++++++++-- .../main/java/mage/client/remote/Session.java | 20 +++++------ .../mage/client/table/TablePlayerPanel.java | 2 +- .../java/mage/client/table/TablesPanel.java | 33 +++++++++--------- .../client/table/TournamentPlayerPanel.java | 2 +- Mage.Common/src/mage/interfaces/Server.java | 7 ++-- Mage.Common/src/mage/view/DraftPickView.java | 6 ++++ Mage.Common/src/mage/view/TableView.java | 5 +++ Mage.Server/plugins/mage-player-ai.jar | Bin 39772 -> 39769 bytes Mage.Server/plugins/mage-player-human.jar | Bin 11577 -> 11573 bytes .../src/main/java/mage/server/ServerImpl.java | 21 +++++------ .../java/mage/server/TableController.java | 16 ++++----- .../main/java/mage/server/TableManager.java | 12 +++---- .../mage/server/draft/DraftController.java | 7 ++-- .../java/mage/server/draft/DraftManager.java | 5 +-- .../java/mage/server/draft/DraftSession.java | 5 +-- .../main/java/mage/server/game/GamesRoom.java | 4 +-- .../java/mage/server/game/GamesRoomImpl.java | 8 ++--- .../tournament/TournamentController.java | 6 ++-- .../java/org/mage/test/base/MageBase.java | 4 +-- Mage/src/mage/game/Table.java | 12 +++++-- Mage/src/mage/game/draft/Draft.java | 2 +- Mage/src/mage/game/draft/DraftImpl.java | 21 ++++++----- 31 files changed, 160 insertions(+), 107 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index 5f763a24630..b093d29e3d8 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -242,8 +242,10 @@ public class MageFrame extends javax.swing.JFrame { public void run() { if (autoConnect()) enableButtons(); - else + else { disableButtons(); + connectDialog.showDialog(); + } } }); } diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java index 2d07be8423d..c71b096efa8 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java @@ -449,8 +449,8 @@ public class DeckEditorPanel extends javax.swing.JPanel { }//GEN-LAST:event_btnImportActionPerformed private void btnSubmitActionPerformed(java.awt.event.ActionEvent evt) { - MageFrame.getSession().submitDeck(tableId, deck.getDeckCardLists()); - this.setVisible(false); + if (MageFrame.getSession().submitDeck(tableId, deck.getDeckCardLists())) + this.setVisible(false); } private void btnAddLandActionPerformed(java.awt.event.ActionEvent evt) { diff --git a/Mage.Client/src/main/java/mage/client/dialog/JoinTableDialog.java b/Mage.Client/src/main/java/mage/client/dialog/JoinTableDialog.java index 8b7fe1c5e7e..f86b64a96fb 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/JoinTableDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/JoinTableDialog.java @@ -40,9 +40,7 @@ import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JOptionPane; -import mage.cards.decks.DeckCardLists; import mage.client.remote.Session; -import mage.client.util.PhaseManager; import mage.sets.Sets; import mage.util.Logging; @@ -138,7 +136,7 @@ public class JoinTableDialog extends MageDialog { private void btnOKActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnOKActionPerformed Session session = MageFrame.getSession(); try { - joined = session.joinTable(roomId, tableId, this.newPlayerPanel.getPlayerName(), Sets.loadDeck(this.newPlayerPanel.getDeckFile())); + joined = session.joinTable(roomId, tableId, this.newPlayerPanel.getPlayerName(), "Human", Sets.loadDeck(this.newPlayerPanel.getDeckFile())); } catch (Exception ex) { handleError(ex); } 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 557e4ea3420..d571f61504a 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java @@ -310,7 +310,7 @@ public class NewTableDialog extends MageDialog { options.setWinsNeeded((Integer)this.spnNumWins.getValue()); table = session.createTable(roomId, options); try { - if (session.joinTable(roomId, table.getTableId(), this.player1Panel.getPlayerName(), Sets.loadDeck(this.player1Panel.getDeckFile()))) { + if (session.joinTable(roomId, table.getTableId(), this.player1Panel.getPlayerName(), "Human", Sets.loadDeck(this.player1Panel.getDeckFile()))) { for (TablePlayerPanel player: players) { if (!player.getPlayerType().equals("Human")) { if (!player.joinTable(roomId, table.getTableId())) { 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 3c78b2e9f4a..aced948c775 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.form +++ b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.form @@ -59,7 +59,7 @@ - + @@ -164,7 +164,7 @@ - + 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 b6b2547960a..f80cbf3c449 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java @@ -259,7 +259,7 @@ public class NewTournamentDialog extends MageDialog { tOptions.getMatchOptions().setAttackOption(MultiplayerAttackOption.LEFT); tOptions.getMatchOptions().setRange(RangeOfInfluence.ALL); table = session.createTournamentTable(roomId, tOptions); - if (session.joinTournamentTable(roomId, table.getTableId(), this.txtPlayer1Name.getText())) { + if (session.joinTournamentTable(roomId, table.getTableId(), this.txtPlayer1Name.getText(), "Human")) { for (TournamentPlayerPanel player: players) { if (!player.getPlayerType().equals("Human")) { if (!player.joinTournamentTable(roomId, table.getTableId())) { diff --git a/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java b/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java index b6702db2779..218f9bc2f2b 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java @@ -87,14 +87,14 @@ public class TableWaitingDialog extends MageDialog implements Observer { this.btnMoveDown.setEnabled(true); this.btnMoveUp.setEnabled(true); break; - case DUELING: - closeDialog(); - return; - default: + case WAITING: this.btnStart.setEnabled(false); this.btnMoveDown.setEnabled(false); this.btnMoveUp.setEnabled(false); break; + default: + closeDialog(); + return; } int row = this.tableSeats.getSelectedRow(); tableWaitModel.loadData(table); diff --git a/Mage.Client/src/main/java/mage/client/draft/DraftPanel.form b/Mage.Client/src/main/java/mage/client/draft/DraftPanel.form index e6efee9f264..97a1ed3ecff 100644 --- a/Mage.Client/src/main/java/mage/client/draft/DraftPanel.form +++ b/Mage.Client/src/main/java/mage/client/draft/DraftPanel.form @@ -89,6 +89,11 @@ + + + + + @@ -119,7 +124,9 @@ - + + + @@ -192,6 +199,11 @@ + + + + + diff --git a/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java b/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java index 65f0759fbd9..cdb949e5b4f 100644 --- a/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java +++ b/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java @@ -56,6 +56,7 @@ public class DraftPanel extends javax.swing.JPanel { private Session session; private Timer countdown; private int timeout; + private boolean picked; /** Creates new form DraftPanel */ public DraftPanel() { @@ -103,12 +104,18 @@ public class DraftPanel extends javax.swing.JPanel { @Override public void event(Event event) { if (event.getEventName().equals("pick-a-card")) { - countdown.stop(); - session.sendCardPick(draftId, (UUID)event.getSource()); + DraftPickView view = session.sendCardPick(draftId, (UUID)event.getSource()); + if (view != null) { + draftBooster.loadBooster(view.getBooster(), bigCard); + draftPicks.loadCards(view.getPicks(), bigCard, null); + setMessage("Waiting for other players"); + } } } } ); + setMessage(""); + countdown.stop(); this.timeout = draftPickView.getTimeout(); setTimeout(Integer.toString(timeout)); if (timeout != 0) { @@ -129,6 +136,10 @@ public class DraftPanel extends javax.swing.JPanel { c.setVisible(false); } + protected void setMessage(String message) { + this.lblMessage.setText(message); + } + /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is @@ -153,6 +164,7 @@ public class DraftPanel extends javax.swing.JPanel { chkPack2 = new javax.swing.JCheckBox(); chkPack3 = new javax.swing.JCheckBox(); txtTimeRemaining = new javax.swing.JTextField(); + lblMessage = new javax.swing.JLabel(); draftBooster = new mage.client.cards.DraftGrid(); draftPicks = new mage.client.cards.CardGrid(); @@ -183,6 +195,8 @@ public class DraftPanel extends javax.swing.JPanel { txtTimeRemaining.setHorizontalAlignment(javax.swing.JTextField.CENTER); txtTimeRemaining.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED)); + lblMessage.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( @@ -214,6 +228,10 @@ public class DraftPanel extends javax.swing.JPanel { .addComponent(chkPack3) .addComponent(chkPack2) .addComponent(chkPack1))) + .addGroup(jPanel1Layout.createSequentialGroup() + .addContainerGap() + .addComponent(lblMessage, javax.swing.GroupLayout.DEFAULT_SIZE, 236, Short.MAX_VALUE) + .addContainerGap()) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -239,7 +257,9 @@ public class DraftPanel extends javax.swing.JPanel { .addComponent(txtCardNo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addComponent(txtTimeRemaining, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 41, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(lblMessage, javax.swing.GroupLayout.DEFAULT_SIZE, 29, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(bigCard, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) ); @@ -290,6 +310,7 @@ public class DraftPanel extends javax.swing.JPanel { private javax.swing.JPanel jPanel1; private javax.swing.JSeparator jSeparator1; private javax.swing.JLabel lblCardNo; + private javax.swing.JLabel lblMessage; private javax.swing.JLabel lblPack1; private javax.swing.JLabel lblPack2; private javax.swing.JLabel lblPack3; diff --git a/Mage.Client/src/main/java/mage/client/remote/Session.java b/Mage.Client/src/main/java/mage/client/remote/Session.java index d8cecf86be7..202124dd8fd 100644 --- a/Mage.Client/src/main/java/mage/client/remote/Session.java +++ b/Mage.Client/src/main/java/mage/client/remote/Session.java @@ -56,6 +56,7 @@ import mage.interfaces.Server; import mage.interfaces.ServerState; import mage.interfaces.callback.CallbackClientDaemon; import mage.util.Logging; +import mage.view.DraftPickView; import mage.view.GameTypeView; import mage.view.TableView; import mage.view.TournamentTypeView; @@ -105,6 +106,7 @@ public class Session { return true; } catch (MageException ex) { logger.log(Level.SEVERE, null, ex); + disconnect(); JOptionPane.showMessageDialog(frame, "Unable to connect to server. " + ex.getMessage()); } catch (RemoteException ex) { logger.log(Level.SEVERE, "Unable to connect to server - ", ex); @@ -272,9 +274,9 @@ public class Session { return false; } - public boolean joinTable(UUID roomId, UUID tableId, String playerName, DeckCardLists deckList) { + public boolean joinTable(UUID roomId, UUID tableId, String playerName, String playerType, DeckCardLists deckList) { try { - return server.joinTable(sessionId, roomId, tableId, playerName, deckList); + return server.joinTable(sessionId, roomId, tableId, playerName, playerType, deckList); } catch (RemoteException ex) { handleRemoteException(ex); } catch (MageException ex) { @@ -285,9 +287,9 @@ public class Session { return false; } - public boolean joinTournamentTable(UUID roomId, UUID tableId, String playerName) { + public boolean joinTournamentTable(UUID roomId, UUID tableId, String playerName, String playerType) { try { - return server.joinTournamentTable(sessionId, roomId, tableId, playerName); + return server.joinTournamentTable(sessionId, roomId, tableId, playerName, playerType); } catch (RemoteException ex) { handleRemoteException(ex); } catch (MageException ex) { @@ -381,16 +383,15 @@ public class Session { return false; } - public boolean sendCardPick(UUID draftId, UUID cardId) { + public DraftPickView sendCardPick(UUID draftId, UUID cardId) { try { - server.sendCardPick(draftId, sessionId, cardId); - return true; + return server.sendCardPick(draftId, sessionId, cardId); } catch (RemoteException ex) { handleRemoteException(ex); } catch (MageException ex) { handleMageException(ex); } - return false; + return null; } public boolean joinChat(UUID chatId, ChatPanel chat) { @@ -586,8 +587,7 @@ public class Session { public boolean submitDeck(UUID tableId, DeckCardLists deck) { try { - server.submitDeck(sessionId, tableId, deck); - return true; + return server.submitDeck(sessionId, tableId, deck); } catch (RemoteException ex) { handleRemoteException(ex); } catch (MageException ex) { diff --git a/Mage.Client/src/main/java/mage/client/table/TablePlayerPanel.java b/Mage.Client/src/main/java/mage/client/table/TablePlayerPanel.java index 3cb2aa66fac..37c547e028d 100644 --- a/Mage.Client/src/main/java/mage/client/table/TablePlayerPanel.java +++ b/Mage.Client/src/main/java/mage/client/table/TablePlayerPanel.java @@ -82,7 +82,7 @@ public class TablePlayerPanel extends javax.swing.JPanel { public boolean joinTable(UUID roomId, UUID tableId) throws FileNotFoundException, IOException, ClassNotFoundException { if (!this.cbPlayerType.getSelectedItem().equals("Human")) { - return session.joinTable(roomId, tableId, this.newPlayerPanel.getPlayerName(), Sets.loadDeck(this.newPlayerPanel.getDeckFile())); + return session.joinTable(roomId, tableId, this.newPlayerPanel.getPlayerName(), (String)this.cbPlayerType.getSelectedItem(), Sets.loadDeck(this.newPlayerPanel.getDeckFile())); } return true; } 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 fbd99831b34..2e50ac427de 100644 --- a/Mage.Client/src/main/java/mage/client/table/TablesPanel.java +++ b/Mage.Client/src/main/java/mage/client/table/TablesPanel.java @@ -97,13 +97,20 @@ public class TablesPanel extends javax.swing.JPanel implements Observer { int modelRow = Integer.valueOf( e.getActionCommand() ); UUID tableId = UUID.fromString((String)tableModel.getValueAt(modelRow, 0)); String state = (String)tableModel.getValueAt(modelRow, 4); + boolean isTournament = (Boolean)tableModel.getValueAt(modelRow, 5); if (state.equals("Join")) { - logger.info("Joining table " + tableId); - - joinTableDialog.showDialog(roomId, tableId); - if (joinTableDialog.isJoined()) - tableWaitingDialog.showDialog(roomId, tableId, false); + if (isTournament) { + logger.info("Joining tournament " + tableId); + if (session.joinTournamentTable(roomId, tableId, session.getUserName(), "Human")) + tableWaitingDialog.showDialog(roomId, tableId, true); + } + else { + logger.info("Joining table " + tableId); + joinTableDialog.showDialog(roomId, tableId); + if (joinTableDialog.isJoined()) + tableWaitingDialog.showDialog(roomId, tableId, false); + } } else if (state.equals("Watch")) { logger.info("Watching table " + tableId); if (!session.watchTable(roomId, tableId)) @@ -305,18 +312,8 @@ public class TablesPanel extends javax.swing.JPanel implements Observer { options.setRange(RangeOfInfluence.ALL); options.setWinsNeeded(1); table = session.createTable(roomId, options); - session.joinTable( - roomId, - table.getTableId(), - "Human", - Sets.loadDeck("test.dck") - ); - session.joinTable( - roomId, - table.getTableId(), - "Computer", - Sets.loadDeck("test.dck") - ); + session.joinTable(roomId, table.getTableId(), "Human", "Human", Sets.loadDeck("test.dck")); + session.joinTable(roomId, table.getTableId(), "Computer", "Computer - default", Sets.loadDeck("test.dck")); hideTables(); session.startGame(roomId, table.getTableId()); } catch (Exception ex) { @@ -392,6 +389,8 @@ class TableTableModel extends AbstractTableModel { default: return ""; } + case 5: + return tables[arg0].isTournament(); } return ""; } diff --git a/Mage.Client/src/main/java/mage/client/table/TournamentPlayerPanel.java b/Mage.Client/src/main/java/mage/client/table/TournamentPlayerPanel.java index 4f0493711be..d530406bdbf 100644 --- a/Mage.Client/src/main/java/mage/client/table/TournamentPlayerPanel.java +++ b/Mage.Client/src/main/java/mage/client/table/TournamentPlayerPanel.java @@ -65,7 +65,7 @@ public class TournamentPlayerPanel extends javax.swing.JPanel { public boolean joinTournamentTable(UUID roomId, UUID tableId) { if (!this.cbPlayerType.getSelectedItem().equals("Human")) { - return session.joinTournamentTable(roomId, tableId, this.txtPlayerName.getText()); + return session.joinTournamentTable(roomId, tableId, this.txtPlayerName.getText(), (String)this.cbPlayerType.getSelectedItem()); } return true; } diff --git a/Mage.Common/src/mage/interfaces/Server.java b/Mage.Common/src/mage/interfaces/Server.java index d08cb7a48f3..d11f445c7fe 100644 --- a/Mage.Common/src/mage/interfaces/Server.java +++ b/Mage.Common/src/mage/interfaces/Server.java @@ -37,6 +37,7 @@ import mage.cards.decks.DeckCardLists; import mage.game.GameException; import mage.game.tournament.TournamentOptions; import mage.interfaces.callback.CallbackServer; +import mage.view.DraftPickView; import mage.view.TableView; import mage.view.GameView; import mage.view.TournamentView; @@ -56,8 +57,8 @@ public interface Server extends Remote, CallbackServer { //table methods public TableView createTable(UUID sessionId, UUID roomId, MatchOptions matchOptions) throws RemoteException, MageException; public TableView createTournamentTable(UUID sessionId, UUID roomId, TournamentOptions tournamentOptions) throws RemoteException, MageException; - public boolean joinTable(UUID sessionId, UUID roomId, UUID tableId, String name, DeckCardLists deckList) throws RemoteException, MageException, GameException; - public boolean joinTournamentTable(UUID sessionId, UUID roomId, UUID tableId, String name) throws RemoteException, MageException, GameException; + public boolean joinTable(UUID sessionId, UUID roomId, UUID tableId, String name, String playerType, DeckCardLists deckList) throws RemoteException, MageException, GameException; + public boolean joinTournamentTable(UUID sessionId, UUID roomId, UUID tableId, String name, String playerType) throws RemoteException, MageException, GameException; public boolean submitDeck(UUID sessionId, UUID tableId, DeckCardLists deckList) throws RemoteException, MageException, GameException; public boolean watchTable(UUID sessionId, UUID roomId, UUID tableId) throws RemoteException, MageException; public boolean replayTable(UUID sessionId, UUID roomId, UUID tableId) throws RemoteException, MageException; @@ -98,7 +99,7 @@ public interface Server extends Remote, CallbackServer { //draft methods public void joinDraft(UUID draftId, UUID sessionId) throws RemoteException, MageException; - public void sendCardPick(UUID draftId, UUID sessionId, UUID cardId) throws RemoteException, MageException; + public DraftPickView sendCardPick(UUID draftId, UUID sessionId, UUID cardId) throws RemoteException, MageException; //replay methods public void replayGame(UUID sessionId) throws RemoteException, MageException; diff --git a/Mage.Common/src/mage/view/DraftPickView.java b/Mage.Common/src/mage/view/DraftPickView.java index 34d8e1090de..ddb7b0dc2e2 100644 --- a/Mage.Common/src/mage/view/DraftPickView.java +++ b/Mage.Common/src/mage/view/DraftPickView.java @@ -40,11 +40,13 @@ public class DraftPickView implements Serializable { protected CardsView booster; protected CardsView picks; + protected boolean picking; protected int timeout; public DraftPickView(DraftPlayer player, int timeout) { this.booster = new CardsView(player.getBooster()); this.picks = new CardsView(player.getDeck().getSideboard()); + this.picking = player.isPicking(); this.timeout = timeout; } @@ -56,6 +58,10 @@ public class DraftPickView implements Serializable { return picks; } + public boolean isPicking() { + return this.picking; + } + public int getTimeout() { return timeout; } diff --git a/Mage.Common/src/mage/view/TableView.java b/Mage.Common/src/mage/view/TableView.java index 006f3d6b998..7d8af244b8b 100644 --- a/Mage.Common/src/mage/view/TableView.java +++ b/Mage.Common/src/mage/view/TableView.java @@ -47,6 +47,7 @@ public class TableView implements Serializable { private String gameType; private String deckType; private TableState tableState; + private boolean isTournament; private List seats = new ArrayList(); public TableView(Table table) { @@ -54,6 +55,7 @@ public class TableView implements Serializable { this.gameType = table.getGameType(); this.deckType = table.getDeckType(); this.tableState = table.getState(); + this.isTournament = table.isTournament(); for (Seat seat: table.getSeats()) { seats.add(new SeatView(seat)); } @@ -79,5 +81,8 @@ public class TableView implements Serializable { return seats; } + public boolean isTournament() { + return this.isTournament; + } } diff --git a/Mage.Server/plugins/mage-player-ai.jar b/Mage.Server/plugins/mage-player-ai.jar index fa9801e7ee866f3402acbb6a9340d90139bc6493..a7989fd3231ba558e96c6f91e1d6b4e10ee544a1 100644 GIT binary patch delta 17961 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 K!NxTiBmw|-s|ZK{ delta 17947 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 diff --git a/Mage.Server/plugins/mage-player-human.jar b/Mage.Server/plugins/mage-player-human.jar index 96322403c9b9aea0b3b39d30612a253010f212eb..ea5222287e43b1a544db40ccc675899a305421d1 100644 GIT binary patch delta 994 zcmdlPwKa-2z?+$civa{|oINJ;s_O8H$3^L%II*6Jq!Ke$OH+wL8GJzRWn5WBw8G6doz#@~6t7?Ij zeo-|B(^_h-yah!rb_{ogd|xs$Fx;42qh?iqy6cXCfX(sv#I_jSN_B6J=EuPtoNrXP zD<|Aubi!6HH^|@7X6}vaozAlD?(1z< zGH~u;@RNLT@T~QZJI&Xvwp=;2$x(T7+<)Fk7sj9FAJ6CY;&oPAw&BUAV9wy(Ll zYhrD-^p~$q$+8o<_SGk+F23{P?00s(r{=kFhkqMg6bNnlc;tg!_>uD-w|3~wsJ!`b zrZ?9g)~}^zv6uJuPSCjZ^XJFE$)EHN-~F|8t!uCb%c|q$J(FK~TTgfwuk`o8`@ajm z%~pIFyW;R4ZN-CTyi(hDZda;n`1HaamYg_13DGX+lk=rK1_m~ULSQnqnB1UdIQg}P zLOq|RZ)kzHZ;-(T1|@CfVC`UG*6R-hSe2Qbo#WPRy0YlenLjqs%(ljH>%J`dbBXD^ z$n8IiO7`A4@+Bm0-H}C;&TKjIL}FaxG#MkWzvcs{TL z zjBT4Ml%3=B;`A6$b)HsW1{v^99Yjr*VAKWCn>`pknZS%G%+uw;3_ay(V3EnkRkgrM zzo;66X)QHZUh^$eZJmF}9emBmz;J7Fjha=xZ~tWj5u3^Jf}t_l%Tpa!a9Jv{ToMaw za=jCFtkQR{%C=PNzXFf;KfaM?Cmo{rRG|NO{vWl^LQ8`>(-)}Og{oeEFIJuWgza&c zOoOr#=Urx@RR{RvxBcK#)rhQk_H0SyX*;?87e7vYyym&-ko~sr@ox`y=}2C0E8yzZ z=zH7QTVM8J?}8%+2lFR%KbPQ(kb5_8(sGu$CHqdSX{mi=vDSs}X?egcuatFOUF;F3 zr?@bh&y2QM5U^<4{7+}J7IcYBc*K3Fu)`?FeZ|HE=SVF@pRVc*cUzW&EPLHni^yBm z?(S@Vb#cd!ZJPfACK<1IdVH5sjaHKMg8d!`D<;|sUk%w)uk+VTU37=l#`VJOR($<& z6+wJL6?}7yF6`aC{liY?{I4&fw6E(*-T3mU+(Vh`#Qcfr_qKmLTh)=R_~q;7wABB} z8G+hd?`Ljea++(rHlyo!g8TH;+__g4udXWL@QdLz{5q4jG%aS9+Nw@d(Wxm*|GxY8 zVNWUZ?`vkSUTgPlbjK=&qA+IJsK;5xYkBKPFg$;s7N@yZ9$UzY92kiLe-mEhaap8BTtw zp^#aoeJbRG*O_30O#uc*TZ}erF)|G=;N=T6FfuTC@>I)PSL@uF^P5dC7++;By4?NA zo7*Nh=X3X^uSLR_gDZCmb$c0I7Mkqc(6rBi@ovMMBd4w?#r9vi getTables(); - public boolean joinTable(UUID sessionId, UUID tableId, String name, DeckCardLists deckList) throws GameException; - public boolean joinTournamentTable(UUID sessionId, UUID tableId, String name) throws GameException; + public boolean joinTable(UUID sessionId, UUID tableId, String name, String playerType, DeckCardLists deckList) throws GameException; + public boolean joinTournamentTable(UUID sessionId, UUID tableId, String name, String playerType) throws GameException; public TableView createTable(UUID sessionId, MatchOptions options); public TableView createTournamentTable(UUID sessionId, TournamentOptions options); public void removeTable(UUID sessionId, UUID tableId); diff --git a/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java b/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java index 7170db13e6a..edca14c2a7a 100644 --- a/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java +++ b/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java @@ -65,9 +65,9 @@ public class GamesRoomImpl extends RoomImpl implements GamesRoom, Serializable { } @Override - public boolean joinTable(UUID sessionId, UUID tableId, String name, DeckCardLists deckList) throws GameException { + public boolean joinTable(UUID sessionId, UUID tableId, String name, String playerType, DeckCardLists deckList) throws GameException { if (tables.containsKey(tableId)) { - return TableManager.getInstance().joinTable(sessionId, tableId, name, deckList); + return TableManager.getInstance().joinTable(sessionId, tableId, name, playerType, deckList); } else { return false; } @@ -81,9 +81,9 @@ public class GamesRoomImpl extends RoomImpl implements GamesRoom, Serializable { } @Override - public boolean joinTournamentTable(UUID sessionId, UUID tableId, String name) throws GameException { + public boolean joinTournamentTable(UUID sessionId, UUID tableId, String name, String playerType) throws GameException { if (tables.containsKey(tableId)) { - return TableManager.getInstance().joinTournament(sessionId, tableId, name); + return TableManager.getInstance().joinTournament(sessionId, tableId, name, playerType); } else { return false; } 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 e5e2d3ca126..cbb622cd344 100644 --- a/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java +++ b/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java @@ -106,7 +106,7 @@ public class TournamentController { checkStart(); } - public void join(UUID sessionId) { + public synchronized void join(UUID sessionId) { UUID playerId = sessionPlayerMap.get(sessionId); TournamentSession tournamentSession = new TournamentSession(tournament, sessionId, playerId); tournamentSessions.put(playerId, tournamentSession); @@ -157,8 +157,8 @@ public class TournamentController { Table table = tableManager.createTable(sessionId, matchOptions); TournamentPlayer player1 = pair.getPlayer1(); TournamentPlayer player2 = pair.getPlayer2(); - tableManager.addPlayer(getPlayerSessionId(player1.getPlayer().getId()), table.getId(), player1.getPlayer(), player1.getDeck()); - tableManager.addPlayer(getPlayerSessionId(player2.getPlayer().getId()), table.getId(), player2.getPlayer(), player2.getDeck()); + tableManager.addPlayer(getPlayerSessionId(player1.getPlayer().getId()), table.getId(), player1.getPlayer(), player1.getPlayerType(), player1.getDeck()); + tableManager.addPlayer(getPlayerSessionId(player2.getPlayer().getId()), table.getId(), player2.getPlayer(), player2.getPlayerType(), player2.getDeck()); tableManager.startMatch(sessionId, null, table.getId()); pair.setMatch(tableManager.getMatch(table.getId())); } catch (GameException ex) { diff --git a/Mage.Tests/src/test/java/org/mage/test/base/MageBase.java b/Mage.Tests/src/test/java/org/mage/test/base/MageBase.java index 37c47c90967..e7a855c7d04 100644 --- a/Mage.Tests/src/test/java/org/mage/test/base/MageBase.java +++ b/Mage.Tests/src/test/java/org/mage/test/base/MageBase.java @@ -74,8 +74,8 @@ public class MageBase { options.setWinsNeeded(1); TableView table = server.createTable(sessionId, roomId, options); System.out.println("Cards in the deck: " + Sets.loadDeck("UW Control.dck").getCards().size()); - server.joinTable(sessionId, roomId, table.getTableId(), "Human", Sets.loadDeck("UW Control.dck")); - server.joinTable(sessionId, roomId, table.getTableId(), "Computer", Sets.loadDeck("UW Control.dck")); + server.joinTable(sessionId, roomId, table.getTableId(), "Human", "Human", Sets.loadDeck("UW Control.dck")); + server.joinTable(sessionId, roomId, table.getTableId(), "Computer", "Computer - default", Sets.loadDeck("UW Control.dck")); server.startMatch(sessionId, roomId, table.getTableId()); synchronized (syncStart) { diff --git a/Mage/src/mage/game/Table.java b/Mage/src/mage/game/Table.java index eeebe6e0a4c..196ccc78c5e 100644 --- a/Mage/src/mage/game/Table.java +++ b/Mage/src/mage/game/Table.java @@ -51,16 +51,18 @@ public class Table implements Serializable { private String gameType; private Seat[] seats; private int numSeats; + private boolean isTournament; private DeckValidator validator; private TableState state = TableState.WAITING; protected TableEventSource tableEventSource = new TableEventSource(); - public Table(String gameType, String name, DeckValidator validator, List playerTypes) { + public Table(String gameType, String name, DeckValidator validator, List playerTypes, boolean isTournament) { tableId = UUID.randomUUID(); this.numSeats = playerTypes.size(); this.gameType = gameType; this.name = name; + this.isTournament = isTournament; createSeats(playerTypes); this.validator = validator; } @@ -98,6 +100,10 @@ public class Table implements Serializable { return validator.getName(); } + public boolean isTournament() { + return this.isTournament; + } + public UUID joinTable(Player player, Seat seat) throws GameException { if (seat.getPlayer() != null) { throw new GameException("Seat is occupied."); @@ -120,9 +126,9 @@ public class Table implements Serializable { return seats; } - public Seat getNextAvailableSeat() { + public Seat getNextAvailableSeat(String playerType) { for (int i = 0; i < numSeats; i++ ) { - if (seats[i].getPlayer() == null) + if (seats[i].getPlayer() == null && seats[i].getPlayerType().equals(playerType)) return seats[i]; } return null; diff --git a/Mage/src/mage/game/draft/Draft.java b/Mage/src/mage/game/draft/Draft.java index 07ec023b240..d3b04b7d13c 100644 --- a/Mage/src/mage/game/draft/Draft.java +++ b/Mage/src/mage/game/draft/Draft.java @@ -51,7 +51,7 @@ public interface Draft extends MageItem, Serializable { public List getSets(); public int getBoosterNum(); public int getCardNum(); - public void addPick(UUID playerId, UUID cardId); + public boolean addPick(UUID playerId, UUID cardId); public void start(); public boolean allJoined(); public void leave(UUID playerId); diff --git a/Mage/src/mage/game/draft/DraftImpl.java b/Mage/src/mage/game/draft/DraftImpl.java index 34ec4c434df..64bcece061d 100644 --- a/Mage/src/mage/game/draft/DraftImpl.java +++ b/Mage/src/mage/game/draft/DraftImpl.java @@ -232,18 +232,21 @@ public abstract class DraftImpl> implements Draft { } @Override - public void addPick(UUID playerId, UUID cardId) { + public boolean addPick(UUID playerId, UUID cardId) { DraftPlayer player = players.get(playerId); - for (Card card: player.booster) { - if (card.getId().equals(cardId)) { - player.addPick(card); - player.booster.remove(card); - break; + if (player.isPicking()) { + for (Card card: player.booster) { + if (card.getId().equals(cardId)) { + player.addPick(card); + player.booster.remove(card); + break; + } + } + synchronized(this) { + this.notifyAll(); } } - synchronized(this) { - this.notifyAll(); - } + return !player.isPicking(); } }