From e490d6af613d68ca6979082847fc222ada48a467 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 10 Jan 2014 19:58:55 +0100 Subject: [PATCH] Added cubes for Sealed and Daft Tournaments. Added a simple Swiss like tournament format. --- .../client/dialog/NewTournamentDialog.form | 236 +++--- .../client/dialog/NewTournamentDialog.java | 312 ++++--- .../src/mage/interfaces/ServerState.java | 8 +- Mage.Common/src/mage/remote/SessionImpl.java | 6 + .../src/mage/remote/interfaces/GameTypes.java | 2 + Mage.Common/src/mage/view/DraftView.java | 10 +- Mage.Common/src/mage/view/MatchView.java | 5 +- Mage.Common/src/mage/view/TableView.java | 5 +- .../src/mage/view/TournamentTypeView.java | 14 + ...terDraftEliminationCubeTournamentType.java | 50 ++ ...BoosterDraftEliminationTournamentType.java | 4 +- .../BoosterDraftSwissCubeTournamentType.java | 50 ++ .../BoosterDraftSwissTournament.java | 92 +++ .../BoosterDraftSwissTournamentType.java | 50 ++ .../tournament/cubes/CubeTutor360Pauper.java | 404 ++++++++++ .../mage/tournament/cubes/CubeTutor720.java | 763 ++++++++++++++++++ .../tournament/cubes/HolidayCube2013.java | 583 +++++++++++++ .../SealedEliminationCubeTournamentType.java | 50 ++ .../SealedEliminationTournamentType.java | 2 + .../SealedSwissCubeTournamentType.java | 50 ++ .../tournament/SealedSwissTournament.java | 74 ++ .../tournament/SealedSwissTournamentType.java | 50 ++ Mage.Server/config/config.xml | 15 +- Mage.Server/release/config/config.xml | 13 +- .../main/java/mage/server/MageServerImpl.java | 2 + .../src/main/java/mage/server/Main.java | 8 +- .../java/mage/server/draft/CubeFactory.java | 80 ++ .../server/game/DeckValidatorFactory.java | 3 +- .../server/tournament/TournamentFactory.java | 19 +- .../java/mage/server/util/ConfigSettings.java | 4 + .../main/xml-resources/jaxb/Config/Config.xsd | 9 + Mage/src/mage/game/draft/BoosterDraft.java | 2 +- Mage/src/mage/game/draft/Draft.java | 2 + Mage/src/mage/game/draft/DraftCube.java | 141 ++++ Mage/src/mage/game/draft/DraftImpl.java | 28 +- Mage/src/mage/game/draft/DraftOptions.java | 2 +- .../mage/game/tournament/LimitedOptions.java | 28 + Mage/src/mage/game/tournament/Round.java | 6 + Mage/src/mage/game/tournament/Tournament.java | 8 +- .../mage/game/tournament/TournamentImpl.java | 55 +- .../game/tournament/TournamentOptions.java | 9 + .../TournamentSingleElimination.java | 8 +- .../mage/game/tournament/TournamentSwiss.java | 88 +- .../mage/game/tournament/TournamentType.java | 15 +- 44 files changed, 3119 insertions(+), 246 deletions(-) create mode 100644 Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftEliminationCubeTournamentType.java create mode 100644 Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftSwissCubeTournamentType.java create mode 100644 Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftSwissTournament.java create mode 100644 Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftSwissTournamentType.java create mode 100644 Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/CubeTutor360Pauper.java create mode 100644 Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/CubeTutor720.java create mode 100644 Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/HolidayCube2013.java create mode 100644 Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/SealedEliminationCubeTournamentType.java create mode 100644 Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/SealedSwissCubeTournamentType.java create mode 100644 Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/SealedSwissTournament.java create mode 100644 Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/SealedSwissTournamentType.java create mode 100644 Mage.Server/src/main/java/mage/server/draft/CubeFactory.java create mode 100644 Mage/src/mage/game/draft/DraftCube.java 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 01d0b361c3..6fee0cf02a 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.form +++ b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.form @@ -1,6 +1,6 @@ -
+ @@ -22,18 +22,17 @@ - + - - + + - @@ -43,47 +42,54 @@ - - + + - - - - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + @@ -92,7 +98,7 @@ - + @@ -103,7 +109,7 @@ - + @@ -111,37 +117,31 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + @@ -158,6 +158,9 @@ + + + @@ -168,7 +171,7 @@ - + @@ -205,6 +208,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -229,21 +270,23 @@ - - + - + - - - + + + + + + + - @@ -264,6 +307,9 @@ + + + @@ -272,22 +318,6 @@ - - - - - - - - - - - - - - - - @@ -349,13 +379,21 @@ - + - - - - + + + + + + + + + + + + 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 1c76bcee66..4ca074d59f 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java @@ -81,6 +81,7 @@ public class NewTournamentDialog extends MageDialog { this.spnNumWins.setModel(new SpinnerNumberModel(2, 1, 5, 1)); this.spnFreeMulligans.setModel(new SpinnerNumberModel(0, 0, 5, 1)); this.spnConstructTime.setModel(new SpinnerNumberModel(10, 10, 30, 5)); + this.spnNumRounds.setModel(new SpinnerNumberModel(2, 2, 10, 1)); } public void showDialog(UUID roomId) { @@ -89,6 +90,7 @@ public class NewTournamentDialog extends MageDialog { this.txtPlayer1Name.setText(session.getUserName()); cbTournamentType.setModel(new DefaultComboBoxModel(session.getTournamentTypes().toArray())); cbTimeLimit.setModel(new DefaultComboBoxModel(MatchTimeLimit.values())); + cbDraftCube.setModel(new DefaultComboBoxModel(session.getDraftCubes())); cbDraftTiming.setModel(new DefaultComboBoxModel(DraftOptions.TimingOption.values())); cbAllowSpectators.setSelected(true); @@ -107,6 +109,7 @@ public class NewTournamentDialog extends MageDialog { @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents private void initComponents() { + bindingGroup = new org.jdesktop.beansbinding.BindingGroup(); lblName = new javax.swing.JLabel(); txtName = new javax.swing.JTextField(); @@ -114,12 +117,17 @@ public class NewTournamentDialog extends MageDialog { cbTimeLimit = new javax.swing.JComboBox(); lblConstructionTime = new javax.swing.JLabel(); spnConstructTime = new javax.swing.JSpinner(); - jLabel1 = new javax.swing.JLabel(); + lblTournamentType = new javax.swing.JLabel(); cbTournamentType = new javax.swing.JComboBox(); lblFreeMulligans = new javax.swing.JLabel(); spnFreeMulligans = new javax.swing.JSpinner(); lblNumWins = new javax.swing.JLabel(); spnNumWins = new javax.swing.JSpinner(); + lblDraftCube = new javax.swing.JLabel(); + cbDraftCube = new javax.swing.JComboBox(); + lblNumRounds = new javax.swing.JLabel(); + spnNumRounds = new javax.swing.JSpinner(); + lblPacks = new javax.swing.JLabel(); pnlPacks = new javax.swing.JPanel(); jLabel2 = new javax.swing.JLabel(); spnNumPlayers = new javax.swing.JSpinner(); @@ -127,14 +135,13 @@ public class NewTournamentDialog extends MageDialog { jLabel6 = new javax.swing.JLabel(); cbDraftTiming = new javax.swing.JComboBox(); cbAllowSpectators = new javax.swing.JCheckBox(); - btnOk = new javax.swing.JButton(); - btnCancel = new javax.swing.JButton(); jPanel1 = new javax.swing.JPanel(); jLabel3 = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); txtPlayer1Name = new javax.swing.JTextField(); pnlOtherPlayers = new javax.swing.JPanel(); - jLabel5 = new javax.swing.JLabel(); + btnOk = new javax.swing.JButton(); + btnCancel = new javax.swing.JButton(); setTitle("New Tournament"); @@ -142,9 +149,12 @@ public class NewTournamentDialog extends MageDialog { lbTimeLimit.setText("Time Limit:"); + org.jdesktop.beansbinding.Binding binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, cbTimeLimit, org.jdesktop.beansbinding.ObjectProperty.create(), lbTimeLimit, org.jdesktop.beansbinding.BeanProperty.create("labelFor")); + bindingGroup.addBinding(binding); + lblConstructionTime.setText("Construction Time (Minutes):"); - jLabel1.setText("Tournament Type:"); + lblTournamentType.setText("Tournament Type:"); cbTournamentType.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); cbTournamentType.addActionListener(new java.awt.event.ActionListener() { @@ -163,6 +173,26 @@ public class NewTournamentDialog extends MageDialog { } }); + lblDraftCube.setText("Draft Cube"); + + cbDraftCube.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); + cbDraftCube.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbDraftCubeActionPerformed(evt); + } + }); + + lblNumRounds.setText("Number of Swiss Rounds:"); + + spnNumRounds.addChangeListener(new javax.swing.event.ChangeListener() { + public void stateChanged(javax.swing.event.ChangeEvent evt) { + spnNumRoundsnumPlayersChanged(evt); + } + }); + + lblPacks.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N + lblPacks.setText("Packs"); + pnlPacks.setLayout(new java.awt.GridLayout(0, 1, 2, 0)); jLabel2.setText("Players:"); @@ -176,42 +206,34 @@ public class NewTournamentDialog extends MageDialog { jLabel6.setText("Timing:"); cbDraftTiming.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); + cbDraftTiming.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbDraftTimingActionPerformed(evt); + } + }); javax.swing.GroupLayout pnlDraftOptionsLayout = new javax.swing.GroupLayout(pnlDraftOptions); pnlDraftOptions.setLayout(pnlDraftOptionsLayout); pnlDraftOptionsLayout.setHorizontalGroup( pnlDraftOptionsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(pnlDraftOptionsLayout.createSequentialGroup() - .addContainerGap() - .addComponent(jLabel6) + .addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 49, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(cbDraftTiming, javax.swing.GroupLayout.PREFERRED_SIZE, 107, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap(19, Short.MAX_VALUE)) ); pnlDraftOptionsLayout.setVerticalGroup( pnlDraftOptionsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(pnlDraftOptionsLayout.createSequentialGroup() - .addComponent(jLabel6) - .addGap(0, 0, Short.MAX_VALUE)) - .addComponent(cbDraftTiming) + .addGap(3, 3, 3) + .addGroup(pnlDraftOptionsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(cbDraftTiming, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap()) ); cbAllowSpectators.setText("Allow spectators"); - btnOk.setText("OK"); - btnOk.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - btnOkActionPerformed(evt); - } - }); - - btnCancel.setText("Cancel"); - btnCancel.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - btnCancelActionPerformed(evt); - } - }); - jLabel3.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N jLabel3.setText("Player 1 (You)"); @@ -246,25 +268,35 @@ public class NewTournamentDialog extends MageDialog { .addComponent(pnlOtherPlayers, javax.swing.GroupLayout.DEFAULT_SIZE, 91, Short.MAX_VALUE)) ); - jLabel5.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N - jLabel5.setText("Packs"); + btnOk.setText("OK"); + btnOk.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnOkActionPerformed(evt); + } + }); + + btnCancel.setText("Cancel"); + btnCancel.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnCancelActionPerformed(evt); + } + }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(spnNumPlayers, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(spnNumPlayers, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(28, 28, 28) .addComponent(pnlDraftOptions, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(cbAllowSpectators) - .addGap(9, 9, 9)) + .addComponent(cbAllowSpectators)) .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(pnlPacks, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() @@ -273,37 +305,43 @@ public class NewTournamentDialog extends MageDialog { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btnCancel)) .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) - .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() - .addComponent(lblName) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(txtName, javax.swing.GroupLayout.PREFERRED_SIZE, 205, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(lbTimeLimit) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(cbTimeLimit, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() - .addComponent(jLabel1) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(cbTournamentType, javax.swing.GroupLayout.PREFERRED_SIZE, 295, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() + .addComponent(lblName) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(txtName, javax.swing.GroupLayout.PREFERRED_SIZE, 205, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(lbTimeLimit) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(cbTimeLimit, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(lblTournamentType) + .addComponent(lblDraftCube)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(lblConstructionTime, javax.swing.GroupLayout.PREFERRED_SIZE, 141, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(spnConstructTime, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(layout.createSequentialGroup() - .addComponent(lblFreeMulligans) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(spnFreeMulligans, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(lblNumWins) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(spnNumWins, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)))) - .addComponent(jLabel5)) - .addGap(0, 0, Short.MAX_VALUE))) + .addComponent(cbDraftCube, javax.swing.GroupLayout.PREFERRED_SIZE, 295, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(cbTournamentType, javax.swing.GroupLayout.PREFERRED_SIZE, 295, javax.swing.GroupLayout.PREFERRED_SIZE)))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(lblConstructionTime, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(spnConstructTime, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createSequentialGroup() + .addComponent(lblFreeMulligans) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(spnFreeMulligans, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(lblNumWins) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(spnNumWins, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addComponent(lblNumRounds) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(spnNumRounds, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)))) + .addComponent(lblPacks)) .addContainerGap()) ); layout.setVerticalGroup( @@ -319,38 +357,39 @@ public class NewTournamentDialog extends MageDialog { .addComponent(spnConstructTime, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel1) + .addComponent(lblTournamentType) .addComponent(cbTournamentType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblFreeMulligans) .addComponent(spnFreeMulligans, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblNumWins) .addComponent(spnNumWins, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jLabel5) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(cbDraftCube, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lblDraftCube) + .addComponent(spnNumRounds, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lblNumRounds)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(pnlPacks, javax.swing.GroupLayout.DEFAULT_SIZE, 67, Short.MAX_VALUE) - .addGap(11, 11, 11) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(jLabel2) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 21, Short.MAX_VALUE)) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(spnNumPlayers, javax.swing.GroupLayout.DEFAULT_SIZE, 23, Short.MAX_VALUE) - .addComponent(pnlDraftOptions, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addGap(14, 14, 14))) - .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(btnOk) - .addComponent(btnCancel))) - .addGroup(layout.createSequentialGroup() - .addComponent(cbAllowSpectators) - .addGap(0, 0, Short.MAX_VALUE)))) + .addComponent(lblPacks) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(pnlPacks, javax.swing.GroupLayout.DEFAULT_SIZE, 89, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(cbAllowSpectators, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(spnNumPlayers) + .addComponent(pnlDraftOptions, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(btnOk) + .addComponent(btnCancel)) + .addContainerGap()) ); + bindingGroup.bind(); + pack(); }// //GEN-END:initComponents @@ -367,6 +406,9 @@ public class NewTournamentDialog extends MageDialog { for (TournamentPlayerPanel player: players) { tOptions.getPlayerTypes().add((String) player.getPlayerType().getSelectedItem()); } + if (!tournamentType.isElimination()) { + tOptions.setNumberRounds((Integer)spnNumRounds.getValue()); + } if (tournamentType.isDraft()) { DraftOptions options = new DraftOptions(); options.setDraftType(""); @@ -378,8 +420,12 @@ public class NewTournamentDialog extends MageDialog { tOptions.setLimitedOptions(new LimitedOptions()); } tOptions.getLimitedOptions().setConstructionTime((Integer)this.spnConstructTime.getValue() * 60); - for (JComboBox pack: packs) { - tOptions.getLimitedOptions().getSetCodes().add(((ExpansionInfo) pack.getSelectedItem()).getCode()); + if (tournamentType.isCubeBooster()) { + tOptions.getLimitedOptions().setDraftCubeName(this.cbDraftCube.getSelectedItem().toString()); + } else { + for (JComboBox pack: packs) { + tOptions.getLimitedOptions().getSetCodes().add(((ExpansionInfo) pack.getSelectedItem()).getCode()); + } } } tOptions.getMatchOptions().setMatchTimeLimit((MatchTimeLimit) this.cbTimeLimit.getSelectedItem()); @@ -431,25 +477,64 @@ public class NewTournamentDialog extends MageDialog { // TODO add your handling code here: }//GEN-LAST:event_spnNumWinsnumPlayersChanged + private void cbDraftCubeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbDraftCubeActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_cbDraftCubeActionPerformed + + private void cbDraftTimingActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbDraftTimingActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_cbDraftTimingActionPerformed + + private void spnNumRoundsnumPlayersChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spnNumRoundsnumPlayersChanged + // TODO add your handling code here: + }//GEN-LAST:event_spnNumRoundsnumPlayersChanged + private void setTournamentOptions(int numbPlayers) { TournamentTypeView tournamentType = (TournamentTypeView) cbTournamentType.getSelectedItem(); + activatePanelElements(tournamentType); + if (numbPlayers < tournamentType.getMinPlayers() || numbPlayers > tournamentType.getMaxPlayers()) { numbPlayers = tournamentType.getMinPlayers(); createPlayers(numbPlayers - 1); } this.spnNumPlayers.setModel(new SpinnerNumberModel(numbPlayers, tournamentType.getMinPlayers(), tournamentType.getMaxPlayers(), 1)); this.spnNumPlayers.setEnabled(tournamentType.getMinPlayers() != tournamentType.getMaxPlayers()); + if (tournamentType.isLimited()) { - this.pnlPacks.setVisible(true); createPacks(tournamentType.getNumBoosters()); } - else { - this.pnlPacks.setVisible(false); - } - this.pnlDraftOptions.setVisible(tournamentType.isDraft()); } + /** + * Sets elements of the panel to visible or not visible + * + * @param tournamentType + */ + private void activatePanelElements(TournamentTypeView tournamentType) { + this.pnlDraftOptions.setVisible(tournamentType.isDraft()); + this.lblNumRounds.setVisible(!tournamentType.isElimination()); + this.spnNumRounds.setVisible(!tournamentType.isElimination()); + if (tournamentType.isLimited()) { + if (tournamentType.isCubeBooster()) { + this.lblDraftCube.setVisible(true); + this.cbDraftCube.setVisible(true); + this.lblPacks.setVisible(false); + this.pnlPacks.setVisible(false); + } else { + this.lblDraftCube.setVisible(false); + this.cbDraftCube.setVisible(false); + this.lblPacks.setVisible(true); + this.pnlPacks.setVisible(true); + } + } else { + // construced + this.lblDraftCube.setVisible(false); + this.cbDraftCube.setVisible(false); + this.pnlPacks.setVisible(true); + } + } + private void createPacks(int numPacks) { while (packs.size() > numPacks) { pnlPacks.remove(packs.get(packs.size() - 1)); @@ -561,22 +646,28 @@ public class NewTournamentDialog extends MageDialog { this.spnFreeMulligans.setValue(Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_NUMBER_OF_FREE_MULLIGANS, "0"))); this.spnNumWins.setValue(Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_NUMBER_OF_WINS, "2"))); - if (cbTournamentType.getSelectedItem().toString().equals("Sealed Elimination")) { - numPlayers = Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_PLAYERS_SEALED, "2")); - setTournamentOptions(numPlayers); - loadBoosterPacks(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_PACKS_SEALED, "")); - } - - if (cbTournamentType.getSelectedItem().toString().equals("Elimination Booster Draft")) { - numPlayers = Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_PLAYERS_DRAFT, "4")); - setTournamentOptions(numPlayers); - loadBoosterPacks(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_PACKS_DRAFT, "")); - String draftTiming = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_DRAFT_TIMING, "REGULAR"); - for (TimingOption timingOption : DraftOptions.TimingOption.values()) { - if (timingOption.toString().equals(draftTiming)) { - cbDraftTiming.setSelectedItem(draftTiming); - break; + TournamentTypeView tournamentType = (TournamentTypeView) cbTournamentType.getSelectedItem(); + activatePanelElements(tournamentType); + + if (tournamentType.isLimited()) { + if (!tournamentType.isDraft()) { + numPlayers = Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_PLAYERS_SEALED, "2")); + setTournamentOptions(numPlayers); + loadBoosterPacks(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_PACKS_SEALED, "")); + } + + if (tournamentType.isDraft()) { + numPlayers = Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_PLAYERS_DRAFT, "4")); + setTournamentOptions(numPlayers); + loadBoosterPacks(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_PACKS_DRAFT, "")); + + String draftTiming = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_DRAFT_TIMING, "REGULAR"); + for (TimingOption timingOption : DraftOptions.TimingOption.values()) { + if (timingOption.toString().equals(draftTiming)) { + cbDraftTiming.setSelectedItem(draftTiming); + break; + } } } } @@ -644,30 +735,35 @@ public class NewTournamentDialog extends MageDialog { private javax.swing.JButton btnCancel; private javax.swing.JButton btnOk; private javax.swing.JCheckBox cbAllowSpectators; + private javax.swing.JComboBox cbDraftCube; private javax.swing.JComboBox cbDraftTiming; private javax.swing.JComboBox cbTimeLimit; private javax.swing.JComboBox cbTournamentType; - private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; - private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JPanel jPanel1; private javax.swing.JLabel lbTimeLimit; private javax.swing.JLabel lblConstructionTime; + private javax.swing.JLabel lblDraftCube; private javax.swing.JLabel lblFreeMulligans; private javax.swing.JLabel lblName; + private javax.swing.JLabel lblNumRounds; private javax.swing.JLabel lblNumWins; + private javax.swing.JLabel lblPacks; + private javax.swing.JLabel lblTournamentType; private javax.swing.JPanel pnlDraftOptions; private javax.swing.JPanel pnlOtherPlayers; private javax.swing.JPanel pnlPacks; private javax.swing.JSpinner spnConstructTime; private javax.swing.JSpinner spnFreeMulligans; private javax.swing.JSpinner spnNumPlayers; + private javax.swing.JSpinner spnNumRounds; private javax.swing.JSpinner spnNumWins; private javax.swing.JTextField txtName; private javax.swing.JTextField txtPlayer1Name; + private org.jdesktop.beansbinding.BindingGroup bindingGroup; // End of variables declaration//GEN-END:variables } diff --git a/Mage.Common/src/mage/interfaces/ServerState.java b/Mage.Common/src/mage/interfaces/ServerState.java index 6713d0c57f..da013de981 100644 --- a/Mage.Common/src/mage/interfaces/ServerState.java +++ b/Mage.Common/src/mage/interfaces/ServerState.java @@ -44,14 +44,16 @@ public class ServerState implements Serializable { private List tournamentTypes; private String[] playerTypes; private String[] deckTypes; + private String[] draftCubes; private boolean testMode; private MageVersion version; - public ServerState(List gameTypes, List tournamentTypes, String[] playerTypes, String[] deckTypes, boolean testMode, MageVersion version) { + public ServerState(List gameTypes, List tournamentTypes, String[] playerTypes, String[] deckTypes, String[] draftCubes, boolean testMode, MageVersion version) { this.gameTypes = gameTypes; this.tournamentTypes = tournamentTypes; this.playerTypes = playerTypes; this.deckTypes = deckTypes; + this.draftCubes = draftCubes; this.testMode = testMode; this.version = version; } @@ -72,6 +74,10 @@ public class ServerState implements Serializable { return deckTypes; } + public String[] getDraftCubes() { + return draftCubes; + } + public boolean isTestMode() { return testMode; } diff --git a/Mage.Common/src/mage/remote/SessionImpl.java b/Mage.Common/src/mage/remote/SessionImpl.java index 81158fa6a5..f8862ebabf 100644 --- a/Mage.Common/src/mage/remote/SessionImpl.java +++ b/Mage.Common/src/mage/remote/SessionImpl.java @@ -339,6 +339,12 @@ public class SessionImpl implements Session { return serverState.getDeckTypes(); } + @Override + public String[] getDraftCubes() { + return serverState.getDraftCubes(); + } + + @Override public List getTournamentTypes() { return serverState.getTournamentTypes(); diff --git a/Mage.Common/src/mage/remote/interfaces/GameTypes.java b/Mage.Common/src/mage/remote/interfaces/GameTypes.java index b85178b356..a3de413a65 100644 --- a/Mage.Common/src/mage/remote/interfaces/GameTypes.java +++ b/Mage.Common/src/mage/remote/interfaces/GameTypes.java @@ -43,5 +43,7 @@ public interface GameTypes { String[] getDeckTypes(); + String[] getDraftCubes(); + List getTournamentTypes(); } diff --git a/Mage.Common/src/mage/view/DraftView.java b/Mage.Common/src/mage/view/DraftView.java index 83958b9952..9995b6e13b 100644 --- a/Mage.Common/src/mage/view/DraftView.java +++ b/Mage.Common/src/mage/view/DraftView.java @@ -46,8 +46,14 @@ public class DraftView implements Serializable { private int cardNum; public DraftView(Draft draft) { - for (ExpansionSet set: draft.getSets()) { - sets.add(set.getName()); + if (draft.getDraftCube() != null) { + for (int i = 0; i < draft.getNumberBoosters(); i++) { + sets.add(draft.getDraftCube().getName()); + } + } else { + for (ExpansionSet set: draft.getSets()) { + sets.add(set.getName()); + } } this.boosterNum = draft.getBoosterNum(); this.cardNum = draft.getCardNum(); diff --git a/Mage.Common/src/mage/view/MatchView.java b/Mage.Common/src/mage/view/MatchView.java index b7c8693d42..4bb8d0c3cf 100644 --- a/Mage.Common/src/mage/view/MatchView.java +++ b/Mage.Common/src/mage/view/MatchView.java @@ -86,7 +86,10 @@ public class MatchView implements Serializable { this.matchId = table.getTournament().getId(); this.matchName = table.getName(); this.gameType = table.getGameType(); - this.deckType = new StringBuilder(table.getDeckType()).append(" ").append(table.getTournament().getSetsFormatedShort()).toString(); + if (table.getTournament().getOptions().getNumberRounds() > 0) { + this.gameType = new StringBuilder(this.gameType).append(" ").append(table.getTournament().getOptions().getNumberRounds()).append(" Rounds").toString(); + } + this.deckType = new StringBuilder(table.getDeckType()).append(" ").append(table.getTournament().getBoosterInfo()).toString(); StringBuilder sb1 = new StringBuilder(); for (TournamentPlayer tPlayer : table.getTournament().getPlayers()) { diff --git a/Mage.Common/src/mage/view/TableView.java b/Mage.Common/src/mage/view/TableView.java index be0fdb14c1..2a4a9b01ea 100644 --- a/Mage.Common/src/mage/view/TableView.java +++ b/Mage.Common/src/mage/view/TableView.java @@ -109,6 +109,9 @@ public class TableView implements Serializable { } else { this.wins = table.getTournament().getOptions().getMatchOptions().getWinsNeeded(); + if (table.getTournament().getOptions().getNumberRounds() > 0) { + this.gameType = new StringBuilder(this.gameType).append(" ").append(table.getTournament().getOptions().getNumberRounds()).append(" Rounds").toString(); + } this.freeMulligans = table.getTournament().getOptions().getMatchOptions().getFreeMulligans(); StringBuilder sb1 = new StringBuilder(); for (TournamentPlayer tp: table.getTournament().getPlayers()) { @@ -129,7 +132,7 @@ public class TableView implements Serializable { default: } this.additionalInfo = sb.toString(); - this.deckType = new StringBuilder(table.getDeckType()).append(" ").append(table.getTournament().getSetsFormatedShort()).toString(); + this.deckType = new StringBuilder(table.getDeckType()).append(" ").append(table.getTournament().getBoosterInfo()).toString(); } } diff --git a/Mage.Common/src/mage/view/TournamentTypeView.java b/Mage.Common/src/mage/view/TournamentTypeView.java index 04c0bdb639..1ba2081d25 100644 --- a/Mage.Common/src/mage/view/TournamentTypeView.java +++ b/Mage.Common/src/mage/view/TournamentTypeView.java @@ -44,6 +44,9 @@ public class TournamentTypeView implements Serializable { private int numBoosters; private boolean draft; private boolean limited; + private boolean cubeBooster; + private boolean elimination; + public TournamentTypeView(TournamentType tournamentType) { this.name = tournamentType.getName(); @@ -52,6 +55,8 @@ public class TournamentTypeView implements Serializable { this.numBoosters = tournamentType.getNumBoosters(); this.draft = tournamentType.isDraft(); this.limited = tournamentType.isLimited(); + this.cubeBooster = tournamentType.isCubeBooster(); + this.elimination = tournamentType.isElimination(); } @Override @@ -82,4 +87,13 @@ public class TournamentTypeView implements Serializable { public boolean isLimited() { return limited; } + + public boolean isCubeBooster() { + return cubeBooster; + } + + public boolean isElimination() { + return elimination; + } + } diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftEliminationCubeTournamentType.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftEliminationCubeTournamentType.java new file mode 100644 index 0000000000..f1e5dc3603 --- /dev/null +++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftEliminationCubeTournamentType.java @@ -0,0 +1,50 @@ +/* + * 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.tournament; + +import mage.game.tournament.TournamentType; + +/** + * + * @author LevelX2 + */ +public class BoosterDraftEliminationCubeTournamentType extends TournamentType { + + public BoosterDraftEliminationCubeTournamentType() { + this.name = "Booster Draft Elimination (Cube)"; + this.maxPlayers = 16; + this.minPlayers = 4; + this.numBoosters = 3; + this.draft = true; + this.limited = true; + this.cubeBooster = true; + this.elimination = true; + } + +} \ No newline at end of file diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftEliminationTournamentType.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftEliminationTournamentType.java index 095c07955c..d0775cd389 100644 --- a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftEliminationTournamentType.java +++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftEliminationTournamentType.java @@ -37,12 +37,14 @@ import mage.game.tournament.TournamentType; public class BoosterDraftEliminationTournamentType extends TournamentType { public BoosterDraftEliminationTournamentType() { - this.name = "Elimination Booster Draft"; + this.name = "Booster Draft Elimination"; this.maxPlayers = 16; this.minPlayers = 4; this.numBoosters = 3; this.draft = true; this.limited = true; + this.cubeBooster = false; + this.elimination = true; } } diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftSwissCubeTournamentType.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftSwissCubeTournamentType.java new file mode 100644 index 0000000000..5943077200 --- /dev/null +++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftSwissCubeTournamentType.java @@ -0,0 +1,50 @@ +/* + * 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.tournament; + +import mage.game.tournament.TournamentType; + +/** + * + * @author LevelX2 + */ +public class BoosterDraftSwissCubeTournamentType extends TournamentType { + + public BoosterDraftSwissCubeTournamentType() { + this.name = "Booster Draft Swiss (Cube)"; + this.maxPlayers = 16; + this.minPlayers = 4; + this.numBoosters = 3; + this.draft = true; + this.limited = true; + this.cubeBooster = true; + this.elimination = false; + } + +} \ No newline at end of file diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftSwissTournament.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftSwissTournament.java new file mode 100644 index 0000000000..7da7c96e17 --- /dev/null +++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftSwissTournament.java @@ -0,0 +1,92 @@ +/* + * 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.tournament; + +import mage.constants.TournamentPlayerState; +import mage.game.draft.BoosterDraft; +import mage.game.draft.Draft; +import mage.game.draft.DraftOptions; +import mage.game.events.TableEvent; +import mage.game.tournament.TournamentOptions; +import mage.game.tournament.TournamentPlayer; +import mage.game.tournament.TournamentSwiss; + +/** + * + * @author BetaSteward_at_googlemail.com + */ +public class BoosterDraftSwissTournament extends TournamentSwiss { + + protected enum TournamentStep { + START, DRAFT, CONSTRUCT, COMPETE, WINNERS + } + + protected BoosterDraftSwissTournament.TournamentStep currentStep; + + public BoosterDraftSwissTournament(TournamentOptions options) { + super(options); + currentStep = BoosterDraftSwissTournament.TournamentStep.START; + } + + protected void draft() { + Draft draft = new BoosterDraft((DraftOptions) options.getLimitedOptions(), getSets()); + for (TournamentPlayer player: players.values()) { + draft.addPlayer(player.getPlayer()); + player.setState(TournamentPlayerState.DRAFTING); + } + tableEventSource.fireTableEvent(TableEvent.EventType.START_DRAFT, null, draft); + } + + + + @Override + public void nextStep() { + switch (currentStep) { + case START: + currentStep = BoosterDraftSwissTournament.TournamentStep.DRAFT; + draft(); + break; + case DRAFT: + currentStep = BoosterDraftSwissTournament.TournamentStep.CONSTRUCT; + construct(); + break; + case CONSTRUCT: + currentStep = BoosterDraftSwissTournament.TournamentStep.COMPETE; + runTournament(); + break; + case COMPETE: + currentStep = BoosterDraftSwissTournament.TournamentStep.WINNERS; + winners(); + end(); + break; + } + } + + +} diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftSwissTournamentType.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftSwissTournamentType.java new file mode 100644 index 0000000000..f13660a6a1 --- /dev/null +++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftSwissTournamentType.java @@ -0,0 +1,50 @@ +/* + * 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.tournament; + +import mage.game.tournament.TournamentType; + +/** + * + * @author LevelX2 + */ +public class BoosterDraftSwissTournamentType extends TournamentType { + + public BoosterDraftSwissTournamentType() { + this.name = "Booster Draft Swiss"; + this.maxPlayers = 16; + this.minPlayers = 4; + this.numBoosters = 3; + this.draft = true; + this.limited = true; + this.cubeBooster = false; + this.elimination = false; + } + +} \ No newline at end of file diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/CubeTutor360Pauper.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/CubeTutor360Pauper.java new file mode 100644 index 0000000000..b17d6e924d --- /dev/null +++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/CubeTutor360Pauper.java @@ -0,0 +1,404 @@ +/* +* Copyright 2010 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.tournament.cubes; + +import mage.game.draft.DraftCube; + +/** + * + * @author LevelX2 + */ +public class CubeTutor360Pauper extends DraftCube { + + public CubeTutor360Pauper() { + super("Cube Tutor 360 Pauper"); + + cubeCards.add(new CardIdentity("Doomed Traveler","")); + cubeCards.add(new CardIdentity("Gideon's Lawkeeper","")); + cubeCards.add(new CardIdentity("Goldmeadow Harrier","")); + cubeCards.add(new CardIdentity("Icatian Javelineers","")); + cubeCards.add(new CardIdentity("Steppe Lynx","")); + cubeCards.add(new CardIdentity("Blade of the Sixth Pride","")); + cubeCards.add(new CardIdentity("Daring Skyjek","")); + cubeCards.add(new CardIdentity("Knight of Cliffhaven","")); + cubeCards.add(new CardIdentity("Kor Skyfisher","")); + cubeCards.add(new CardIdentity("Leonin Skyhunter","")); + cubeCards.add(new CardIdentity("Lone Missionary","")); + cubeCards.add(new CardIdentity("Loyal Cathar","")); + cubeCards.add(new CardIdentity("Soltari Trooper","")); + cubeCards.add(new CardIdentity("Stormfront Pegasus","")); + cubeCards.add(new CardIdentity("Syndic of Tithes","")); + cubeCards.add(new CardIdentity("Whitemane Lion","")); + cubeCards.add(new CardIdentity("Youthful Knight","")); + cubeCards.add(new CardIdentity("Apex Hawks","")); + cubeCards.add(new CardIdentity("Attended Knight","")); + cubeCards.add(new CardIdentity("Aven Riftwatcher","")); + cubeCards.add(new CardIdentity("Ballynock Cohort","")); + cubeCards.add(new CardIdentity("Benalish Knight","")); + cubeCards.add(new CardIdentity("Kor Hookmaster","")); + cubeCards.add(new CardIdentity("Kor Sanctifiers","")); + cubeCards.add(new CardIdentity("Master of Diversion","")); + cubeCards.add(new CardIdentity("Coalition Honor Guard","")); + cubeCards.add(new CardIdentity("Guardian of the Guildpact","")); + cubeCards.add(new CardIdentity("Seraph of Dawn","")); + cubeCards.add(new CardIdentity("Plover Knights","")); + cubeCards.add(new CardIdentity("Totem-Guide Hartebeest","")); + cubeCards.add(new CardIdentity("Porcelain Legionnaire","")); + cubeCards.add(new CardIdentity("Cloudshift","")); + cubeCards.add(new CardIdentity("Mana Tithe","")); + cubeCards.add(new CardIdentity("Apostle's Blessing","")); + cubeCards.add(new CardIdentity("Feeling of Dread","")); + cubeCards.add(new CardIdentity("Momentary Blink","")); + cubeCards.add(new CardIdentity("Raise the Alarm","")); + cubeCards.add(new CardIdentity("Shelter","")); + cubeCards.add(new CardIdentity("Test of Faith","")); + cubeCards.add(new CardIdentity("Blinding Beam","")); + cubeCards.add(new CardIdentity("Prismatic Strands","")); + cubeCards.add(new CardIdentity("Sunlance","")); + cubeCards.add(new CardIdentity("Gather the Townsfolk","")); + cubeCards.add(new CardIdentity("Cenn's Enlistment","")); + cubeCards.add(new CardIdentity("Hyena Umbra","")); + cubeCards.add(new CardIdentity("Bonds of Faith","")); + cubeCards.add(new CardIdentity("Journey to Nowhere","")); + cubeCards.add(new CardIdentity("Pacifism","")); + cubeCards.add(new CardIdentity("Temporal Isolation","")); + cubeCards.add(new CardIdentity("Arrest","")); + cubeCards.add(new CardIdentity("Cage of Hands","")); + cubeCards.add(new CardIdentity("Oblivion Ring","")); + cubeCards.add(new CardIdentity("Faith's Fetters","")); + cubeCards.add(new CardIdentity("Cloudfin Raptor","")); + cubeCards.add(new CardIdentity("Delver of Secrets","")); + cubeCards.add(new CardIdentity("Wingcrafter","")); + cubeCards.add(new CardIdentity("Frilled Oculus","")); + cubeCards.add(new CardIdentity("Halimar Wavewatch","")); + cubeCards.add(new CardIdentity("Looter il-Kor","")); + cubeCards.add(new CardIdentity("Merfolk Looter","")); + cubeCards.add(new CardIdentity("Thought Courier","")); + cubeCards.add(new CardIdentity("Waterfront Bouncer","")); + cubeCards.add(new CardIdentity("Aether Adept","")); + cubeCards.add(new CardIdentity("Calcite Snapper","")); + cubeCards.add(new CardIdentity("Man-o'-War","")); + cubeCards.add(new CardIdentity("Pestermite","")); + cubeCards.add(new CardIdentity("Sea Gate Oracle","")); + cubeCards.add(new CardIdentity("Shaper Parasite","")); + cubeCards.add(new CardIdentity("Stealer of Secrets","")); + cubeCards.add(new CardIdentity("Stitched Drake","")); + cubeCards.add(new CardIdentity("Stormbound Geist","")); + cubeCards.add(new CardIdentity("Archaeomancer","")); + cubeCards.add(new CardIdentity("Makeshift Mauler","")); + cubeCards.add(new CardIdentity("Mist Raven","")); + cubeCards.add(new CardIdentity("Ninja of the Deep Hours","")); + cubeCards.add(new CardIdentity("Shimmering Glasskite","")); + cubeCards.add(new CardIdentity("Gryff Vanguard","")); + cubeCards.add(new CardIdentity("Mnemonic Wall","")); + cubeCards.add(new CardIdentity("Mulldrifter","")); + cubeCards.add(new CardIdentity("Aethersnipe","")); + cubeCards.add(new CardIdentity("Errant Ephemeron","")); + cubeCards.add(new CardIdentity("Spined Thopter","")); + cubeCards.add(new CardIdentity("Brainstorm","")); + cubeCards.add(new CardIdentity("Force Spike","")); + cubeCards.add(new CardIdentity("Boomerang","")); + cubeCards.add(new CardIdentity("Counterspell","")); + cubeCards.add(new CardIdentity("Daze","")); + cubeCards.add(new CardIdentity("Into the Roil","")); + cubeCards.add(new CardIdentity("Jilt","")); + cubeCards.add(new CardIdentity("Mana Leak","")); + cubeCards.add(new CardIdentity("Miscalculation","")); + cubeCards.add(new CardIdentity("Remove Soul","")); + cubeCards.add(new CardIdentity("Think Twice","")); + cubeCards.add(new CardIdentity("Withdraw","")); + cubeCards.add(new CardIdentity("Capsize","")); + cubeCards.add(new CardIdentity("Exclude","")); + cubeCards.add(new CardIdentity("Forbidden Alchemy","")); + cubeCards.add(new CardIdentity("Repulse","")); + cubeCards.add(new CardIdentity("Rushing River","")); + cubeCards.add(new CardIdentity("Ray of Command","")); + cubeCards.add(new CardIdentity("Condescend","")); + cubeCards.add(new CardIdentity("Ponder","")); + cubeCards.add(new CardIdentity("Preordain","")); + cubeCards.add(new CardIdentity("Silent Departure","")); + cubeCards.add(new CardIdentity("Hands of Binding","")); + cubeCards.add(new CardIdentity("Compulsive Research","")); + cubeCards.add(new CardIdentity("Probe","")); + cubeCards.add(new CardIdentity("Deep Analysis","")); + cubeCards.add(new CardIdentity("Foresee","")); + cubeCards.add(new CardIdentity("Narcolepsy","")); + cubeCards.add(new CardIdentity("Claustrophobia","")); + cubeCards.add(new CardIdentity("Carnophage","")); + cubeCards.add(new CardIdentity("Fume Spitter","")); + cubeCards.add(new CardIdentity("Typhoid Rats","")); + cubeCards.add(new CardIdentity("Vampire Lacerator","")); + cubeCards.add(new CardIdentity("Basilica Screecher","")); + cubeCards.add(new CardIdentity("Blind Creeper","")); + cubeCards.add(new CardIdentity("Dauthi Horror","")); + cubeCards.add(new CardIdentity("Dauthi Slayer","")); + cubeCards.add(new CardIdentity("Nezumi Cutthroat","")); + cubeCards.add(new CardIdentity("Vampire Interloper","")); + cubeCards.add(new CardIdentity("Wretched Anurid","")); + cubeCards.add(new CardIdentity("Blind Zealot","")); + cubeCards.add(new CardIdentity("Chittering Rats","")); + cubeCards.add(new CardIdentity("Crypt Rats","")); + cubeCards.add(new CardIdentity("Dauthi Marauder","")); + cubeCards.add(new CardIdentity("Dead Reveler","")); + cubeCards.add(new CardIdentity("Liliana's Specter","")); + cubeCards.add(new CardIdentity("Phyrexian Rager","")); + cubeCards.add(new CardIdentity("Soulcage Fiend","")); + cubeCards.add(new CardIdentity("Driver of the Dead","")); + cubeCards.add(new CardIdentity("Faceless Butcher","")); + cubeCards.add(new CardIdentity("Gravedigger","")); + cubeCards.add(new CardIdentity("Mortis Dogs","")); + cubeCards.add(new CardIdentity("Okiba-Gang Shinobi","")); + cubeCards.add(new CardIdentity("Warren Pilferers","")); + cubeCards.add(new CardIdentity("Twisted Abomination","")); + cubeCards.add(new CardIdentity("Vault Skirge","")); + cubeCards.add(new CardIdentity("Pith Driller","")); + cubeCards.add(new CardIdentity("Disfigure","")); + cubeCards.add(new CardIdentity("Tragic Slip","")); + cubeCards.add(new CardIdentity("Undying Evil","")); + cubeCards.add(new CardIdentity("Vendetta","")); + cubeCards.add(new CardIdentity("Devour Flesh","")); + cubeCards.add(new CardIdentity("Diabolic Edict","")); + cubeCards.add(new CardIdentity("Doom Blade","")); + cubeCards.add(new CardIdentity("Grim Harvest","")); + cubeCards.add(new CardIdentity("Last Gasp","")); + cubeCards.add(new CardIdentity("Nameless Inversion","")); + cubeCards.add(new CardIdentity("Terror","")); + cubeCards.add(new CardIdentity("Rend Flesh","")); + cubeCards.add(new CardIdentity("Snuff Out","")); + cubeCards.add(new CardIdentity("Death Denied","")); + cubeCards.add(new CardIdentity("Duress","")); + cubeCards.add(new CardIdentity("Unearth","")); + cubeCards.add(new CardIdentity("Disturbed Burial","")); + cubeCards.add(new CardIdentity("Hymn to Tourach","")); + cubeCards.add(new CardIdentity("Sign in Blood","")); + cubeCards.add(new CardIdentity("Ashes to Ashes","")); + cubeCards.add(new CardIdentity("Crippling Fatigue","")); + cubeCards.add(new CardIdentity("Read the Bones","")); + cubeCards.add(new CardIdentity("Evincar's Justice","")); + cubeCards.add(new CardIdentity("Dead Weight","")); + cubeCards.add(new CardIdentity("Stab Wound","")); + cubeCards.add(new CardIdentity("Pestilence","")); + cubeCards.add(new CardIdentity("Goblin Bushwhacker","")); + cubeCards.add(new CardIdentity("Mogg Fanatic","")); + cubeCards.add(new CardIdentity("Ashmouth Hound","")); + cubeCards.add(new CardIdentity("Fireslinger","")); + cubeCards.add(new CardIdentity("Gore-House Chainwalker","")); + cubeCards.add(new CardIdentity("Keldon Marauders","")); + cubeCards.add(new CardIdentity("Mogg Flunkies","")); + cubeCards.add(new CardIdentity("Mogg War Marshal","")); + cubeCards.add(new CardIdentity("Plated Geopede","")); + cubeCards.add(new CardIdentity("Skirk Marauder","")); + cubeCards.add(new CardIdentity("Sparksmith","")); + cubeCards.add(new CardIdentity("Torch Fiend","")); + cubeCards.add(new CardIdentity("Blood Ogre","")); + cubeCards.add(new CardIdentity("Fervent Cathar","")); + cubeCards.add(new CardIdentity("Ghitu Slinger","")); + cubeCards.add(new CardIdentity("Hanweir Lancer","")); + cubeCards.add(new CardIdentity("Splatter Thug","")); + cubeCards.add(new CardIdentity("Vulshok Sorcerer","")); + cubeCards.add(new CardIdentity("Gorehorn Minotaurs","")); + cubeCards.add(new CardIdentity("Rubblebelt Maaka","")); + cubeCards.add(new CardIdentity("Gathan Raiders","")); + cubeCards.add(new CardIdentity("Slash Panther","")); + cubeCards.add(new CardIdentity("Brute Force","")); + cubeCards.add(new CardIdentity("Burst Lightning","")); + cubeCards.add(new CardIdentity("Lightning Bolt","")); + cubeCards.add(new CardIdentity("Incinerate","")); + cubeCards.add(new CardIdentity("Lash Out","")); + cubeCards.add(new CardIdentity("Searing Blaze","")); + cubeCards.add(new CardIdentity("Searing Spear","")); + cubeCards.add(new CardIdentity("Barbed Lightning","")); + cubeCards.add(new CardIdentity("Brimstone Volley","")); + cubeCards.add(new CardIdentity("Staggershock","")); + cubeCards.add(new CardIdentity("Fireblast","")); + cubeCards.add(new CardIdentity("Chain Lightning","")); + cubeCards.add(new CardIdentity("Faithless Looting","")); + cubeCards.add(new CardIdentity("Firebolt","")); + cubeCards.add(new CardIdentity("Flame Slash","")); + cubeCards.add(new CardIdentity("Reckless Charge","")); + cubeCards.add(new CardIdentity("Krenko's Command","")); + cubeCards.add(new CardIdentity("Volcanic Hammer","")); + cubeCards.add(new CardIdentity("Act of Treason","")); + cubeCards.add(new CardIdentity("Arc Lightning","")); + cubeCards.add(new CardIdentity("Rift Bolt","")); + cubeCards.add(new CardIdentity("Traitorous Instinct","")); + cubeCards.add(new CardIdentity("Pyrotechnics","")); + cubeCards.add(new CardIdentity("Fireball","")); + cubeCards.add(new CardIdentity("Rolling Thunder","")); + cubeCards.add(new CardIdentity("Madcap Skills","")); + cubeCards.add(new CardIdentity("Arbor Elf","")); + cubeCards.add(new CardIdentity("Basking Rootwalla","")); + cubeCards.add(new CardIdentity("Fyndhorn Elves","")); + cubeCards.add(new CardIdentity("Llanowar Elves","")); + cubeCards.add(new CardIdentity("Wild Nacatl","")); + cubeCards.add(new CardIdentity("Young Wolf","")); + cubeCards.add(new CardIdentity("Ambush Viper","")); + cubeCards.add(new CardIdentity("Darkthicket Wolf","")); + cubeCards.add(new CardIdentity("Dawntreader Elk","")); + cubeCards.add(new CardIdentity("Garruk's Companion","")); + cubeCards.add(new CardIdentity("Mire Boa","")); + cubeCards.add(new CardIdentity("River Boa","")); + cubeCards.add(new CardIdentity("Sakura-Tribe Elder","")); + cubeCards.add(new CardIdentity("Silhana Ledgewalker","")); + cubeCards.add(new CardIdentity("Thornweald Archer","")); + cubeCards.add(new CardIdentity("Viridian Emissary","")); + cubeCards.add(new CardIdentity("Wall of Roots","")); + cubeCards.add(new CardIdentity("Wild Mongrel","")); + cubeCards.add(new CardIdentity("Citanul Woodreaders","")); + cubeCards.add(new CardIdentity("Crocanura","")); + cubeCards.add(new CardIdentity("Simian Grunts","")); + cubeCards.add(new CardIdentity("Slaughterhorn","")); + cubeCards.add(new CardIdentity("Trusted Forcemage","")); + cubeCards.add(new CardIdentity("Yavimaya Elder","")); + cubeCards.add(new CardIdentity("Blastoderm","")); + cubeCards.add(new CardIdentity("Imperiosaur","")); + cubeCards.add(new CardIdentity("Mold Shambler","")); + cubeCards.add(new CardIdentity("Nantuko Vigilante","")); + cubeCards.add(new CardIdentity("Penumbra Spider","")); + cubeCards.add(new CardIdentity("Primal Huntbeast","")); + cubeCards.add(new CardIdentity("Wickerbough Elder","")); + cubeCards.add(new CardIdentity("Nessian Asp","")); + cubeCards.add(new CardIdentity("Sentinel Spider","")); + cubeCards.add(new CardIdentity("Krosan Tusker","")); + cubeCards.add(new CardIdentity("Maul Splicer","")); + cubeCards.add(new CardIdentity("Walker of the Grove","")); + cubeCards.add(new CardIdentity("Thundering Tanadon","")); + cubeCards.add(new CardIdentity("Giant Growth","")); + cubeCards.add(new CardIdentity("Groundswell","")); + cubeCards.add(new CardIdentity("Vines of Vastwood","")); + cubeCards.add(new CardIdentity("Sprout Swarm","")); + cubeCards.add(new CardIdentity("Crushing Vines","")); + cubeCards.add(new CardIdentity("Harrow","")); + cubeCards.add(new CardIdentity("Elephant Ambush","")); + cubeCards.add(new CardIdentity("Prey Upon","")); + cubeCards.add(new CardIdentity("Edge of Autumn","")); + cubeCards.add(new CardIdentity("Rampant Growth","")); + cubeCards.add(new CardIdentity("Travel Preparations","")); + cubeCards.add(new CardIdentity("Cultivate","")); + cubeCards.add(new CardIdentity("Kodama's Reach","")); + cubeCards.add(new CardIdentity("Rancor","")); + cubeCards.add(new CardIdentity("Arachnus Web","")); + cubeCards.add(new CardIdentity("Moldervine Cloak","")); + cubeCards.add(new CardIdentity("Deputy of Acquittals","")); + cubeCards.add(new CardIdentity("Curse of Chains","")); + cubeCards.add(new CardIdentity("Agony Warp","")); + cubeCards.add(new CardIdentity("Recoil","")); + cubeCards.add(new CardIdentity("Soul Manipulation","")); + cubeCards.add(new CardIdentity("Rakdos Shred-Freak","")); + cubeCards.add(new CardIdentity("Terminate","")); + cubeCards.add(new CardIdentity("Auger Spree","")); + cubeCards.add(new CardIdentity("Wrecking Ball","")); + cubeCards.add(new CardIdentity("Blightning","")); + cubeCards.add(new CardIdentity("Zhur-Taa Swine","")); + cubeCards.add(new CardIdentity("Pit Fight","")); + cubeCards.add(new CardIdentity("Branching Bolt","")); + cubeCards.add(new CardIdentity("Qasali Pridemage","")); + cubeCards.add(new CardIdentity("Centaur Healer","")); + cubeCards.add(new CardIdentity("Armadillo Cloak","")); + cubeCards.add(new CardIdentity("Tithe Drinker","")); + cubeCards.add(new CardIdentity("Kingpin's Pet","")); + cubeCards.add(new CardIdentity("Blind Hunter","")); + cubeCards.add(new CardIdentity("Unmake","")); + cubeCards.add(new CardIdentity("Pillory of the Sleepless","")); + cubeCards.add(new CardIdentity("Putrid Leech","")); + cubeCards.add(new CardIdentity("Rendclaw Trow","")); + cubeCards.add(new CardIdentity("Sluiceway Scorpion","")); + cubeCards.add(new CardIdentity("Grisly Salvage","")); + cubeCards.add(new CardIdentity("Consume Strength","")); + cubeCards.add(new CardIdentity("Shambleshark","")); + cubeCards.add(new CardIdentity("Beetleform Mage","")); + cubeCards.add(new CardIdentity("Assault Zeppelid","")); + cubeCards.add(new CardIdentity("Snakeform","")); + cubeCards.add(new CardIdentity("Frostburn Weird","")); + cubeCards.add(new CardIdentity("Goblin Electromancer","")); + cubeCards.add(new CardIdentity("Izzet Chronarch","")); + cubeCards.add(new CardIdentity("Goblin Legionnaire","")); + cubeCards.add(new CardIdentity("Wojek Halberdiers","")); + cubeCards.add(new CardIdentity("Skyknight Legionnaire","")); + cubeCards.add(new CardIdentity("Viashino Firstblade","")); + cubeCards.add(new CardIdentity("Martial Glory","")); + cubeCards.add(new CardIdentity("Ulamog's Crusher","")); + cubeCards.add(new CardIdentity("Perilous Myr","")); + cubeCards.add(new CardIdentity("Pilgrim's Eye","")); + cubeCards.add(new CardIdentity("Adventuring Gear","")); + cubeCards.add(new CardIdentity("Blazing Torch","")); + cubeCards.add(new CardIdentity("Bonesplitter","")); + cubeCards.add(new CardIdentity("Flayer Husk","")); + cubeCards.add(new CardIdentity("Leonin Bola","")); + cubeCards.add(new CardIdentity("Leonin Scimitar","")); + cubeCards.add(new CardIdentity("Sylvok Lifestaff","")); + cubeCards.add(new CardIdentity("Viridian Longbow","")); + cubeCards.add(new CardIdentity("Wayfarer's Bauble","")); + cubeCards.add(new CardIdentity("Armillary Sphere","")); + cubeCards.add(new CardIdentity("Azorius Signet","")); + cubeCards.add(new CardIdentity("Dimir Signet","")); + cubeCards.add(new CardIdentity("Izzet Signet","")); + cubeCards.add(new CardIdentity("Mind Stone","")); + cubeCards.add(new CardIdentity("Orzhov Signet","")); + cubeCards.add(new CardIdentity("Prismatic Lens","")); + cubeCards.add(new CardIdentity("Prophetic Prism","")); + cubeCards.add(new CardIdentity("Vulshok Morningstar","")); + cubeCards.add(new CardIdentity("Pristine Talisman","")); + cubeCards.add(new CardIdentity("Strider Harness","")); + cubeCards.add(new CardIdentity("Tumble Magnet","")); + cubeCards.add(new CardIdentity("Whispersilk Cloak","")); + cubeCards.add(new CardIdentity("Serrated Arrows","")); + cubeCards.add(new CardIdentity("Azorius Chancery","")); + cubeCards.add(new CardIdentity("Azorius Guildgate","")); + cubeCards.add(new CardIdentity("Boros Garrison","")); + cubeCards.add(new CardIdentity("Boros Guildgate","")); + cubeCards.add(new CardIdentity("Desert","")); + cubeCards.add(new CardIdentity("Dimir Aqueduct","")); + cubeCards.add(new CardIdentity("Dimir Guildgate","")); + cubeCards.add(new CardIdentity("Evolving Wilds","")); + cubeCards.add(new CardIdentity("Golgari Guildgate","")); + cubeCards.add(new CardIdentity("Golgari Rot Farm","")); + cubeCards.add(new CardIdentity("Gruul Guildgate","")); + cubeCards.add(new CardIdentity("Gruul Turf","")); + cubeCards.add(new CardIdentity("Halimar Depths","")); + cubeCards.add(new CardIdentity("Haunted Fengraf","")); + cubeCards.add(new CardIdentity("Izzet Boilerworks","")); + cubeCards.add(new CardIdentity("Izzet Guildgate","")); + cubeCards.add(new CardIdentity("Khalni Garden","")); + cubeCards.add(new CardIdentity("Orzhov Basilica","")); + cubeCards.add(new CardIdentity("Orzhov Guildgate","")); + cubeCards.add(new CardIdentity("Quicksand","")); + cubeCards.add(new CardIdentity("Rakdos Carnarium","")); + cubeCards.add(new CardIdentity("Rakdos Guildgate","")); + cubeCards.add(new CardIdentity("Rupture Spire","")); + cubeCards.add(new CardIdentity("Selesnya Guildgate","")); + cubeCards.add(new CardIdentity("Selesnya Sanctuary","")); + cubeCards.add(new CardIdentity("Simic Growth Chamber","")); + cubeCards.add(new CardIdentity("Simic Guildgate","")); + cubeCards.add(new CardIdentity("Teetering Peaks","")); + cubeCards.add(new CardIdentity("Terramorphic Expanse","")); + cubeCards.add(new CardIdentity("Transguild Promenade","")); + + + } +} diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/CubeTutor720.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/CubeTutor720.java new file mode 100644 index 0000000000..f5fcd6d35a --- /dev/null +++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/CubeTutor720.java @@ -0,0 +1,763 @@ +/* +* Copyright 2010 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.tournament.cubes; + +import mage.game.draft.DraftCube; + +/** + * + * @author LevelX2 + */ +public class CubeTutor720 extends DraftCube { + + public CubeTutor720() { + super("Cube Tutor 720"); + + cubeCards.add(new CardIdentity("Elite Vanguard","")); + cubeCards.add(new CardIdentity("Gideon's Lawkeeper","")); + cubeCards.add(new CardIdentity("Isamaru, Hound of Konda","")); + cubeCards.add(new CardIdentity("Loam Lion","")); + cubeCards.add(new CardIdentity("Mother of Runes","")); + cubeCards.add(new CardIdentity("Savannah Lions","")); + cubeCards.add(new CardIdentity("Soldier of the Pantheon","")); + cubeCards.add(new CardIdentity("Steppe Lynx","")); + cubeCards.add(new CardIdentity("Student of Warfare","")); + cubeCards.add(new CardIdentity("Weathered Wayfarer","")); + cubeCards.add(new CardIdentity("Accorder Paladin","")); + cubeCards.add(new CardIdentity("Cloistered Youth","")); + cubeCards.add(new CardIdentity("Eight-and-a-Half-Tails","")); + cubeCards.add(new CardIdentity("Imposing Sovereign","")); + cubeCards.add(new CardIdentity("Knight of Glory","")); + cubeCards.add(new CardIdentity("Knight of Meadowgrain","")); + cubeCards.add(new CardIdentity("Kor Skyfisher","")); + cubeCards.add(new CardIdentity("Leonin Relic-Warder","")); + cubeCards.add(new CardIdentity("Lone Missionary","")); + cubeCards.add(new CardIdentity("Precinct Captain","")); + cubeCards.add(new CardIdentity("Soltari Monk","")); + cubeCards.add(new CardIdentity("Soltari Priest","")); + cubeCards.add(new CardIdentity("Soltari Trooper","")); + cubeCards.add(new CardIdentity("Stoneforge Mystic","")); + cubeCards.add(new CardIdentity("Thalia, Guardian of Thraben","")); + cubeCards.add(new CardIdentity("Wall of Omens","")); + cubeCards.add(new CardIdentity("Banisher Priest","")); + cubeCards.add(new CardIdentity("Blade Splicer","")); + cubeCards.add(new CardIdentity("Fiend Hunter","")); + cubeCards.add(new CardIdentity("Flickerwisp","")); + cubeCards.add(new CardIdentity("Frontline Medic","")); + cubeCards.add(new CardIdentity("Kor Sanctifiers","")); + cubeCards.add(new CardIdentity("Mentor of the Meek","")); + cubeCards.add(new CardIdentity("Mirran Crusader","")); + cubeCards.add(new CardIdentity("Mirror Entity","")); + cubeCards.add(new CardIdentity("Silverblade Paladin","")); + cubeCards.add(new CardIdentity("Soltari Champion","")); + cubeCards.add(new CardIdentity("Stonecloaker","")); + cubeCards.add(new CardIdentity("Emeria Angel","")); + cubeCards.add(new CardIdentity("Hero of Bladehold","")); + cubeCards.add(new CardIdentity("Ranger of Eos","")); + cubeCards.add(new CardIdentity("Restoration Angel","")); + cubeCards.add(new CardIdentity("Sublime Archangel","")); + cubeCards.add(new CardIdentity("Baneslayer Angel","")); + cubeCards.add(new CardIdentity("Cloudgoat Ranger","")); + cubeCards.add(new CardIdentity("Geist-Honored Monk","")); + cubeCards.add(new CardIdentity("Karmic Guide","")); + cubeCards.add(new CardIdentity("Reveillark","")); + cubeCards.add(new CardIdentity("Exalted Angel","")); + cubeCards.add(new CardIdentity("Mikaeus, the Lunarch","")); + cubeCards.add(new CardIdentity("Sun Titan","")); + cubeCards.add(new CardIdentity("Yosei, the Morning Star","")); + cubeCards.add(new CardIdentity("Angel of Serenity","")); + cubeCards.add(new CardIdentity("Elesh Norn, Grand Cenobite","")); + cubeCards.add(new CardIdentity("Eternal Dragon","")); + cubeCards.add(new CardIdentity("Akroma, Angel of Wrath","")); + cubeCards.add(new CardIdentity("Ajani, Caller of the Pride","")); + cubeCards.add(new CardIdentity("Ajani Goldmane","")); + cubeCards.add(new CardIdentity("Elspeth, Knight-Errant","")); + cubeCards.add(new CardIdentity("Elspeth Tirel","")); + cubeCards.add(new CardIdentity("Gideon Jura","")); + cubeCards.add(new CardIdentity("Elspeth, Sun's Champion","")); + cubeCards.add(new CardIdentity("Porcelain Legionnaire","")); + cubeCards.add(new CardIdentity("Condemn","")); + cubeCards.add(new CardIdentity("Enlightened Tutor","")); + cubeCards.add(new CardIdentity("Mana Tithe","")); + cubeCards.add(new CardIdentity("Path to Exile","")); + cubeCards.add(new CardIdentity("Swords to Plowshares","")); + cubeCards.add(new CardIdentity("Disenchant","")); + cubeCards.add(new CardIdentity("Momentary Blink","")); + cubeCards.add(new CardIdentity("Balance","")); + cubeCards.add(new CardIdentity("Lingering Souls","")); + cubeCards.add(new CardIdentity("Spectral Procession","")); + cubeCards.add(new CardIdentity("Armageddon","")); + cubeCards.add(new CardIdentity("Day of Judgment","")); + cubeCards.add(new CardIdentity("Wrath of God","")); + cubeCards.add(new CardIdentity("Akroma's Vengeance","")); + cubeCards.add(new CardIdentity("Catastrophe","")); + cubeCards.add(new CardIdentity("Terminus","")); + cubeCards.add(new CardIdentity("Martial Coup","")); + cubeCards.add(new CardIdentity("Entreat the Angels","")); + cubeCards.add(new CardIdentity("Decree of Justice","")); + cubeCards.add(new CardIdentity("Land Tax","")); + cubeCards.add(new CardIdentity("Honor of the Pure","")); + cubeCards.add(new CardIdentity("Journey to Nowhere","")); + cubeCards.add(new CardIdentity("Pacifism","")); + cubeCards.add(new CardIdentity("Seal of Cleansing","")); + cubeCards.add(new CardIdentity("Glorious Anthem","")); + cubeCards.add(new CardIdentity("Oblivion Ring","")); + cubeCards.add(new CardIdentity("Angelic Destiny","")); + cubeCards.add(new CardIdentity("Faith's Fetters","")); + cubeCards.add(new CardIdentity("Parallax Wave","")); + cubeCards.add(new CardIdentity("Spear of Heliod","")); + cubeCards.add(new CardIdentity("Delver of Secrets","")); + cubeCards.add(new CardIdentity("Enclave Cryptologist","")); + cubeCards.add(new CardIdentity("Augur of Bolas","")); + cubeCards.add(new CardIdentity("Gilded Drake","")); + cubeCards.add(new CardIdentity("Looter il-Kor","")); + cubeCards.add(new CardIdentity("Merfolk Looter","")); + cubeCards.add(new CardIdentity("Phantasmal Image","")); + cubeCards.add(new CardIdentity("Snapcaster Mage","")); + cubeCards.add(new CardIdentity("Waterfront Bouncer","")); + cubeCards.add(new CardIdentity("Willbender","")); + cubeCards.add(new CardIdentity("Aether Adept","")); + cubeCards.add(new CardIdentity("Kira, Great Glass-Spinner","")); + cubeCards.add(new CardIdentity("Man-o'-War","")); + cubeCards.add(new CardIdentity("Pestermite","")); + cubeCards.add(new CardIdentity("Sea Gate Oracle","")); + cubeCards.add(new CardIdentity("Serendib Efreet","")); + cubeCards.add(new CardIdentity("Trinket Mage","")); + cubeCards.add(new CardIdentity("Vendilion Clique","")); + cubeCards.add(new CardIdentity("Clone","")); + cubeCards.add(new CardIdentity("Dungeon Geists","")); + cubeCards.add(new CardIdentity("Glen Elendra Archmage","")); + cubeCards.add(new CardIdentity("Ninja of the Deep Hours","")); + cubeCards.add(new CardIdentity("Sower of Temptation","")); + cubeCards.add(new CardIdentity("Talrand, Sky Summoner","")); + cubeCards.add(new CardIdentity("Venser, Shaper Savant","")); + cubeCards.add(new CardIdentity("Meloku the Clouded Mirror","")); + cubeCards.add(new CardIdentity("Mulldrifter","")); + cubeCards.add(new CardIdentity("Riftwing Cloudskate","")); + cubeCards.add(new CardIdentity("Teferi, Mage of Zhalfir","")); + cubeCards.add(new CardIdentity("Aetherling","")); + cubeCards.add(new CardIdentity("Consecrated Sphinx","")); + cubeCards.add(new CardIdentity("Frost Titan","")); + cubeCards.add(new CardIdentity("Keiga, the Tide Star","")); + cubeCards.add(new CardIdentity("Sphinx of Jwar Isle","")); + cubeCards.add(new CardIdentity("Jace Beleren","")); + cubeCards.add(new CardIdentity("Jace, Architect of Thought","")); + cubeCards.add(new CardIdentity("Jace, the Mind Sculptor","")); + cubeCards.add(new CardIdentity("Tamiyo, the Moon Sage","")); + cubeCards.add(new CardIdentity("Tezzeret the Seeker","")); + cubeCards.add(new CardIdentity("Phyrexian Metamorph","")); + cubeCards.add(new CardIdentity("Inkwell Leviathan","")); + cubeCards.add(new CardIdentity("Ancestral Recall","")); + cubeCards.add(new CardIdentity("Brainstorm","")); + cubeCards.add(new CardIdentity("Force Spike","")); + cubeCards.add(new CardIdentity("Mystical Tutor","")); + cubeCards.add(new CardIdentity("Spell Pierce","")); + cubeCards.add(new CardIdentity("Arcane Denial","")); + cubeCards.add(new CardIdentity("Counterspell","")); + cubeCards.add(new CardIdentity("Cyclonic Rift","")); + cubeCards.add(new CardIdentity("Daze","")); + cubeCards.add(new CardIdentity("Impulse","")); + cubeCards.add(new CardIdentity("Into the Roil","")); + cubeCards.add(new CardIdentity("Mana Drain","")); + cubeCards.add(new CardIdentity("Mana Leak","")); + cubeCards.add(new CardIdentity("Memory Lapse","")); + cubeCards.add(new CardIdentity("Miscalculation","")); + cubeCards.add(new CardIdentity("Negate","")); + cubeCards.add(new CardIdentity("Remand","")); + cubeCards.add(new CardIdentity("Capsize","")); + cubeCards.add(new CardIdentity("Dissipate","")); + cubeCards.add(new CardIdentity("Forbid","")); + cubeCards.add(new CardIdentity("Forbidden Alchemy","")); + cubeCards.add(new CardIdentity("Frantic Search","")); + cubeCards.add(new CardIdentity("Psionic Blast","")); + cubeCards.add(new CardIdentity("Thirst for Knowledge","")); + cubeCards.add(new CardIdentity("Cryptic Command","")); + cubeCards.add(new CardIdentity("Fact or Fiction","")); + cubeCards.add(new CardIdentity("Gifts Ungiven","")); + cubeCards.add(new CardIdentity("Force of Will","")); + cubeCards.add(new CardIdentity("Pact of Negation","")); + cubeCards.add(new CardIdentity("Condescend","")); + cubeCards.add(new CardIdentity("Repeal","")); + cubeCards.add(new CardIdentity("Ancestral Vision","")); + cubeCards.add(new CardIdentity("Ponder","")); + cubeCards.add(new CardIdentity("Preordain","")); + cubeCards.add(new CardIdentity("Time Walk","")); + cubeCards.add(new CardIdentity("Compulsive Research","")); + cubeCards.add(new CardIdentity("Show and Tell","")); + cubeCards.add(new CardIdentity("Tinker","")); + cubeCards.add(new CardIdentity("Deep Analysis","")); + cubeCards.add(new CardIdentity("Bribery","")); + cubeCards.add(new CardIdentity("Time Warp","")); + cubeCards.add(new CardIdentity("Time Spiral","")); + cubeCards.add(new CardIdentity("Upheaval","")); + cubeCards.add(new CardIdentity("Control Magic","")); + cubeCards.add(new CardIdentity("Opposition","")); + cubeCards.add(new CardIdentity("Treachery","")); + cubeCards.add(new CardIdentity("Thassa, God of the Sea","")); + cubeCards.add(new CardIdentity("Carnophage","")); + cubeCards.add(new CardIdentity("Carrion Feeder","")); + cubeCards.add(new CardIdentity("Diregraf Ghoul","")); + cubeCards.add(new CardIdentity("Gravecrawler","")); + cubeCards.add(new CardIdentity("Tormented Hero","")); + cubeCards.add(new CardIdentity("Vampire Lacerator","")); + cubeCards.add(new CardIdentity("Blood Artist","")); + cubeCards.add(new CardIdentity("Blood Scrivener","")); + cubeCards.add(new CardIdentity("Bloodghast","")); + cubeCards.add(new CardIdentity("Dark Confidant","")); + cubeCards.add(new CardIdentity("Dauthi Horror","")); + cubeCards.add(new CardIdentity("Gatekeeper of Malakir","")); + cubeCards.add(new CardIdentity("Knight of Infamy","")); + cubeCards.add(new CardIdentity("Nantuko Shade","")); + cubeCards.add(new CardIdentity("Nezumi Graverobber","")); + cubeCards.add(new CardIdentity("Oona's Prowler","")); + cubeCards.add(new CardIdentity("Pack Rat","")); + cubeCards.add(new CardIdentity("Reassembling Skeleton","")); + cubeCards.add(new CardIdentity("Vampire Hexmage","")); + cubeCards.add(new CardIdentity("Bone Shredder","")); + cubeCards.add(new CardIdentity("Fleshbag Marauder","")); + cubeCards.add(new CardIdentity("Geralf's Messenger","")); + cubeCards.add(new CardIdentity("Hypnotic Specter","")); + cubeCards.add(new CardIdentity("Phyrexian Rager","")); + cubeCards.add(new CardIdentity("Vampire Nighthawk","")); + cubeCards.add(new CardIdentity("Abyssal Persecutor","")); + cubeCards.add(new CardIdentity("Bane of the Living","")); + cubeCards.add(new CardIdentity("Bloodline Keeper","")); + cubeCards.add(new CardIdentity("Braids, Cabal Minion","")); + cubeCards.add(new CardIdentity("Crypt Ghast","")); + cubeCards.add(new CardIdentity("Desecration Demon","")); + cubeCards.add(new CardIdentity("Disciple of Bolas","")); + cubeCards.add(new CardIdentity("Graveborn Muse","")); + cubeCards.add(new CardIdentity("Nekrataal","")); + cubeCards.add(new CardIdentity("Skinrender","")); + cubeCards.add(new CardIdentity("Bloodgift Demon","")); + cubeCards.add(new CardIdentity("Shriekmaw","")); + cubeCards.add(new CardIdentity("Grave Titan","")); + cubeCards.add(new CardIdentity("Ink-Eyes, Servant of Oni","")); + cubeCards.add(new CardIdentity("Kokusho, the Evening Star","")); + cubeCards.add(new CardIdentity("Massacre Wurm","")); + cubeCards.add(new CardIdentity("Sheoldred, Whispering One","")); + cubeCards.add(new CardIdentity("Griselbrand","")); + cubeCards.add(new CardIdentity("Tombstalker","")); + cubeCards.add(new CardIdentity("Liliana of the Veil","")); + cubeCards.add(new CardIdentity("Liliana Vess","")); + cubeCards.add(new CardIdentity("Sorin Markov","")); + cubeCards.add(new CardIdentity("Dark Ritual","")); + cubeCards.add(new CardIdentity("Entomb","")); + cubeCards.add(new CardIdentity("Tragic Slip","")); + cubeCards.add(new CardIdentity("Vampiric Tutor","")); + cubeCards.add(new CardIdentity("Diabolic Edict","")); + cubeCards.add(new CardIdentity("Doom Blade","")); + cubeCards.add(new CardIdentity("Go for the Throat","")); + cubeCards.add(new CardIdentity("Ultimate Price","")); + cubeCards.add(new CardIdentity("Dismember","")); + cubeCards.add(new CardIdentity("Hero's Downfall","")); + cubeCards.add(new CardIdentity("Slaughter Pact","")); + cubeCards.add(new CardIdentity("Makeshift Mannequin","")); + cubeCards.add(new CardIdentity("Snuff Out","")); + cubeCards.add(new CardIdentity("Duress","")); + cubeCards.add(new CardIdentity("Innocent Blood","")); + cubeCards.add(new CardIdentity("Inquisition of Kozilek","")); + cubeCards.add(new CardIdentity("Reanimate","")); + cubeCards.add(new CardIdentity("Thoughtseize","")); + cubeCards.add(new CardIdentity("Chainer's Edict","")); + cubeCards.add(new CardIdentity("Demonic Tutor","")); + cubeCards.add(new CardIdentity("Exhume","")); + cubeCards.add(new CardIdentity("Hymn to Tourach","")); + cubeCards.add(new CardIdentity("Night's Whisper","")); + cubeCards.add(new CardIdentity("Sign in Blood","")); + cubeCards.add(new CardIdentity("Sinkhole","")); + cubeCards.add(new CardIdentity("Smallpox","")); + cubeCards.add(new CardIdentity("Buried Alive","")); + cubeCards.add(new CardIdentity("Yawgmoth's Will","")); + cubeCards.add(new CardIdentity("Barter in Blood","")); + cubeCards.add(new CardIdentity("Consuming Vapors","")); + cubeCards.add(new CardIdentity("Damnation","")); + cubeCards.add(new CardIdentity("Living Death","")); + cubeCards.add(new CardIdentity("Unburial Rites","")); + cubeCards.add(new CardIdentity("Mind Twist","")); + cubeCards.add(new CardIdentity("Black Sun's Zenith","")); + cubeCards.add(new CardIdentity("Profane Command","")); + cubeCards.add(new CardIdentity("Sarcomancy","")); + cubeCards.add(new CardIdentity("Animate Dead","")); + cubeCards.add(new CardIdentity("Bitterblossom","")); + cubeCards.add(new CardIdentity("Necromancy","")); + cubeCards.add(new CardIdentity("Necropotence","")); + cubeCards.add(new CardIdentity("Phyrexian Arena","")); + cubeCards.add(new CardIdentity("Recurring Nightmare","")); + cubeCards.add(new CardIdentity("Diabolic Servitude","")); + cubeCards.add(new CardIdentity("Firedrinker Satyr","")); + cubeCards.add(new CardIdentity("Goblin Guide","")); + cubeCards.add(new CardIdentity("Goblin Welder","")); + cubeCards.add(new CardIdentity("Grim Lavamancer","")); + cubeCards.add(new CardIdentity("Jackal Pup","")); + cubeCards.add(new CardIdentity("Kird Ape","")); + cubeCards.add(new CardIdentity("Legion Loyalist","")); + cubeCards.add(new CardIdentity("Mogg Fanatic","")); + cubeCards.add(new CardIdentity("Reckless Waif","")); + cubeCards.add(new CardIdentity("Spikeshot Elder","")); + cubeCards.add(new CardIdentity("Stromkirk Noble","")); + cubeCards.add(new CardIdentity("Ash Zealot","")); + cubeCards.add(new CardIdentity("Ember Hauler","")); + cubeCards.add(new CardIdentity("Gore-House Chainwalker","")); + cubeCards.add(new CardIdentity("Hellspark Elemental","")); + cubeCards.add(new CardIdentity("Kargan Dragonlord","")); + cubeCards.add(new CardIdentity("Keldon Marauders","")); + cubeCards.add(new CardIdentity("Lightning Mauler","")); + cubeCards.add(new CardIdentity("Mogg War Marshal","")); + cubeCards.add(new CardIdentity("Plated Geopede","")); + cubeCards.add(new CardIdentity("Stormblood Berserker","")); + cubeCards.add(new CardIdentity("Torch Fiend","")); + cubeCards.add(new CardIdentity("Young Pyromancer","")); + cubeCards.add(new CardIdentity("Ball Lightning","")); + cubeCards.add(new CardIdentity("Chandra's Phoenix","")); + cubeCards.add(new CardIdentity("Countryside Crusher","")); + cubeCards.add(new CardIdentity("Goblin Ruinblaster","")); + cubeCards.add(new CardIdentity("Guttersnipe","")); + cubeCards.add(new CardIdentity("Hell's Thunder","")); + cubeCards.add(new CardIdentity("Manic Vandal","")); + cubeCards.add(new CardIdentity("Squee, Goblin Nabob","")); + cubeCards.add(new CardIdentity("Zo-Zu the Punisher","")); + cubeCards.add(new CardIdentity("Avalanche Riders","")); + cubeCards.add(new CardIdentity("Blistering Firecat","")); + cubeCards.add(new CardIdentity("Flametongue Kavu","")); + cubeCards.add(new CardIdentity("Hellrider","")); + cubeCards.add(new CardIdentity("Hero of Oxid Ridge","")); + cubeCards.add(new CardIdentity("Keldon Champion","")); + cubeCards.add(new CardIdentity("Kiki-Jiki, Mirror Breaker","")); + cubeCards.add(new CardIdentity("Siege-Gang Commander","")); + cubeCards.add(new CardIdentity("Thundermaw Hellkite","")); + cubeCards.add(new CardIdentity("Zealous Conscripts","")); + cubeCards.add(new CardIdentity("Inferno Titan","")); + cubeCards.add(new CardIdentity("Bogardan Hellkite","")); + cubeCards.add(new CardIdentity("Greater Gargadon","")); + cubeCards.add(new CardIdentity("Chandra, Pyromaster","")); + cubeCards.add(new CardIdentity("Chandra, the Firebrand","")); + cubeCards.add(new CardIdentity("Koth of the Hammer","")); + cubeCards.add(new CardIdentity("Chandra Nalaar","")); + cubeCards.add(new CardIdentity("Burst Lightning","")); + cubeCards.add(new CardIdentity("Lightning Bolt","")); + cubeCards.add(new CardIdentity("Ancient Grudge","")); + cubeCards.add(new CardIdentity("Incinerate","")); + cubeCards.add(new CardIdentity("Lightning Strike","")); + cubeCards.add(new CardIdentity("Magma Jet","")); + cubeCards.add(new CardIdentity("Searing Blaze","")); + cubeCards.add(new CardIdentity("Searing Spear","")); + cubeCards.add(new CardIdentity("Smash to Smithereens","")); + cubeCards.add(new CardIdentity("Brimstone Volley","")); + cubeCards.add(new CardIdentity("Chaos Warp","")); + cubeCards.add(new CardIdentity("Char","")); + cubeCards.add(new CardIdentity("Flame Javelin","")); + cubeCards.add(new CardIdentity("Staggershock","")); + cubeCards.add(new CardIdentity("Fireblast","")); + cubeCards.add(new CardIdentity("Chain Lightning","")); + cubeCards.add(new CardIdentity("Faithless Looting","")); + cubeCards.add(new CardIdentity("Firebolt","")); + cubeCards.add(new CardIdentity("Reckless Charge","")); + cubeCards.add(new CardIdentity("Arc Trail","")); + cubeCards.add(new CardIdentity("Mizzium Mortars","")); + cubeCards.add(new CardIdentity("Pyroclasm","")); + cubeCards.add(new CardIdentity("Arc Lightning","")); + cubeCards.add(new CardIdentity("Flames of the Firebrand","")); + cubeCards.add(new CardIdentity("Molten Rain","")); + cubeCards.add(new CardIdentity("Pillage","")); + cubeCards.add(new CardIdentity("Rift Bolt","")); + cubeCards.add(new CardIdentity("Slagstorm","")); + cubeCards.add(new CardIdentity("Stone Rain","")); + cubeCards.add(new CardIdentity("Wheel of Fortune","")); + cubeCards.add(new CardIdentity("Banefire","")); + cubeCards.add(new CardIdentity("Devil's Play","")); + cubeCards.add(new CardIdentity("Earthquake","")); + cubeCards.add(new CardIdentity("Fireball","")); + cubeCards.add(new CardIdentity("Wildfire","")); + cubeCards.add(new CardIdentity("Bonfire of the Damned","")); + cubeCards.add(new CardIdentity("Sulfuric Vortex","")); + cubeCards.add(new CardIdentity("Sneak Attack","")); + cubeCards.add(new CardIdentity("Arbor Elf","")); + cubeCards.add(new CardIdentity("Avacyn's Pilgrim","")); + cubeCards.add(new CardIdentity("Birds of Paradise","")); + cubeCards.add(new CardIdentity("Elves of Deep Shadow","")); + cubeCards.add(new CardIdentity("Elvish Mystic","")); + cubeCards.add(new CardIdentity("Experiment One","")); + cubeCards.add(new CardIdentity("Fyndhorn Elves","")); + cubeCards.add(new CardIdentity("Joraga Treespeaker","")); + cubeCards.add(new CardIdentity("Llanowar Elves","")); + cubeCards.add(new CardIdentity("Noble Hierarch","")); + cubeCards.add(new CardIdentity("Ulvenwald Tracker","")); + cubeCards.add(new CardIdentity("Wild Nacatl","")); + cubeCards.add(new CardIdentity("Fauna Shaman","")); + cubeCards.add(new CardIdentity("Lotus Cobra","")); + cubeCards.add(new CardIdentity("Mayor of Avabruck","")); + cubeCards.add(new CardIdentity("River Boa","")); + cubeCards.add(new CardIdentity("Rofellos, Llanowar Emissary","")); + cubeCards.add(new CardIdentity("Sakura-Tribe Elder","")); + cubeCards.add(new CardIdentity("Scavenging Ooze","")); + cubeCards.add(new CardIdentity("Strangleroot Geist","")); + cubeCards.add(new CardIdentity("Sylvan Caryatid","")); + cubeCards.add(new CardIdentity("Tarmogoyf","")); + cubeCards.add(new CardIdentity("Wall of Blossoms","")); + cubeCards.add(new CardIdentity("Wall of Roots","")); + cubeCards.add(new CardIdentity("Wild Mongrel","")); + cubeCards.add(new CardIdentity("Eternal Witness","")); + cubeCards.add(new CardIdentity("Ohran Viper","")); + cubeCards.add(new CardIdentity("Troll Ascetic","")); + cubeCards.add(new CardIdentity("Uktabi Orangutan","")); + cubeCards.add(new CardIdentity("Viridian Shaman","")); + cubeCards.add(new CardIdentity("Wolfir Avenger","")); + cubeCards.add(new CardIdentity("Yavimaya Elder","")); + cubeCards.add(new CardIdentity("Blastoderm","")); + cubeCards.add(new CardIdentity("Chameleon Colossus","")); + cubeCards.add(new CardIdentity("Deadbridge Goliath","")); + cubeCards.add(new CardIdentity("Master of the Wild Hunt","")); + cubeCards.add(new CardIdentity("Obstinate Baloth","")); + cubeCards.add(new CardIdentity("Oracle of Mul Daya","")); + cubeCards.add(new CardIdentity("Polukranos, World Eater","")); + cubeCards.add(new CardIdentity("Thrun, the Last Troll","")); + cubeCards.add(new CardIdentity("Vengevine","")); + cubeCards.add(new CardIdentity("Wickerbough Elder","")); + cubeCards.add(new CardIdentity("Acidic Slime","")); + cubeCards.add(new CardIdentity("Deranged Hermit","")); + cubeCards.add(new CardIdentity("Genesis","")); + cubeCards.add(new CardIdentity("Indrik Stomphowler","")); + cubeCards.add(new CardIdentity("Kalonian Hydra","")); + cubeCards.add(new CardIdentity("Thragtusk","")); + cubeCards.add(new CardIdentity("Vorapede","")); + cubeCards.add(new CardIdentity("Wolfir Silverheart","")); + cubeCards.add(new CardIdentity("Primeval Titan","")); + cubeCards.add(new CardIdentity("Rampaging Baloths","")); + cubeCards.add(new CardIdentity("Avenger of Zendikar","")); + cubeCards.add(new CardIdentity("Hornet Queen","")); + cubeCards.add(new CardIdentity("Krosan Tusker","")); + cubeCards.add(new CardIdentity("Craterhoof Behemoth","")); + cubeCards.add(new CardIdentity("Terastodon","")); + cubeCards.add(new CardIdentity("Woodfall Primus","")); + cubeCards.add(new CardIdentity("Garruk Relentless","")); + cubeCards.add(new CardIdentity("Garruk Wildspeaker","")); + cubeCards.add(new CardIdentity("Garruk, Primal Hunter","")); + cubeCards.add(new CardIdentity("Birthing Pod","")); + cubeCards.add(new CardIdentity("Giant Growth","")); + cubeCards.add(new CardIdentity("Vines of Vastwood","")); + cubeCards.add(new CardIdentity("Worldly Tutor","")); + cubeCards.add(new CardIdentity("Naturalize","")); + cubeCards.add(new CardIdentity("Beast Within","")); + cubeCards.add(new CardIdentity("Harrow","")); + cubeCards.add(new CardIdentity("Krosan Grip","")); + cubeCards.add(new CardIdentity("Channel","")); + cubeCards.add(new CardIdentity("Explore","")); + cubeCards.add(new CardIdentity("Farseek","")); + cubeCards.add(new CardIdentity("Life from the Loam","")); + cubeCards.add(new CardIdentity("Rampant Growth","")); + cubeCards.add(new CardIdentity("Regrowth","")); + cubeCards.add(new CardIdentity("Call of the Herd","")); + cubeCards.add(new CardIdentity("Cultivate","")); + cubeCards.add(new CardIdentity("Kodama's Reach","")); + cubeCards.add(new CardIdentity("Search for Tomorrow","")); + cubeCards.add(new CardIdentity("Harmonize","")); + cubeCards.add(new CardIdentity("Natural Order","")); + cubeCards.add(new CardIdentity("Overrun","")); + cubeCards.add(new CardIdentity("Plow Under","")); + cubeCards.add(new CardIdentity("Primal Command","")); + cubeCards.add(new CardIdentity("Green Sun's Zenith","")); + cubeCards.add(new CardIdentity("Tooth and Nail","")); + cubeCards.add(new CardIdentity("Rancor","")); + cubeCards.add(new CardIdentity("Survival of the Fittest","")); + cubeCards.add(new CardIdentity("Sylvan Library","")); + cubeCards.add(new CardIdentity("Awakening Zone","")); + cubeCards.add(new CardIdentity("Boon Satyr","")); + cubeCards.add(new CardIdentity("Geist of Saint Traft","")); + cubeCards.add(new CardIdentity("Grand Arbiter Augustin IV","")); + cubeCards.add(new CardIdentity("Venser, the Sojourner","")); + cubeCards.add(new CardIdentity("Azorius Charm","")); + cubeCards.add(new CardIdentity("Sphinx's Revelation","")); + cubeCards.add(new CardIdentity("Supreme Verdict","")); + cubeCards.add(new CardIdentity("Detention Sphere","")); + cubeCards.add(new CardIdentity("Psychatog","")); + cubeCards.add(new CardIdentity("Shadowmage Infiltrator","")); + cubeCards.add(new CardIdentity("Duskmantle Seer","")); + cubeCards.add(new CardIdentity("Oona, Queen of the Fae","")); + cubeCards.add(new CardIdentity("Tezzeret, Agent of Bolas","")); + cubeCards.add(new CardIdentity("Baleful Strix","")); + cubeCards.add(new CardIdentity("Far // Away","")); + cubeCards.add(new CardIdentity("Rakdos Cackler","")); + cubeCards.add(new CardIdentity("Spike Jester","")); + cubeCards.add(new CardIdentity("Falkenrath Aristocrat","")); + cubeCards.add(new CardIdentity("Murderous Redcap","")); + cubeCards.add(new CardIdentity("Olivia Voldaren","")); + cubeCards.add(new CardIdentity("Terminate","")); + cubeCards.add(new CardIdentity("Bituminous Blast","")); + cubeCards.add(new CardIdentity("Dreadbore","")); + cubeCards.add(new CardIdentity("Blightning","")); + cubeCards.add(new CardIdentity("Burning-Tree Emissary","")); + cubeCards.add(new CardIdentity("Boggart Ram-Gang","")); + cubeCards.add(new CardIdentity("Bloodbraid Elf","")); + cubeCards.add(new CardIdentity("Ghor-Clan Rampager","")); + cubeCards.add(new CardIdentity("Huntmaster of the Fells","")); + cubeCards.add(new CardIdentity("Domri Rade","")); + cubeCards.add(new CardIdentity("Sarkhan Vol","")); + cubeCards.add(new CardIdentity("Xenagos, the Reveler","")); + cubeCards.add(new CardIdentity("Dryad Militant","")); + cubeCards.add(new CardIdentity("Qasali Pridemage","")); + cubeCards.add(new CardIdentity("Voice of Resurgence","")); + cubeCards.add(new CardIdentity("Kitchen Finks","")); + cubeCards.add(new CardIdentity("Knight of the Reliquary","")); + cubeCards.add(new CardIdentity("Loxodon Smiter","")); + cubeCards.add(new CardIdentity("Armada Wurm","")); + cubeCards.add(new CardIdentity("Selesnya Charm","")); + cubeCards.add(new CardIdentity("Mirari's Wake","")); + cubeCards.add(new CardIdentity("Obzedat, Ghost Council","")); + cubeCards.add(new CardIdentity("Angel of Despair","")); + cubeCards.add(new CardIdentity("Sorin, Lord of Innistrad","")); + cubeCards.add(new CardIdentity("Tidehollow Sculler","")); + cubeCards.add(new CardIdentity("Mortify","")); + cubeCards.add(new CardIdentity("Vindicate","")); + cubeCards.add(new CardIdentity("Deathrite Shaman","")); + cubeCards.add(new CardIdentity("Lotleth Troll","")); + cubeCards.add(new CardIdentity("Putrid Leech","")); + cubeCards.add(new CardIdentity("Dreg Mangler","")); + cubeCards.add(new CardIdentity("Varolz, the Scar-Striped","")); + cubeCards.add(new CardIdentity("Vraska the Unseen","")); + cubeCards.add(new CardIdentity("Abrupt Decay","")); + cubeCards.add(new CardIdentity("Putrefy","")); + cubeCards.add(new CardIdentity("Maelstrom Pulse","")); + cubeCards.add(new CardIdentity("Pernicious Deed","")); + cubeCards.add(new CardIdentity("Coiling Oracle","")); + cubeCards.add(new CardIdentity("Edric, Spymaster of Trest","")); + cubeCards.add(new CardIdentity("Trygon Predator","")); + cubeCards.add(new CardIdentity("Mystic Snake","")); + cubeCards.add(new CardIdentity("Prime Speaker Zegana","")); + cubeCards.add(new CardIdentity("Simic Sky Swallower","")); + cubeCards.add(new CardIdentity("Shardless Agent","")); + cubeCards.add(new CardIdentity("Simic Charm","")); + cubeCards.add(new CardIdentity("Niv-Mizzet, Dracogenius","")); + cubeCards.add(new CardIdentity("Ral Zarek","")); + cubeCards.add(new CardIdentity("Fire // Ice","")); + cubeCards.add(new CardIdentity("Izzet Charm","")); + cubeCards.add(new CardIdentity("Turn // Burn","")); + cubeCards.add(new CardIdentity("Electrolyze","")); + cubeCards.add(new CardIdentity("Steam Augury","")); + cubeCards.add(new CardIdentity("Prophetic Bolt","")); + cubeCards.add(new CardIdentity("Figure of Destiny","")); + cubeCards.add(new CardIdentity("Boros Reckoner","")); + cubeCards.add(new CardIdentity("Ajani Vengeant","")); + cubeCards.add(new CardIdentity("Boros Charm","")); + cubeCards.add(new CardIdentity("Lightning Helix","")); + cubeCards.add(new CardIdentity("Assemble the Legion","")); + cubeCards.add(new CardIdentity("Sphinx of the Steel Wind","")); + cubeCards.add(new CardIdentity("Nicol Bolas, Planeswalker","")); + cubeCards.add(new CardIdentity("Kozilek, Butcher of Truth","")); + cubeCards.add(new CardIdentity("Ulamog, the Infinite Gyre","")); + cubeCards.add(new CardIdentity("Karn Liberated","")); + cubeCards.add(new CardIdentity("Epochrasite","")); + cubeCards.add(new CardIdentity("Perilous Myr","")); + cubeCards.add(new CardIdentity("Phyrexian Revoker","")); + cubeCards.add(new CardIdentity("Spellskite","")); + cubeCards.add(new CardIdentity("Palladium Myr","")); + cubeCards.add(new CardIdentity("Lodestone Golem","")); + cubeCards.add(new CardIdentity("Masticore","")); + cubeCards.add(new CardIdentity("Molten-Tail Masticore","")); + cubeCards.add(new CardIdentity("Solemn Simulacrum","")); + cubeCards.add(new CardIdentity("Precursor Golem","")); + cubeCards.add(new CardIdentity("Razormane Masticore","")); + cubeCards.add(new CardIdentity("Duplicant","")); + cubeCards.add(new CardIdentity("Steel Hellkite","")); + cubeCards.add(new CardIdentity("Triskelion","")); + cubeCards.add(new CardIdentity("Wurmcoil Engine","")); + cubeCards.add(new CardIdentity("Myr Battlesphere","")); + cubeCards.add(new CardIdentity("Sundering Titan","")); + cubeCards.add(new CardIdentity("Black Lotus","")); + cubeCards.add(new CardIdentity("Chrome Mox","")); + cubeCards.add(new CardIdentity("Everflowing Chalice","")); + cubeCards.add(new CardIdentity("Lotus Bloom","")); + cubeCards.add(new CardIdentity("Mana Crypt","")); + cubeCards.add(new CardIdentity("Mox Diamond","")); + cubeCards.add(new CardIdentity("Mox Emerald","")); + cubeCards.add(new CardIdentity("Mox Jet","")); + cubeCards.add(new CardIdentity("Mox Pearl","")); + cubeCards.add(new CardIdentity("Mox Ruby","")); + cubeCards.add(new CardIdentity("Mox Sapphire","")); + cubeCards.add(new CardIdentity("Aether Vial","")); + cubeCards.add(new CardIdentity("Basilisk Collar","")); + cubeCards.add(new CardIdentity("Black Vise","")); + cubeCards.add(new CardIdentity("Bonesplitter","")); + cubeCards.add(new CardIdentity("Cursed Scroll","")); + cubeCards.add(new CardIdentity("Mana Vault","")); + cubeCards.add(new CardIdentity("Pithing Needle","")); + cubeCards.add(new CardIdentity("Relic of Progenitus","")); + cubeCards.add(new CardIdentity("Sensei's Divining Top","")); + cubeCards.add(new CardIdentity("Skullclamp","")); + cubeCards.add(new CardIdentity("Sol Ring","")); + cubeCards.add(new CardIdentity("Ankh of Mishra","")); + cubeCards.add(new CardIdentity("Azorius Signet","")); + cubeCards.add(new CardIdentity("Boros Signet","")); + cubeCards.add(new CardIdentity("Coldsteel Heart","")); + cubeCards.add(new CardIdentity("Dimir Signet","")); + cubeCards.add(new CardIdentity("Golgari Signet","")); + cubeCards.add(new CardIdentity("Grim Monolith","")); + cubeCards.add(new CardIdentity("Gruul Signet","")); + cubeCards.add(new CardIdentity("Isochron Scepter","")); + cubeCards.add(new CardIdentity("Izzet Signet","")); + cubeCards.add(new CardIdentity("Lightning Greaves","")); + cubeCards.add(new CardIdentity("Mind Stone","")); + cubeCards.add(new CardIdentity("Mortarpod","")); + cubeCards.add(new CardIdentity("Orzhov Signet","")); + cubeCards.add(new CardIdentity("Rakdos Signet","")); + cubeCards.add(new CardIdentity("Ratchet Bomb","")); + cubeCards.add(new CardIdentity("Scroll Rack","")); + cubeCards.add(new CardIdentity("Selesnya Signet","")); + cubeCards.add(new CardIdentity("Shrine of Burning Rage","")); + cubeCards.add(new CardIdentity("Simic Signet","")); + cubeCards.add(new CardIdentity("Sphere of the Suns","")); + cubeCards.add(new CardIdentity("Umezawa's Jitte","")); + cubeCards.add(new CardIdentity("Winter Orb","")); + cubeCards.add(new CardIdentity("Basalt Monolith","")); + cubeCards.add(new CardIdentity("Chromatic Lantern","")); + cubeCards.add(new CardIdentity("Coalition Relic","")); + cubeCards.add(new CardIdentity("Crucible of Worlds","")); + cubeCards.add(new CardIdentity("Crystal Shard","")); + cubeCards.add(new CardIdentity("Darksteel Ingot","")); + cubeCards.add(new CardIdentity("Grafted Wargear","")); + cubeCards.add(new CardIdentity("Loxodon Warhammer","")); + cubeCards.add(new CardIdentity("Mimic Vat","")); + cubeCards.add(new CardIdentity("Oblivion Stone","")); + cubeCards.add(new CardIdentity("Sword of Body and Mind","")); + cubeCards.add(new CardIdentity("Sword of Feast and Famine","")); + cubeCards.add(new CardIdentity("Sword of Fire and Ice","")); + cubeCards.add(new CardIdentity("Sword of Light and Shadow","")); + cubeCards.add(new CardIdentity("Sword of War and Peace","")); + cubeCards.add(new CardIdentity("Tangle Wire","")); + cubeCards.add(new CardIdentity("Vedalken Shackles","")); + cubeCards.add(new CardIdentity("Worn Powerstone","")); + cubeCards.add(new CardIdentity("Erratic Portal","")); + cubeCards.add(new CardIdentity("Icy Manipulator","")); + cubeCards.add(new CardIdentity("Nevinyrral's Disk","")); + cubeCards.add(new CardIdentity("Smokestack","")); + cubeCards.add(new CardIdentity("Thran Dynamo","")); + cubeCards.add(new CardIdentity("Batterskull","")); + cubeCards.add(new CardIdentity("Engineered Explosives","")); + cubeCards.add(new CardIdentity("Gilded Lotus","")); + cubeCards.add(new CardIdentity("Memory Jar","")); + cubeCards.add(new CardIdentity("Mindslaver","")); + cubeCards.add(new CardIdentity("All Is Dust","")); + cubeCards.add(new CardIdentity("Academy Ruins","")); + cubeCards.add(new CardIdentity("Ancient Tomb","")); + cubeCards.add(new CardIdentity("Arcane Sanctum","")); + cubeCards.add(new CardIdentity("Arid Mesa","")); + cubeCards.add(new CardIdentity("Azorius Chancery","")); + cubeCards.add(new CardIdentity("Badlands","")); + cubeCards.add(new CardIdentity("Battlefield Forge","")); + cubeCards.add(new CardIdentity("Bayou","")); + cubeCards.add(new CardIdentity("Blood Crypt","")); + cubeCards.add(new CardIdentity("Bloodstained Mire","")); + cubeCards.add(new CardIdentity("Boros Garrison","")); + cubeCards.add(new CardIdentity("Breeding Pool","")); + cubeCards.add(new CardIdentity("Cascade Bluffs","")); + cubeCards.add(new CardIdentity("Caves of Koilos","")); + cubeCards.add(new CardIdentity("Celestial Colonnade","")); + cubeCards.add(new CardIdentity("City of Brass","")); + cubeCards.add(new CardIdentity("Clifftop Retreat","")); + cubeCards.add(new CardIdentity("Creeping Tar Pit","")); + cubeCards.add(new CardIdentity("Crumbling Necropolis","")); + cubeCards.add(new CardIdentity("Dimir Aqueduct","")); + cubeCards.add(new CardIdentity("Dragonskull Summit","")); + cubeCards.add(new CardIdentity("Drowned Catacomb","")); + cubeCards.add(new CardIdentity("Evolving Wilds","")); + cubeCards.add(new CardIdentity("Faerie Conclave","")); + cubeCards.add(new CardIdentity("Fetid Heath","")); + cubeCards.add(new CardIdentity("Flooded Strand","")); + cubeCards.add(new CardIdentity("Gaea's Cradle","")); + cubeCards.add(new CardIdentity("Gavony Township","")); + cubeCards.add(new CardIdentity("Gemstone Mine","")); + cubeCards.add(new CardIdentity("Glacial Fortress","")); + cubeCards.add(new CardIdentity("Godless Shrine","")); + cubeCards.add(new CardIdentity("Golgari Rot Farm","")); + cubeCards.add(new CardIdentity("Grand Coliseum","")); + cubeCards.add(new CardIdentity("Gruul Turf","")); + cubeCards.add(new CardIdentity("Hallowed Fountain","")); + cubeCards.add(new CardIdentity("Hinterland Harbor","")); + cubeCards.add(new CardIdentity("Isolated Chapel","")); + cubeCards.add(new CardIdentity("Izzet Boilerworks","")); + cubeCards.add(new CardIdentity("Jungle Shrine","")); + cubeCards.add(new CardIdentity("Kessig Wolf Run","")); + cubeCards.add(new CardIdentity("Lavaclaw Reaches","")); + cubeCards.add(new CardIdentity("Library of Alexandria","")); + cubeCards.add(new CardIdentity("Llanowar Wastes","")); + cubeCards.add(new CardIdentity("Marsh Flats","")); + cubeCards.add(new CardIdentity("Maze of Ith","")); + cubeCards.add(new CardIdentity("Mishra's Factory","")); + cubeCards.add(new CardIdentity("Misty Rainforest","")); + cubeCards.add(new CardIdentity("Mutavault","")); + cubeCards.add(new CardIdentity("Orzhov Basilica","")); + cubeCards.add(new CardIdentity("Overgrown Tomb","")); + cubeCards.add(new CardIdentity("Plateau","")); + cubeCards.add(new CardIdentity("Polluted Delta","")); + cubeCards.add(new CardIdentity("Raging Ravine","")); + cubeCards.add(new CardIdentity("Rakdos Carnarium","")); + cubeCards.add(new CardIdentity("Reflecting Pool","")); + cubeCards.add(new CardIdentity("Rishadan Port","")); + cubeCards.add(new CardIdentity("Rootbound Crag","")); + cubeCards.add(new CardIdentity("Rugged Prairie","")); + cubeCards.add(new CardIdentity("Sacred Foundry","")); + cubeCards.add(new CardIdentity("Savage Lands","")); + cubeCards.add(new CardIdentity("Savannah","")); + cubeCards.add(new CardIdentity("Scalding Tarn","")); + cubeCards.add(new CardIdentity("Scrubland","")); + cubeCards.add(new CardIdentity("Seaside Citadel","")); + cubeCards.add(new CardIdentity("Selesnya Sanctuary","")); + cubeCards.add(new CardIdentity("Shelldock Isle","")); + cubeCards.add(new CardIdentity("Simic Growth Chamber","")); + cubeCards.add(new CardIdentity("Steam Vents","")); + cubeCards.add(new CardIdentity("Stirring Wildwood","")); + cubeCards.add(new CardIdentity("Stomping Ground","")); + cubeCards.add(new CardIdentity("Strip Mine","")); + cubeCards.add(new CardIdentity("Sulfur Falls","")); + cubeCards.add(new CardIdentity("Sunpetal Grove","")); + cubeCards.add(new CardIdentity("Taiga","")); + cubeCards.add(new CardIdentity("Tectonic Edge","")); + cubeCards.add(new CardIdentity("Temple Garden","")); + cubeCards.add(new CardIdentity("Terramorphic Expanse","")); + cubeCards.add(new CardIdentity("Treetop Village","")); + cubeCards.add(new CardIdentity("Tropical Island","")); + cubeCards.add(new CardIdentity("Tundra","")); + cubeCards.add(new CardIdentity("Twilight Mire","")); + cubeCards.add(new CardIdentity("Underground Sea","")); + cubeCards.add(new CardIdentity("Verdant Catacombs","")); + cubeCards.add(new CardIdentity("Vivid Crag","")); + cubeCards.add(new CardIdentity("Vivid Creek","")); + cubeCards.add(new CardIdentity("Vivid Grove","")); + cubeCards.add(new CardIdentity("Vivid Marsh","")); + cubeCards.add(new CardIdentity("Vivid Meadow","")); + cubeCards.add(new CardIdentity("Volcanic Island","")); + cubeCards.add(new CardIdentity("Volrath's Stronghold","")); + cubeCards.add(new CardIdentity("Wasteland","")); + cubeCards.add(new CardIdentity("Watery Grave","")); + cubeCards.add(new CardIdentity("Windswept Heath","")); + cubeCards.add(new CardIdentity("Wooded Foothills","")); + cubeCards.add(new CardIdentity("Woodland Cemetery","")); + cubeCards.add(new CardIdentity("Yavimaya Coast","")); + + } +} diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/HolidayCube2013.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/HolidayCube2013.java new file mode 100644 index 0000000000..580b348851 --- /dev/null +++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/HolidayCube2013.java @@ -0,0 +1,583 @@ +/* +* Copyright 2010 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.tournament.cubes; + +import mage.game.draft.DraftCube; + +/** + * + * @author LevelX2 + */ +public class HolidayCube2013 extends DraftCube { + + public HolidayCube2013() { + super("MTGO Holiday Cube 2013"); + + cubeCards.add(new CardIdentity("Honor of the Pure","")); + cubeCards.add(new CardIdentity("Path to Exile","")); + cubeCards.add(new CardIdentity("Land Tax","")); + cubeCards.add(new CardIdentity("Exalted Angel","")); + cubeCards.add(new CardIdentity("Mana Tithe","")); + cubeCards.add(new CardIdentity("Spectral Procession","")); + cubeCards.add(new CardIdentity("Wall of Omens","")); + cubeCards.add(new CardIdentity("Sun Titan","")); + cubeCards.add(new CardIdentity("Leonin Relic-Warder","")); + cubeCards.add(new CardIdentity("Elesh Norn, Grand Cenobite","")); + cubeCards.add(new CardIdentity("Lingering Souls","")); + cubeCards.add(new CardIdentity("Terminus","")); + cubeCards.add(new CardIdentity("Disenchant","")); + cubeCards.add(new CardIdentity("Mother of Runes","")); + cubeCards.add(new CardIdentity("Weathered Wayfarer","")); + cubeCards.add(new CardIdentity("Ravages of War","")); + cubeCards.add(new CardIdentity("Student of Warfare","")); + cubeCards.add(new CardIdentity("Swords to Plowshares","")); + cubeCards.add(new CardIdentity("Elspeth Tirel","")); + cubeCards.add(new CardIdentity("Mirran Crusader","")); + cubeCards.add(new CardIdentity("Elite Vanguard","")); + cubeCards.add(new CardIdentity("Day of Judgment","")); + cubeCards.add(new CardIdentity("Nearheath Pilgrim","")); + cubeCards.add(new CardIdentity("Silverblade Paladin","")); + cubeCards.add(new CardIdentity("Soldier of the Pantheon","")); + cubeCards.add(new CardIdentity("Enlightened Tutor","")); + cubeCards.add(new CardIdentity("Soltari Champion","")); + cubeCards.add(new CardIdentity("Catastrophe","")); + cubeCards.add(new CardIdentity("Parallax Wave","")); + cubeCards.add(new CardIdentity("Rout","")); + cubeCards.add(new CardIdentity("Whipcorder","")); + cubeCards.add(new CardIdentity("Kami of Ancient Law","")); + cubeCards.add(new CardIdentity("Isamaru, Hound of Konda","")); + cubeCards.add(new CardIdentity("Savannah Lions","")); + cubeCards.add(new CardIdentity("Paladin en-Vec","")); + cubeCards.add(new CardIdentity("Wrath of God","")); + cubeCards.add(new CardIdentity("Cloudgoat Ranger","")); + cubeCards.add(new CardIdentity("Mirror Entity","")); + cubeCards.add(new CardIdentity("Reveillark","")); + cubeCards.add(new CardIdentity("Flickerwisp","")); + cubeCards.add(new CardIdentity("Ranger of Eos","")); + cubeCards.add(new CardIdentity("Elspeth, Knight-Errant","")); + cubeCards.add(new CardIdentity("Balance","")); + cubeCards.add(new CardIdentity("Steppe Lynx","")); + cubeCards.add(new CardIdentity("Journey to Nowhere","")); + cubeCards.add(new CardIdentity("Emeria Angel","")); + cubeCards.add(new CardIdentity("Ajani Goldmane","")); + cubeCards.add(new CardIdentity("Porcelain Legionnaire","")); + cubeCards.add(new CardIdentity("Blade Splicer","")); + cubeCards.add(new CardIdentity("Thalia, Guardian of Thraben","")); + cubeCards.add(new CardIdentity("Restoration Angel","")); + cubeCards.add(new CardIdentity("Knight of Glory","")); + cubeCards.add(new CardIdentity("Moat","")); + cubeCards.add(new CardIdentity("Elspeth, Sun's Champion","")); + cubeCards.add(new CardIdentity("Spear of Heliod","")); + cubeCards.add(new CardIdentity("Unexpectedly Absent","")); + cubeCards.add(new CardIdentity("Armageddon","")); + cubeCards.add(new CardIdentity("Faith's Fetters","")); + cubeCards.add(new CardIdentity("Stoneforge Mystic","")); + cubeCards.add(new CardIdentity("Linvala, Keeper of Silence","")); + cubeCards.add(new CardIdentity("Baneslayer Angel","")); + cubeCards.add(new CardIdentity("Hero of Bladehold","")); + cubeCards.add(new CardIdentity("Oblivion Ring","")); + cubeCards.add(new CardIdentity("Gideon's Lawkeeper","")); + cubeCards.add(new CardIdentity("Ajani, Caller of the Pride","")); + cubeCards.add(new CardIdentity("Angel of Serenity","")); + cubeCards.add(new CardIdentity("Archangel of Thune","")); + cubeCards.add(new CardIdentity("Loam Lion","")); + cubeCards.add(new CardIdentity("Gideon Jura","")); + cubeCards.add(new CardIdentity("Mana Drain","")); + cubeCards.add(new CardIdentity("Frantic Search","")); + cubeCards.add(new CardIdentity("Treachery","")); + cubeCards.add(new CardIdentity("Brainstorm","")); + cubeCards.add(new CardIdentity("Brain Freeze","")); + cubeCards.add(new CardIdentity("Vesuvan Shapeshifter","")); + cubeCards.add(new CardIdentity("Venser, Shaper Savant","")); + cubeCards.add(new CardIdentity("Sower of Temptation","")); + cubeCards.add(new CardIdentity("Wake Thrasher","")); + cubeCards.add(new CardIdentity("Consecrated Sphinx","")); + cubeCards.add(new CardIdentity("Snapcaster Mage","")); + cubeCards.add(new CardIdentity("True-Name Nemesis","")); + cubeCards.add(new CardIdentity("Intuition","")); + cubeCards.add(new CardIdentity("Forbid","")); + cubeCards.add(new CardIdentity("Force Spike","")); + cubeCards.add(new CardIdentity("Upheaval","")); + cubeCards.add(new CardIdentity("Voidmage Prodigy","")); + cubeCards.add(new CardIdentity("Willbender","")); + cubeCards.add(new CardIdentity("Gifts Ungiven","")); + cubeCards.add(new CardIdentity("Compulsive Research","")); + cubeCards.add(new CardIdentity("Riftwing Cloudskate","")); + cubeCards.add(new CardIdentity("Glen Elendra Archmage","")); + cubeCards.add(new CardIdentity("Inkwell Leviathan","")); + cubeCards.add(new CardIdentity("Tinker","")); + cubeCards.add(new CardIdentity("Jace, the Mind Sculptor","")); + cubeCards.add(new CardIdentity("Old Man of the Sea","")); + cubeCards.add(new CardIdentity("Mystical Tutor","")); + cubeCards.add(new CardIdentity("Impulse","")); + cubeCards.add(new CardIdentity("Turnabout","")); + cubeCards.add(new CardIdentity("Palinchron","")); + cubeCards.add(new CardIdentity("Daze","")); + cubeCards.add(new CardIdentity("Meloku the Clouded Mirror","")); + cubeCards.add(new CardIdentity("Jushi Apprentice","")); + cubeCards.add(new CardIdentity("Remand","")); + cubeCards.add(new CardIdentity("Looter il-Kor","")); + cubeCards.add(new CardIdentity("Aeon Chronicler","")); + cubeCards.add(new CardIdentity("Mulldrifter","")); + cubeCards.add(new CardIdentity("Cryptic Command","")); + cubeCards.add(new CardIdentity("Serendib Efreet","")); + cubeCards.add(new CardIdentity("Into the Roil","")); + cubeCards.add(new CardIdentity("Sphinx of Jwar Isle","")); + cubeCards.add(new CardIdentity("Jace Beleren","")); + cubeCards.add(new CardIdentity("Preordain","")); + cubeCards.add(new CardIdentity("Fact or Fiction","")); + cubeCards.add(new CardIdentity("Mana Leak","")); + cubeCards.add(new CardIdentity("Frost Titan","")); + cubeCards.add(new CardIdentity("Phantasmal Image","")); + cubeCards.add(new CardIdentity("Dungeon Geists","")); + cubeCards.add(new CardIdentity("Tamiyo, the Moon Sage","")); + cubeCards.add(new CardIdentity("Timetwister","")); + cubeCards.add(new CardIdentity("Show and Tell","")); + cubeCards.add(new CardIdentity("Aetherling","")); + cubeCards.add(new CardIdentity("Memory Lapse","")); + cubeCards.add(new CardIdentity("Dream Halls","")); + cubeCards.add(new CardIdentity("Opposition","")); + cubeCards.add(new CardIdentity("Mind's Desire","")); + cubeCards.add(new CardIdentity("Vendilion Clique","")); + cubeCards.add(new CardIdentity("Counterspell","")); + cubeCards.add(new CardIdentity("Force of Will","")); + cubeCards.add(new CardIdentity("Control Magic","")); + cubeCards.add(new CardIdentity("Jace, Architect of Thought","")); + cubeCards.add(new CardIdentity("Time Walk","")); + cubeCards.add(new CardIdentity("Bribery","")); + cubeCards.add(new CardIdentity("Ancestral Recall","")); + cubeCards.add(new CardIdentity("Ancestral Vision","")); + cubeCards.add(new CardIdentity("Phyrexian Metamorph","")); + cubeCards.add(new CardIdentity("Time Spiral","")); + cubeCards.add(new CardIdentity("Miscalculation","")); + cubeCards.add(new CardIdentity("Trinket Mage","")); + cubeCards.add(new CardIdentity("Recurring Nightmare","")); + cubeCards.add(new CardIdentity("Buried Alive","")); + cubeCards.add(new CardIdentity("Tendrils of Agony","")); + cubeCards.add(new CardIdentity("Unburial Rites","")); + cubeCards.add(new CardIdentity("Mesmeric Fiend","")); + cubeCards.add(new CardIdentity("Slaughter Pact","")); + cubeCards.add(new CardIdentity("Gatekeeper of Malakir","")); + cubeCards.add(new CardIdentity("Grave Titan","")); + cubeCards.add(new CardIdentity("Phyrexian Obliterator","")); + cubeCards.add(new CardIdentity("Necromancy","")); + cubeCards.add(new CardIdentity("Corpse Dance","")); + cubeCards.add(new CardIdentity("Yawgmoth's Will","")); + cubeCards.add(new CardIdentity("Nightscape Familiar","")); + cubeCards.add(new CardIdentity("Nezumi Shortfang","")); + cubeCards.add(new CardIdentity("Dark Confidant","")); + cubeCards.add(new CardIdentity("Graveborn Muse","")); + cubeCards.add(new CardIdentity("Liliana Vess","")); + cubeCards.add(new CardIdentity("Black Knight","")); + cubeCards.add(new CardIdentity("Go for the Throat","")); + cubeCards.add(new CardIdentity("Sheoldred, Whispering One","")); + cubeCards.add(new CardIdentity("Bloodline Keeper","")); + cubeCards.add(new CardIdentity("Animate Dead","")); + cubeCards.add(new CardIdentity("Gravecrawler","")); + cubeCards.add(new CardIdentity("Griselbrand","")); + cubeCards.add(new CardIdentity("Erebos, God of the Dead","")); + cubeCards.add(new CardIdentity("Toxic Deluge","")); + cubeCards.add(new CardIdentity("Vampiric Tutor","")); + cubeCards.add(new CardIdentity("Living Death","")); + cubeCards.add(new CardIdentity("Reanimate","")); + cubeCards.add(new CardIdentity("Bone Shredder","")); + cubeCards.add(new CardIdentity("Braids, Cabal Minion","")); + cubeCards.add(new CardIdentity("Entomb","")); + cubeCards.add(new CardIdentity("Putrid Imp","")); + cubeCards.add(new CardIdentity("Nezumi Graverobber","")); + cubeCards.add(new CardIdentity("Ink-Eyes, Servant of Oni","")); + cubeCards.add(new CardIdentity("Phyrexian Arena","")); + cubeCards.add(new CardIdentity("Plague Sliver","")); + cubeCards.add(new CardIdentity("Damnation","")); + cubeCards.add(new CardIdentity("Nekrataal","")); + cubeCards.add(new CardIdentity("Shriekmaw","")); + cubeCards.add(new CardIdentity("Bitterblossom","")); + cubeCards.add(new CardIdentity("Demonic Tutor","")); + cubeCards.add(new CardIdentity("Necropotence","")); + cubeCards.add(new CardIdentity("Disfigure","")); + cubeCards.add(new CardIdentity("Vampire Nighthawk","")); + cubeCards.add(new CardIdentity("Guul Draz Assassin","")); + cubeCards.add(new CardIdentity("Consuming Vapors","")); + cubeCards.add(new CardIdentity("Duress","")); + cubeCards.add(new CardIdentity("Skinrender","")); + cubeCards.add(new CardIdentity("Dismember","")); + cubeCards.add(new CardIdentity("Diregraf Ghoul","")); + cubeCards.add(new CardIdentity("Liliana of the Veil","")); + cubeCards.add(new CardIdentity("Hymn to Tourach","")); + cubeCards.add(new CardIdentity("Ultimate Price","")); + cubeCards.add(new CardIdentity("Nether Void","")); + cubeCards.add(new CardIdentity("The Abyss","")); + cubeCards.add(new CardIdentity("Lifebane Zombie","")); + cubeCards.add(new CardIdentity("Thoughtseize","")); + cubeCards.add(new CardIdentity("Hero's Downfall","")); + cubeCards.add(new CardIdentity("Diabolic Edict","")); + cubeCards.add(new CardIdentity("Sarcomancy","")); + cubeCards.add(new CardIdentity("Oona's Prowler","")); + cubeCards.add(new CardIdentity("Dark Ritual","")); + cubeCards.add(new CardIdentity("Hypnotic Specter","")); + cubeCards.add(new CardIdentity("Bloodghast","")); + cubeCards.add(new CardIdentity("Inquisition of Kozilek","")); + cubeCards.add(new CardIdentity("Phyrexian Rager","")); + cubeCards.add(new CardIdentity("Bloodgift Demon","")); + cubeCards.add(new CardIdentity("Mind Twist","")); + cubeCards.add(new CardIdentity("Frenzied Goblin","")); + cubeCards.add(new CardIdentity("Torch Fiend","")); + cubeCards.add(new CardIdentity("Earthquake","")); + cubeCards.add(new CardIdentity("Goblin Ruinblaster","")); + cubeCards.add(new CardIdentity("Chandra's Phoenix","")); + cubeCards.add(new CardIdentity("Price of Progress","")); + cubeCards.add(new CardIdentity("Avalanche Riders","")); + cubeCards.add(new CardIdentity("Goblin Welder","")); + cubeCards.add(new CardIdentity("Firebolt","")); + cubeCards.add(new CardIdentity("Sulfuric Vortex","")); + cubeCards.add(new CardIdentity("Seething Song","")); + cubeCards.add(new CardIdentity("Rift Bolt","")); + cubeCards.add(new CardIdentity("Mogg War Marshal","")); + cubeCards.add(new CardIdentity("Hellrider","")); + cubeCards.add(new CardIdentity("Taurean Mauler","")); + cubeCards.add(new CardIdentity("Ember Hauler","")); + cubeCards.add(new CardIdentity("Koth of the Hammer","")); + cubeCards.add(new CardIdentity("Jackal Pup","")); + cubeCards.add(new CardIdentity("Incinerate","")); + cubeCards.add(new CardIdentity("Chandra, the Firebrand","")); + cubeCards.add(new CardIdentity("Stormblood Berserker","")); + cubeCards.add(new CardIdentity("Grim Lavamancer","")); + cubeCards.add(new CardIdentity("Bonfire of the Damned","")); + cubeCards.add(new CardIdentity("Thundermaw Hellkite","")); + cubeCards.add(new CardIdentity("Magma Jet","")); + cubeCards.add(new CardIdentity("Firedrinker Satyr","")); + cubeCards.add(new CardIdentity("Firestorm","")); + cubeCards.add(new CardIdentity("Ravenous Baboons","")); + cubeCards.add(new CardIdentity("Wildfire","")); + cubeCards.add(new CardIdentity("Sneak Attack","")); + cubeCards.add(new CardIdentity("Reckless Charge","")); + cubeCards.add(new CardIdentity("Molten Rain","")); + cubeCards.add(new CardIdentity("Char","")); + cubeCards.add(new CardIdentity("Tin Street Hooligan","")); + cubeCards.add(new CardIdentity("Empty the Warrens","")); + cubeCards.add(new CardIdentity("Ancient Grudge","")); + cubeCards.add(new CardIdentity("Greater Gargadon","")); + cubeCards.add(new CardIdentity("Keldon Marauders","")); + cubeCards.add(new CardIdentity("Magus of the Moon","")); + cubeCards.add(new CardIdentity("Smash to Smithereens","")); + cubeCards.add(new CardIdentity("Hellspark Elemental","")); + cubeCards.add(new CardIdentity("Ball Lightning","")); + cubeCards.add(new CardIdentity("Siege-Gang Commander","")); + cubeCards.add(new CardIdentity("Burning of Xinye","")); + cubeCards.add(new CardIdentity("Goblin Guide","")); + cubeCards.add(new CardIdentity("Searing Blaze","")); + cubeCards.add(new CardIdentity("Kargan Dragonlord","")); + cubeCards.add(new CardIdentity("Wheel of Fortune","")); + cubeCards.add(new CardIdentity("Pyroclasm","")); + cubeCards.add(new CardIdentity("Arc Trail","")); + cubeCards.add(new CardIdentity("Spikeshot Elder","")); + cubeCards.add(new CardIdentity("Urabrask the Hidden","")); + cubeCards.add(new CardIdentity("Flametongue Kavu","")); + cubeCards.add(new CardIdentity("Inferno Titan","")); + cubeCards.add(new CardIdentity("Kird Ape","")); + cubeCards.add(new CardIdentity("Brimstone Volley","")); + cubeCards.add(new CardIdentity("Devil's Play","")); + cubeCards.add(new CardIdentity("Faithless Looting","")); + cubeCards.add(new CardIdentity("Orcish Lumberjack","")); + cubeCards.add(new CardIdentity("Zealous Conscripts","")); + cubeCards.add(new CardIdentity("Mizzium Mortars","")); + cubeCards.add(new CardIdentity("Goblin Vandal","")); + cubeCards.add(new CardIdentity("Plated Geopede","")); + cubeCards.add(new CardIdentity("Lightning Bolt","")); + cubeCards.add(new CardIdentity("Chain Lightning","")); + cubeCards.add(new CardIdentity("Chaos Warp","")); + cubeCards.add(new CardIdentity("Fireblast","")); + cubeCards.add(new CardIdentity("Chandra, Pyromaster","")); + cubeCards.add(new CardIdentity("Hero of Oxid Ridge","")); + cubeCards.add(new CardIdentity("Nantuko Vigilante","")); + cubeCards.add(new CardIdentity("Boon Satyr","")); + cubeCards.add(new CardIdentity("Rude Awakening","")); + cubeCards.add(new CardIdentity("Thornscape Battlemage","")); + cubeCards.add(new CardIdentity("Indrik Stomphowler","")); + cubeCards.add(new CardIdentity("Ohran Viper","")); + cubeCards.add(new CardIdentity("Lotus Cobra","")); + cubeCards.add(new CardIdentity("Primeval Titan","")); + cubeCards.add(new CardIdentity("Birds of Paradise","")); + cubeCards.add(new CardIdentity("Wall of Blossoms","")); + cubeCards.add(new CardIdentity("Restock","")); + cubeCards.add(new CardIdentity("Tooth and Nail","")); + cubeCards.add(new CardIdentity("Eternal Witness","")); + cubeCards.add(new CardIdentity("Primal Command","")); + cubeCards.add(new CardIdentity("Stunted Growth","")); + cubeCards.add(new CardIdentity("Wickerbough Elder","")); + cubeCards.add(new CardIdentity("Master of the Wild Hunt","")); + cubeCards.add(new CardIdentity("Harmonize","")); + cubeCards.add(new CardIdentity("Terastodon","")); + cubeCards.add(new CardIdentity("Garruk Wildspeaker","")); + cubeCards.add(new CardIdentity("Birthing Pod","")); + cubeCards.add(new CardIdentity("Scavenging Ooze","")); + cubeCards.add(new CardIdentity("Avacyn's Pilgrim","")); + cubeCards.add(new CardIdentity("Strangleroot Geist","")); + cubeCards.add(new CardIdentity("Wolfir Silverheart","")); + cubeCards.add(new CardIdentity("Eureka","")); + cubeCards.add(new CardIdentity("Garruk, Caller of Beasts","")); + cubeCards.add(new CardIdentity("Natural Order","")); + cubeCards.add(new CardIdentity("Deranged Hermit","")); + cubeCards.add(new CardIdentity("Nostalgic Dreams","")); + cubeCards.add(new CardIdentity("Genesis","")); + cubeCards.add(new CardIdentity("Plow Under","")); + cubeCards.add(new CardIdentity("Heartbeat of Spring","")); + cubeCards.add(new CardIdentity("Woodfall Primus","")); + cubeCards.add(new CardIdentity("Noble Hierarch","")); + cubeCards.add(new CardIdentity("Channel","")); + cubeCards.add(new CardIdentity("Oracle of Mul Daya","")); + cubeCards.add(new CardIdentity("Arbor Elf","")); + cubeCards.add(new CardIdentity("Joraga Treespeaker","")); + cubeCards.add(new CardIdentity("Awakening Zone","")); + cubeCards.add(new CardIdentity("Vengevine","")); + cubeCards.add(new CardIdentity("Fauna Shaman","")); + cubeCards.add(new CardIdentity("Genesis Wave","")); + cubeCards.add(new CardIdentity("Thrun, the Last Troll","")); + cubeCards.add(new CardIdentity("Beast Within","")); + cubeCards.add(new CardIdentity("Naturalize","")); + cubeCards.add(new CardIdentity("Garruk Relentless","")); + cubeCards.add(new CardIdentity("Ulvenwald Tracker","")); + cubeCards.add(new CardIdentity("Polukranos, World Eater","")); + cubeCards.add(new CardIdentity("Rofellos, Llanowar Emissary","")); + cubeCards.add(new CardIdentity("Elves of Deep Shadow","")); + cubeCards.add(new CardIdentity("Thelonite Hermit","")); + cubeCards.add(new CardIdentity("Tarmogoyf","")); + cubeCards.add(new CardIdentity("Wild Nacatl","")); + cubeCards.add(new CardIdentity("Avenger of Zendikar","")); + cubeCards.add(new CardIdentity("Call of the Herd","")); + cubeCards.add(new CardIdentity("Obstinate Baloth","")); + cubeCards.add(new CardIdentity("Green Sun's Zenith","")); + cubeCards.add(new CardIdentity("Acidic Slime","")); + cubeCards.add(new CardIdentity("Garruk, Primal Hunter","")); + cubeCards.add(new CardIdentity("Llanowar Elves","")); + cubeCards.add(new CardIdentity("Regrowth","")); + cubeCards.add(new CardIdentity("Fyndhorn Elves","")); + cubeCards.add(new CardIdentity("Thragtusk","")); + cubeCards.add(new CardIdentity("Elvish Mystic","")); + cubeCards.add(new CardIdentity("Sylvan Caryatid","")); + cubeCards.add(new CardIdentity("Chord of Calling","")); + cubeCards.add(new CardIdentity("Survival of the Fittest","")); + cubeCards.add(new CardIdentity("Sylvan Library","")); + cubeCards.add(new CardIdentity("Savannah","")); + cubeCards.add(new CardIdentity("Bayou","")); + cubeCards.add(new CardIdentity("Scrubland","")); + cubeCards.add(new CardIdentity("Blood Crypt","")); + cubeCards.add(new CardIdentity("Brushland","")); + cubeCards.add(new CardIdentity("Caves of Koilos","")); + cubeCards.add(new CardIdentity("Dust Bowl","")); + cubeCards.add(new CardIdentity("Ghitu Encampment","")); + cubeCards.add(new CardIdentity("Gruul Turf","")); + cubeCards.add(new CardIdentity("Golgari Rot Farm","")); + cubeCards.add(new CardIdentity("Hallowed Fountain","")); + cubeCards.add(new CardIdentity("Library of Alexandria","")); + cubeCards.add(new CardIdentity("Lake of the Dead","")); + cubeCards.add(new CardIdentity("Llanowar Wastes","")); + cubeCards.add(new CardIdentity("Marsh Flats","")); + cubeCards.add(new CardIdentity("Boros Garrison","")); + cubeCards.add(new CardIdentity("Izzet Boilerworks","")); + cubeCards.add(new CardIdentity("Orzhov Basilica","")); + cubeCards.add(new CardIdentity("Mishra's Workshop","")); + cubeCards.add(new CardIdentity("Treetop Village","")); + cubeCards.add(new CardIdentity("Adarkar Wastes","")); + cubeCards.add(new CardIdentity("Plateau","")); + cubeCards.add(new CardIdentity("Rishadan Port","")); + cubeCards.add(new CardIdentity("Scalding Tarn","")); + cubeCards.add(new CardIdentity("Shivan Reef","")); + cubeCards.add(new CardIdentity("Steam Vents","")); + cubeCards.add(new CardIdentity("Strip Mine","")); + cubeCards.add(new CardIdentity("Taiga","")); + cubeCards.add(new CardIdentity("Thawing Glaciers","")); + cubeCards.add(new CardIdentity("Tropical Island","")); + cubeCards.add(new CardIdentity("Tundra","")); + cubeCards.add(new CardIdentity("Underground River","")); + cubeCards.add(new CardIdentity("Volcanic Island","")); + cubeCards.add(new CardIdentity("Windbrisk Heights","")); + cubeCards.add(new CardIdentity("Wooded Foothills","")); + cubeCards.add(new CardIdentity("Ancient Tomb","")); + cubeCards.add(new CardIdentity("Azorius Chancery","")); + cubeCards.add(new CardIdentity("Badlands","")); + cubeCards.add(new CardIdentity("Arid Mesa","")); + cubeCards.add(new CardIdentity("Misty Rainforest","")); + cubeCards.add(new CardIdentity("Maze of Ith","")); + cubeCards.add(new CardIdentity("Dimir Aqueduct","")); + cubeCards.add(new CardIdentity("Teetering Peaks","")); + cubeCards.add(new CardIdentity("Underground Sea","")); + cubeCards.add(new CardIdentity("Bloodstained Mire","")); + cubeCards.add(new CardIdentity("Watery Grave","")); + cubeCards.add(new CardIdentity("Sacred Foundry","")); + cubeCards.add(new CardIdentity("Stomping Ground","")); + cubeCards.add(new CardIdentity("Godless Shrine","")); + cubeCards.add(new CardIdentity("Breeding Pool","")); + cubeCards.add(new CardIdentity("Sulfurous Springs","")); + cubeCards.add(new CardIdentity("Yavimaya Coast","")); + cubeCards.add(new CardIdentity("Karplusan Forest","")); + cubeCards.add(new CardIdentity("Verdant Catacombs","")); + cubeCards.add(new CardIdentity("Wasteland","")); + cubeCards.add(new CardIdentity("Mishra's Factory","")); + cubeCards.add(new CardIdentity("Selesnya Sanctuary","")); + cubeCards.add(new CardIdentity("Rakdos Carnarium","")); + cubeCards.add(new CardIdentity("Simic Growth Chamber","")); + cubeCards.add(new CardIdentity("Karakas","")); + cubeCards.add(new CardIdentity("Temple Garden","")); + cubeCards.add(new CardIdentity("Overgrown Tomb","")); + cubeCards.add(new CardIdentity("Volrath's Stronghold","")); + cubeCards.add(new CardIdentity("Gaea's Cradle","")); + cubeCards.add(new CardIdentity("Tolarian Academy","")); + cubeCards.add(new CardIdentity("Flooded Strand","")); + cubeCards.add(new CardIdentity("Polluted Delta","")); + cubeCards.add(new CardIdentity("Windswept Heath","")); + cubeCards.add(new CardIdentity("Academy Ruins","")); + cubeCards.add(new CardIdentity("Battlefield Forge","")); + cubeCards.add(new CardIdentity("Ral Zarek","")); + cubeCards.add(new CardIdentity("Void","")); + cubeCards.add(new CardIdentity("Pernicious Deed","")); + cubeCards.add(new CardIdentity("Lightning Helix","")); + cubeCards.add(new CardIdentity("Electrolyze","")); + cubeCards.add(new CardIdentity("Grand Arbiter Augustin IV","")); + cubeCards.add(new CardIdentity("Kitchen Finks","")); + cubeCards.add(new CardIdentity("Stillmoon Cavalier","")); + cubeCards.add(new CardIdentity("Tidehollow Sculler","")); + cubeCards.add(new CardIdentity("Nicol Bolas, Planeswalker","")); + cubeCards.add(new CardIdentity("Sphinx of the Steel Wind","")); + cubeCards.add(new CardIdentity("Huntmaster of the Fells","")); + cubeCards.add(new CardIdentity("Mirari's Wake","")); + cubeCards.add(new CardIdentity("Venser, the Sojourner","")); + cubeCards.add(new CardIdentity("Shardless Agent","")); + cubeCards.add(new CardIdentity("Izzet Charm","")); + cubeCards.add(new CardIdentity("Abrupt Decay","")); + cubeCards.add(new CardIdentity("Domri Rade","")); + cubeCards.add(new CardIdentity("Mystic Snake","")); + cubeCards.add(new CardIdentity("Firemane Angel","")); + cubeCards.add(new CardIdentity("Angel of Despair","")); + cubeCards.add(new CardIdentity("Trygon Predator","")); + cubeCards.add(new CardIdentity("Simic Sky Swallower","")); + cubeCards.add(new CardIdentity("Boggart Ram-Gang","")); + cubeCards.add(new CardIdentity("Figure of Destiny","")); + cubeCards.add(new CardIdentity("Agony Warp","")); + cubeCards.add(new CardIdentity("Broodmate Dragon","")); + cubeCards.add(new CardIdentity("Knight of the Reliquary","")); + cubeCards.add(new CardIdentity("Bloodbraid Elf","")); + cubeCards.add(new CardIdentity("Edric, Spymaster of Trest","")); + cubeCards.add(new CardIdentity("Geist of Saint Traft","")); + cubeCards.add(new CardIdentity("Falkenrath Aristocrat","")); + cubeCards.add(new CardIdentity("Rakdos Cackler","")); + cubeCards.add(new CardIdentity("Dreadbore","")); + cubeCards.add(new CardIdentity("Dreg Mangler","")); + cubeCards.add(new CardIdentity("Vraska the Unseen","")); + cubeCards.add(new CardIdentity("Fleecemane Lion","")); + cubeCards.add(new CardIdentity("Daxos of Meletis","")); + cubeCards.add(new CardIdentity("Steam Augury","")); + cubeCards.add(new CardIdentity("Prophetic Bolt","")); + cubeCards.add(new CardIdentity("Shadowmage Infiltrator","")); + cubeCards.add(new CardIdentity("Ajani Vengeant","")); + cubeCards.add(new CardIdentity("Vindicate","")); + cubeCards.add(new CardIdentity("Maelstrom Pulse","")); + cubeCards.add(new CardIdentity("Tezzeret, Agent of Bolas","")); + cubeCards.add(new CardIdentity("Sorin, Lord of Innistrad","")); + cubeCards.add(new CardIdentity("Baleful Strix","")); + cubeCards.add(new CardIdentity("Xenagos, the Reveler","")); + cubeCards.add(new CardIdentity("Sphinx's Revelation","")); + cubeCards.add(new CardIdentity("Voice of Resurgence","")); + cubeCards.add(new CardIdentity("Null Rod","")); + cubeCards.add(new CardIdentity("Cursed Scroll","")); + cubeCards.add(new CardIdentity("All Is Dust","")); + cubeCards.add(new CardIdentity("Emrakul, the Aeons Torn","")); + cubeCards.add(new CardIdentity("Kozilek, Butcher of Truth","")); + cubeCards.add(new CardIdentity("Ulamog, the Infinite Gyre","")); + cubeCards.add(new CardIdentity("Shrine of Burning Rage","")); + cubeCards.add(new CardIdentity("Batterskull","")); + cubeCards.add(new CardIdentity("Lion's Eye Diamond","")); + cubeCards.add(new CardIdentity("Grim Monolith","")); + cubeCards.add(new CardIdentity("Memory Jar","")); + cubeCards.add(new CardIdentity("Mox Diamond","")); + cubeCards.add(new CardIdentity("Nevinyrral's Disk","")); + cubeCards.add(new CardIdentity("Orzhov Signet","")); + cubeCards.add(new CardIdentity("Pristine Talisman","")); + cubeCards.add(new CardIdentity("Rakdos Signet","")); + cubeCards.add(new CardIdentity("Sol Ring","")); + cubeCards.add(new CardIdentity("Tangle Wire","")); + cubeCards.add(new CardIdentity("Thran Dynamo","")); + cubeCards.add(new CardIdentity("Winter Orb","")); + cubeCards.add(new CardIdentity("Masticore","")); + cubeCards.add(new CardIdentity("Myr Battlesphere","")); + cubeCards.add(new CardIdentity("Molten-Tail Masticore","")); + cubeCards.add(new CardIdentity("Phyrexian Revoker","")); + cubeCards.add(new CardIdentity("Solemn Simulacrum","")); + cubeCards.add(new CardIdentity("Bonesplitter","")); + cubeCards.add(new CardIdentity("Sword of Body and Mind","")); + cubeCards.add(new CardIdentity("Sword of Feast and Famine","")); + cubeCards.add(new CardIdentity("Sword of War and Peace","")); + cubeCards.add(new CardIdentity("Chrome Mox","")); + cubeCards.add(new CardIdentity("Gilded Lotus","")); + cubeCards.add(new CardIdentity("Sword of Light and Shadow","")); + cubeCards.add(new CardIdentity("Razormane Masticore","")); + cubeCards.add(new CardIdentity("Pentad Prism","")); + cubeCards.add(new CardIdentity("Coalition Relic","")); + cubeCards.add(new CardIdentity("Mind Stone","")); + cubeCards.add(new CardIdentity("Precursor Golem","")); + cubeCards.add(new CardIdentity("Wurmcoil Engine","")); + cubeCards.add(new CardIdentity("Azorius Signet","")); + cubeCards.add(new CardIdentity("Simic Signet","")); + cubeCards.add(new CardIdentity("Basalt Monolith","")); + cubeCards.add(new CardIdentity("Mox Sapphire","")); + cubeCards.add(new CardIdentity("Mox Pearl","")); + cubeCards.add(new CardIdentity("Mox Ruby","")); + cubeCards.add(new CardIdentity("Mox Emerald","")); + cubeCards.add(new CardIdentity("Mox Jet","")); + cubeCards.add(new CardIdentity("Black Lotus","")); + cubeCards.add(new CardIdentity("Boros Signet","")); + cubeCards.add(new CardIdentity("Blightsteel Colossus","")); + cubeCards.add(new CardIdentity("Dimir Signet","")); + cubeCards.add(new CardIdentity("Epochrasite","")); + cubeCards.add(new CardIdentity("Etched Oracle","")); + cubeCards.add(new CardIdentity("Everflowing Chalice","")); + cubeCards.add(new CardIdentity("Gruul Signet","")); + cubeCards.add(new CardIdentity("Izzet Signet","")); + cubeCards.add(new CardIdentity("Golgari Signet","")); + cubeCards.add(new CardIdentity("Lodestone Golem","")); + cubeCards.add(new CardIdentity("Lotus Bloom","")); + cubeCards.add(new CardIdentity("Mana Crypt","")); + cubeCards.add(new CardIdentity("Mana Vault","")); + cubeCards.add(new CardIdentity("Selesnya Signet","")); + cubeCards.add(new CardIdentity("Metalworker","")); + cubeCards.add(new CardIdentity("Scroll Rack","")); + cubeCards.add(new CardIdentity("Worn Powerstone","")); + cubeCards.add(new CardIdentity("Smokestack","")); + cubeCards.add(new CardIdentity("Lightning Greaves","")); + cubeCards.add(new CardIdentity("Sundering Titan","")); + cubeCards.add(new CardIdentity("Sword of Fire and Ice","")); + cubeCards.add(new CardIdentity("Skullclamp","")); + cubeCards.add(new CardIdentity("Vedalken Shackles","")); + cubeCards.add(new CardIdentity("Crucible of Worlds","")); + cubeCards.add(new CardIdentity("Sensei's Divining Top","")); + cubeCards.add(new CardIdentity("Umezawa's Jitte","")); + cubeCards.add(new CardIdentity("Manriki-Gusari","")); + cubeCards.add(new CardIdentity("Karn Liberated","")); + + } +} diff --git a/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/SealedEliminationCubeTournamentType.java b/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/SealedEliminationCubeTournamentType.java new file mode 100644 index 0000000000..c9c550707e --- /dev/null +++ b/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/SealedEliminationCubeTournamentType.java @@ -0,0 +1,50 @@ +/* + * 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.tournament; + +import mage.game.tournament.TournamentType; + +/** + * + * @author LevelX2 + */ +public class SealedEliminationCubeTournamentType extends TournamentType { + + public SealedEliminationCubeTournamentType() { + this.name = "Sealed Elimination (Cube)"; + this.maxPlayers = 16; + this.minPlayers = 2; + this.numBoosters = 6; + this.draft = false; + this.limited = true; + this.cubeBooster = true; + this.elimination = true; + } + +} diff --git a/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/SealedEliminationTournamentType.java b/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/SealedEliminationTournamentType.java index 2e6462fe0f..92a437ae82 100644 --- a/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/SealedEliminationTournamentType.java +++ b/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/SealedEliminationTournamentType.java @@ -43,6 +43,8 @@ public class SealedEliminationTournamentType extends TournamentType { + + public SealedSwissCubeTournamentType() { + this.name = "Sealed Swiss (Cube)"; + this.maxPlayers = 16; + this.minPlayers = 2; + this.numBoosters = 6; + this.draft = false; + this.limited = true; + this.cubeBooster = true; + this.elimination = false; + } + +} diff --git a/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/SealedSwissTournament.java b/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/SealedSwissTournament.java new file mode 100644 index 0000000000..91b773d13c --- /dev/null +++ b/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/SealedSwissTournament.java @@ -0,0 +1,74 @@ +/* + * 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.tournament; + +import mage.game.tournament.TournamentOptions; +import mage.game.tournament.TournamentSwiss; + +/** + * + * @author LevelX2 + */ +public class SealedSwissTournament extends TournamentSwiss { + + protected enum TournamentStep { + START, OPEN_BOOSTERS, CONSTRUCT, COMPETE, WINNERS + } + + protected TournamentStep currentStep; + + public SealedSwissTournament(TournamentOptions options) { + super(options); + currentStep = TournamentStep.START; + } + + @Override + public void nextStep() { + switch (currentStep) { + case START: + currentStep = TournamentStep.OPEN_BOOSTERS; + openBoosters(); + break; + case OPEN_BOOSTERS: + currentStep = TournamentStep.CONSTRUCT; + construct(); + break; + case CONSTRUCT: + currentStep = TournamentStep.COMPETE; + runTournament(); + break; + case COMPETE: + currentStep = TournamentStep.WINNERS; + winners(); + end(); + break; + } + } + +} diff --git a/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/SealedSwissTournamentType.java b/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/SealedSwissTournamentType.java new file mode 100644 index 0000000000..4badd34391 --- /dev/null +++ b/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/SealedSwissTournamentType.java @@ -0,0 +1,50 @@ +/* + * 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.tournament; + +import mage.game.tournament.TournamentType; + +/** + * + * @author BetaSteward_at_googlemail.com + */ +public class SealedSwissTournamentType extends TournamentType { + + public SealedSwissTournamentType() { + this.name = "Sealed Swiss"; + this.maxPlayers = 16; + this.minPlayers = 2; + this.numBoosters = 6; + this.draft = false; + this.limited = true; + this.cubeBooster = false; + this.elimination = false; + } + +} diff --git a/Mage.Server/config/config.xml b/Mage.Server/config/config.xml index e202f839a2..991e027f93 100644 --- a/Mage.Server/config/config.xml +++ b/Mage.Server/config/config.xml @@ -9,7 +9,7 @@ minUserNameLength="3" maxUserNameLength="14" userNamePattern="[^a-z0-9_]" - maxAiOpponents="2" + maxAiOpponents="3" /> @@ -25,9 +25,20 @@ - + + + + + + + + + + + + diff --git a/Mage.Server/release/config/config.xml b/Mage.Server/release/config/config.xml index 61e13f824d..9acdf6a372 100644 --- a/Mage.Server/release/config/config.xml +++ b/Mage.Server/release/config/config.xml @@ -14,9 +14,20 @@ - + + + + + + + + + + + + diff --git a/Mage.Server/src/main/java/mage/server/MageServerImpl.java b/Mage.Server/src/main/java/mage/server/MageServerImpl.java index 13f101dd75..48d43d2750 100644 --- a/Mage.Server/src/main/java/mage/server/MageServerImpl.java +++ b/Mage.Server/src/main/java/mage/server/MageServerImpl.java @@ -48,6 +48,7 @@ import mage.interfaces.MageServer; import mage.interfaces.ServerState; import mage.interfaces.callback.ClientCallback; import mage.remote.MageVersionException; +import mage.server.draft.CubeFactory; import mage.server.draft.DraftManager; import mage.server.game.DeckValidatorFactory; import mage.server.game.GameFactory; @@ -820,6 +821,7 @@ public class MageServerImpl implements MageServer { TournamentFactory.getInstance().getTournamentTypes(), PlayerFactory.getInstance().getPlayerTypes().toArray(new String[PlayerFactory.getInstance().getPlayerTypes().size()]), DeckValidatorFactory.getInstance().getDeckTypes().toArray(new String[DeckValidatorFactory.getInstance().getDeckTypes().size()]), + CubeFactory.getInstance().getDraftCubes().toArray(new String[CubeFactory.getInstance().getDraftCubes().size()]), testMode, Main.getVersion()); } diff --git a/Mage.Server/src/main/java/mage/server/Main.java b/Mage.Server/src/main/java/mage/server/Main.java index 7dae7a7e17..35d056918c 100644 --- a/Mage.Server/src/main/java/mage/server/Main.java +++ b/Mage.Server/src/main/java/mage/server/Main.java @@ -40,6 +40,7 @@ import mage.game.match.MatchType; import mage.game.tournament.TournamentType; import mage.interfaces.MageServer; import mage.remote.Connection; +import mage.server.draft.CubeFactory; import mage.server.game.DeckValidatorFactory; import mage.server.game.GameFactory; import mage.server.game.PlayerFactory; @@ -104,6 +105,9 @@ public class Main { for (Plugin plugin: config.getPlayerTypes()) { PlayerFactory.getInstance().addPlayerType(plugin.getName(), loadPlugin(plugin)); } + for (Plugin plugin: config.getDraftCubes()) { + CubeFactory.getInstance().addDraftCube(plugin.getName(), loadPlugin(plugin)); + } for (Plugin plugin: config.getDeckTypes()) { DeckValidatorFactory.getInstance().addDeckType(plugin.getName(), loadPlugin(plugin)); } @@ -260,7 +264,7 @@ public class Main { logger.debug("Loading plugin: " + plugin.getClassName()); return Class.forName(plugin.getClassName(), true, classLoader); } catch (ClassNotFoundException ex) { - logger.warn("Plugin not Found:" + plugin.getJar() + " - check plugin folder"); + logger.warn(new StringBuilder("Plugin not Found: ").append(plugin.getClassName()).append(" - ").append(plugin.getJar()).append(" - check plugin folder")); } catch (Exception ex) { logger.fatal("Error loading plugin " + plugin.getJar(), ex); } @@ -286,7 +290,7 @@ public class Main { logger.debug("Loading tournament type: " + plugin.getClassName()); return (TournamentType) Class.forName(plugin.getTypeName(), true, classLoader).newInstance(); } catch (ClassNotFoundException ex) { - logger.warn("Tournament type not found:" + plugin.getJar() + " - check plugin folder"); + logger.warn("Tournament type not found:" + plugin.getName() + " / "+ plugin.getJar() + " - check plugin folder"); } catch (Exception ex) { logger.fatal("Error loading game type " + plugin.getJar(), ex); } diff --git a/Mage.Server/src/main/java/mage/server/draft/CubeFactory.java b/Mage.Server/src/main/java/mage/server/draft/CubeFactory.java new file mode 100644 index 0000000000..356628f111 --- /dev/null +++ b/Mage.Server/src/main/java/mage/server/draft/CubeFactory.java @@ -0,0 +1,80 @@ +/* +* Copyright 2010 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.server.draft; + +import java.lang.reflect.Constructor; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; +import mage.game.draft.DraftCube; +import org.apache.log4j.Logger; + +/** + * + * @author LevelX2 + */ +public class CubeFactory { + + private static final CubeFactory INSTANCE = new CubeFactory(); + private static final Logger logger = Logger.getLogger(CubeFactory.class); + + private Map draftCubes = new LinkedHashMap(); + + public static CubeFactory getInstance() { + return INSTANCE; + } + + private CubeFactory() {} + + public DraftCube createDraftCube(String draftCubeName) { + + DraftCube draftCube; + Constructor con; + try { + con = draftCubes.get(draftCubeName).getConstructor(new Class[]{}); + draftCube = (DraftCube)con.newInstance(new Object[] {}); + } catch (Exception ex) { + logger.fatal("CubeFactory error", ex); + return null; + } + logger.debug("Draft cube created: " + draftCube.getName()); + + return draftCube; + } + + public Set getDraftCubes() { + return draftCubes.keySet(); + } + + public void addDraftCube(String name, Class draftCube) { + if (draftCube != null) { + this.draftCubes.put(name, draftCube); + } + } + +} diff --git a/Mage.Server/src/main/java/mage/server/game/DeckValidatorFactory.java b/Mage.Server/src/main/java/mage/server/game/DeckValidatorFactory.java index 8eccb0ccb6..0bc0ab1ce7 100644 --- a/Mage.Server/src/main/java/mage/server/game/DeckValidatorFactory.java +++ b/Mage.Server/src/main/java/mage/server/game/DeckValidatorFactory.java @@ -73,8 +73,9 @@ public class DeckValidatorFactory { } public void addDeckType(String name, Class deckType) { - if (deckType != null) + if (deckType != null) { this.deckTypes.put(name, deckType); + } } } diff --git a/Mage.Server/src/main/java/mage/server/tournament/TournamentFactory.java b/Mage.Server/src/main/java/mage/server/tournament/TournamentFactory.java index f000cdba9a..fa32f32437 100644 --- a/Mage.Server/src/main/java/mage/server/tournament/TournamentFactory.java +++ b/Mage.Server/src/main/java/mage/server/tournament/TournamentFactory.java @@ -38,6 +38,7 @@ import mage.cards.Sets; import mage.game.tournament.Tournament; import mage.game.tournament.TournamentOptions; import mage.game.tournament.TournamentType; +import mage.server.draft.CubeFactory; import mage.view.TournamentTypeView; import org.apache.log4j.Logger; @@ -74,11 +75,21 @@ public class TournamentFactory { int count = setInfo.containsKey(setCode) ? setInfo.get(setCode) : 0; setInfo.put(setCode, count + 1); } - StringBuilder sb = new StringBuilder(); - for (Map.Entry entry:setInfo.entrySet()) { - sb.append(entry.getValue().toString()).append("x").append(entry.getKey()).append(" "); + if (tournament.getTournamentType().isLimited()) { + tournament.getOptions().getLimitedOptions().setNumberBoosters(tournament.getTournamentType().getNumBoosters()); + if (tournament.getTournamentType().isCubeBooster()) { + tournament.getOptions().getLimitedOptions().setDraftCube(CubeFactory.getInstance().createDraftCube(tournament.getOptions().getLimitedOptions().getDraftCubeName())); + tournament.setBoosterInfo(tournament.getOptions().getLimitedOptions().getDraftCubeName()); + } else { + StringBuilder sb = new StringBuilder(); + for (Map.Entry entry:setInfo.entrySet()) { + sb.append(entry.getValue().toString()).append("x").append(entry.getKey()).append(" "); + } + tournament.setBoosterInfo(sb.toString()); + } + } - tournament.setSetsFormatedShort(sb.toString()); + } catch (Exception ex) { logger.fatal("TournamentFactory error ", ex); return null; diff --git a/Mage.Server/src/main/java/mage/server/util/ConfigSettings.java b/Mage.Server/src/main/java/mage/server/util/ConfigSettings.java index 92c1cfd987..5553eea9ec 100644 --- a/Mage.Server/src/main/java/mage/server/util/ConfigSettings.java +++ b/Mage.Server/src/main/java/mage/server/util/ConfigSettings.java @@ -111,6 +111,10 @@ public class ConfigSettings { return config.getTournamentTypes().getTournamentType(); } + public List getDraftCubes() { + return config.getDraftCubes().getDraftCube(); + } + public List getDeckTypes() { return config.getDeckTypes().getDeckType(); } diff --git a/Mage.Server/src/main/xml-resources/jaxb/Config/Config.xsd b/Mage.Server/src/main/xml-resources/jaxb/Config/Config.xsd index 0365114890..246ffd4055 100644 --- a/Mage.Server/src/main/xml-resources/jaxb/Config/Config.xsd +++ b/Mage.Server/src/main/xml-resources/jaxb/Config/Config.xsd @@ -9,6 +9,7 @@ + @@ -66,6 +67,14 @@ + + + + + + + + diff --git a/Mage/src/mage/game/draft/BoosterDraft.java b/Mage/src/mage/game/draft/BoosterDraft.java index a0703cec1f..f37cd3fd67 100644 --- a/Mage/src/mage/game/draft/BoosterDraft.java +++ b/Mage/src/mage/game/draft/BoosterDraft.java @@ -43,7 +43,7 @@ public class BoosterDraft extends DraftImpl { @Override public void start() { - while (boosterNum < sets.size()) { + while (boosterNum < numberBoosters) { openBooster(); while (!isAbort() && pickCards()) { if (boosterNum % 2 == 1) { diff --git a/Mage/src/mage/game/draft/Draft.java b/Mage/src/mage/game/draft/Draft.java index 5ab22747c4..0c03a55520 100644 --- a/Mage/src/mage/game/draft/Draft.java +++ b/Mage/src/mage/game/draft/Draft.java @@ -49,6 +49,8 @@ public interface Draft extends MageItem, Serializable { Collection getPlayers(); boolean replacePlayer(Player oldPlayer, Player newPlayer); DraftPlayer getPlayer(UUID playerId); + int getNumberBoosters(); + DraftCube getDraftCube(); List getSets(); int getBoosterNum(); int getCardNum(); diff --git a/Mage/src/mage/game/draft/DraftCube.java b/Mage/src/mage/game/draft/DraftCube.java new file mode 100644 index 0000000000..b79a3ffb57 --- /dev/null +++ b/Mage/src/mage/game/draft/DraftCube.java @@ -0,0 +1,141 @@ +/* + * Copyright 2010 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.draft; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import mage.cards.Card; +import mage.cards.repository.CardCriteria; +import mage.cards.repository.CardInfo; +import mage.cards.repository.CardRepository; +import org.apache.log4j.Logger; + +/** + * + * @author LevelX2 + */ +public abstract class DraftCube { + + public class CardIdentity { + private String name; + private String extension; + + public CardIdentity(String name, String extension) { + this.name = name; + this.extension = extension; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getExtension() { + return extension; + } + + public void setExtension(String extension) { + this.extension = extension; + } + } + + private static final Logger logger = Logger.getLogger(DraftCube.class); + + private static Random rnd = new Random(); + private String name; + private int boosterSize = 15; + + protected List cubeCards = new ArrayList(); + protected List leftCubeCards = new ArrayList(); + + public DraftCube(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public List getCubeCards() { + return cubeCards; + } + + public List createBooster() { + List booster = new ArrayList(); + if (leftCubeCards.isEmpty()) { + leftCubeCards.addAll(cubeCards); + } + + for (int i = 0; i < boosterSize; i++) { + boolean done = false; + int notValid = 0; + while (!done) { + int index = rnd.nextInt(leftCubeCards.size()); + CardIdentity cardId = leftCubeCards.get(index); + leftCubeCards.remove(index); + if (!cardId.getName().isEmpty()) { + CardInfo cardInfo = null; + if (!cardId.getExtension().isEmpty()) { + CardCriteria criteria = new CardCriteria().name(cardId.getName()).setCodes(cardId.extension); + List cardList = CardRepository.instance.findCards(criteria); + if (cardList != null && cardList.size() > 0) { + cardInfo = cardList.get(0); + } + } else { + cardInfo = CardRepository.instance.findCard(cardId.getName()); + } + + if (cardInfo != null) { + booster.add(cardInfo.getCard()); + done = true; + } else { + logger.error(new StringBuilder(this.getName()).append(" - Card not found: ").append(cardId.getName()).append(":").append(cardId.extension)); + notValid++; + } + } else { + logger.error(new StringBuilder(this.getName()).append(" - Empty card name: ").append(cardId.getName()).append(":").append(cardId.extension)); + notValid++; + } + + if (leftCubeCards.isEmpty()) { + leftCubeCards.addAll(cubeCards); + } + if (notValid > cubeCards.size()) { + logger.error(new StringBuilder(this.getName()).append(" - Booster could not be created, no valid cards found ")); + done = true; + } + } + } + + return booster; + } +} diff --git a/Mage/src/mage/game/draft/DraftImpl.java b/Mage/src/mage/game/draft/DraftImpl.java index 248a876357..f4caf1fc55 100644 --- a/Mage/src/mage/game/draft/DraftImpl.java +++ b/Mage/src/mage/game/draft/DraftImpl.java @@ -54,6 +54,8 @@ public abstract class DraftImpl> implements Draft { protected final UUID id; protected Map players = new HashMap(); protected PlayerList table = new PlayerList(); + protected int numberBoosters; + protected DraftCube draftCube; protected List sets; protected List setCodes; protected int boosterNum = 0; @@ -69,8 +71,10 @@ public abstract class DraftImpl> implements Draft { public DraftImpl(DraftOptions options, List sets) { id = UUID.randomUUID(); this.setCodes = options.getSetCodes(); + this.draftCube = options.getDraftCube(); this.timing = options.getTiming(); this.sets = sets; + this.numberBoosters = options.getNumberBoosters(); } @Override @@ -134,6 +138,22 @@ public abstract class DraftImpl> implements Draft { return players.get(playerId); } + @Override + public DraftCube getDraftCube() { + return draftCube; + } + + /** + * Number of boosters that each player gets in this draft + * + * @return + */ + @Override + public int getNumberBoosters() { + return numberBoosters; + } + + @Override public List getSets() { return sets; @@ -207,9 +227,13 @@ public abstract class DraftImpl> implements Draft { protected void openBooster() { - if (boosterNum < sets.size()) { + if (boosterNum < numberBoosters) { for (DraftPlayer player: players.values()) { - player.setBooster(sets.get(boosterNum).createBooster()); + if (draftCube != null) { + player.setBooster(draftCube.createBooster()); + } else { + player.setBooster(sets.get(boosterNum).createBooster()); + } } } boosterNum++; diff --git a/Mage/src/mage/game/draft/DraftOptions.java b/Mage/src/mage/game/draft/DraftOptions.java index adff6821fe..d47faef3a7 100644 --- a/Mage/src/mage/game/draft/DraftOptions.java +++ b/Mage/src/mage/game/draft/DraftOptions.java @@ -39,7 +39,7 @@ public class DraftOptions extends LimitedOptions implements Serializable { protected String draftType; protected TimingOption timing; - + public enum TimingOption { REGULAR (1), BEGINNER (2), diff --git a/Mage/src/mage/game/tournament/LimitedOptions.java b/Mage/src/mage/game/tournament/LimitedOptions.java index dbe3abc543..3db3aed392 100644 --- a/Mage/src/mage/game/tournament/LimitedOptions.java +++ b/Mage/src/mage/game/tournament/LimitedOptions.java @@ -31,6 +31,7 @@ package mage.game.tournament; import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import mage.game.draft.DraftCube; /** * @@ -40,6 +41,9 @@ public class LimitedOptions implements Serializable { protected List sets = new ArrayList(); protected int constructionTime; + protected String draftCubeName; + protected DraftCube draftCube; + protected int numberBoosters; public List getSetCodes() { return sets; @@ -52,5 +56,29 @@ public class LimitedOptions implements Serializable { public void setConstructionTime(int constructionTime) { this.constructionTime = constructionTime; } + + public String getDraftCubeName() { + return draftCubeName; + } + + public void setDraftCubeName(String draftCubeName) { + this.draftCubeName = draftCubeName; + } + + public DraftCube getDraftCube() { + return draftCube; + } + + public void setDraftCube(DraftCube draftCube) { + this.draftCube = draftCube; + } + + public int getNumberBoosters() { + return numberBoosters; + } + + public void setNumberBoosters(int numberBoosters) { + this.numberBoosters = numberBoosters; + } } diff --git a/Mage/src/mage/game/tournament/Round.java b/Mage/src/mage/game/tournament/Round.java index 7ea717cb83..11b711153c 100644 --- a/Mage/src/mage/game/tournament/Round.java +++ b/Mage/src/mage/game/tournament/Round.java @@ -40,6 +40,7 @@ public class Round { private int roundNum; private List pairs = new ArrayList(); + private List playerByes = new ArrayList(); public Round(int roundNum) { this.roundNum = roundNum; @@ -74,4 +75,9 @@ public class Round { } return true; } + + public List getPlayerByes() { + return playerByes; + } + } diff --git a/Mage/src/mage/game/tournament/Tournament.java b/Mage/src/mage/game/tournament/Tournament.java index 6c031fb189..bdabf7ee1c 100644 --- a/Mage/src/mage/game/tournament/Tournament.java +++ b/Mage/src/mage/game/tournament/Tournament.java @@ -53,12 +53,12 @@ public interface Tournament { Collection getRounds(); List getSets(); - void setSetsFormatedShort(String setInfo); + void setBoosterInfo(String setInfo); /** - * Gives back a String that shows the included sets (e.g. "3xRTR" or "1xDGM 1xGTC 1xRTR") + * Gives back a String that shows the included sets (e.g. "3xRTR" or "1xDGM 1xGTC 1xRTR") or cube name * @return String */ - String getSetsFormatedShort(); + String getBoosterInfo(); void submitDeck(UUID playerId, Deck deck); void updateDeck(UUID playerId, Deck deck); void autoSubmit(UUID playerId, Deck deck); @@ -80,4 +80,6 @@ public interface Tournament { // tournament type TournamentType getTournamentType(); void setTournamentType(TournamentType tournamentType); + + int getNumberRounds(); } diff --git a/Mage/src/mage/game/tournament/TournamentImpl.java b/Mage/src/mage/game/tournament/TournamentImpl.java index 11caeeb1ea..0d81ff46f8 100644 --- a/Mage/src/mage/game/tournament/TournamentImpl.java +++ b/Mage/src/mage/game/tournament/TournamentImpl.java @@ -33,6 +33,8 @@ import java.util.concurrent.CopyOnWriteArrayList; import mage.cards.Card; import mage.cards.ExpansionSet; import mage.cards.decks.Deck; +import mage.constants.TournamentPlayerState; +import mage.game.draft.DraftCube; import mage.game.events.*; import mage.game.events.TableEvent.EventType; import mage.game.match.Match; @@ -104,6 +106,11 @@ public abstract class TournamentImpl implements Tournament { return players.values(); } + @Override + public int getNumberRounds() { + return options.getNumberRounds(); + } + @Override public Collection getRounds() { return rounds; @@ -115,12 +122,12 @@ public abstract class TournamentImpl implements Tournament { } @Override - public void setSetsFormatedShort(String setsInfoShort) { + public void setBoosterInfo(String setsInfoShort) { this.setsInfoShort = setsInfoShort; } @Override - public String getSetsFormatedShort() { + public String getBoosterInfo() { return setsInfoShort; } @@ -169,6 +176,13 @@ public abstract class TournamentImpl implements Tournament { roundPlayers.remove(i); round.addPairing(new TournamentPairing(player1, player2)); } + if (roundPlayers.size() > 0) { + // player free round - add to bye players of this round + TournamentPlayer player1 = roundPlayers.get(0); + round.getPlayerByes().add(player1); + player1.setState(TournamentPlayerState.WAITING); + player1.setStateInfo("Round Bye"); + } return round; } @@ -203,6 +217,7 @@ public abstract class TournamentImpl implements Tournament { for (TournamentPlayer player: players.values()) { player.setResults(""); player.setPoints(0); + player.setStateInfo(""); } for (Round round: rounds) { for (TournamentPairing pair: round.getPairs()) { @@ -232,6 +247,14 @@ public abstract class TournamentImpl implements Tournament { players.get(player2Id).setPoints(points + 1); } } + for (TournamentPlayer tournamentPlayer : round.getPlayerByes()) { + UUID player1Id = tournamentPlayer.getPlayer().getId(); + StringBuilder sb1 = new StringBuilder(players.get(player1Id).getResults()); + sb1.append("(Round Bye) "); + players.get(player1Id).setResults(sb1.toString()); + int points = players.get(player1Id).getPoints(); + players.get(player1Id).setPoints(points + 3); + } } } @@ -296,10 +319,20 @@ public abstract class TournamentImpl implements Tournament { protected void openBoosters() { for (TournamentPlayer player: this.players.values()) { player.setDeck(new Deck()); - for (ExpansionSet set: sets) { - List booster = set.createBooster(); - for (Card card: booster) { - player.getDeck().getSideboard().add(card); + if (options.getLimitedOptions().getDraftCube() != null) { + DraftCube cube = options.getLimitedOptions().getDraftCube(); + for (int i = 0; i < options.getLimitedOptions().getNumberBoosters(); i++) { + List booster = cube.createBooster(); + for (Card card: booster) { + player.getDeck().getSideboard().add(card); + } + } + } else { + for (ExpansionSet set: sets) { + List booster = set.createBooster(); + for (Card card: booster) { + player.getDeck().getSideboard().add(card); + } } } } @@ -343,4 +376,14 @@ public abstract class TournamentImpl implements Tournament { this.tournamentType = tournamentType; } + protected void winners() { + // TODO: Generate StateInfo for Swiss pairing (1st, 2nd, ...) + for(TournamentPlayer winner: this.getActivePlayers()) { + winner.setState(TournamentPlayerState.FINISHED); + if (options.getNumberRounds() == 0) { // if no swiss, last active is the winner + winner.setStateInfo("Winner"); + } + } + } + } diff --git a/Mage/src/mage/game/tournament/TournamentOptions.java b/Mage/src/mage/game/tournament/TournamentOptions.java index 9ff711b35a..6b5aea6d49 100644 --- a/Mage/src/mage/game/tournament/TournamentOptions.java +++ b/Mage/src/mage/game/tournament/TournamentOptions.java @@ -45,6 +45,7 @@ public class TournamentOptions implements Serializable { protected MatchOptions matchOptions = new MatchOptions("", "Two Player Duel"); protected LimitedOptions limitedOptions; protected boolean watchingAllowed = true; + protected int numberRounds; public TournamentOptions(String name) { this.name = name; @@ -86,4 +87,12 @@ public class TournamentOptions implements Serializable { this.watchingAllowed = watchingAllowed; } + public int getNumberRounds() { + return numberRounds; + } + + public void setNumberRounds(int numberRounds) { + this.numberRounds = numberRounds; + } + } diff --git a/Mage/src/mage/game/tournament/TournamentSingleElimination.java b/Mage/src/mage/game/tournament/TournamentSingleElimination.java index f369e01956..7217003101 100644 --- a/Mage/src/mage/game/tournament/TournamentSingleElimination.java +++ b/Mage/src/mage/game/tournament/TournamentSingleElimination.java @@ -30,7 +30,6 @@ package mage.game.tournament; import java.util.Map; import java.util.UUID; -import mage.constants.TournamentPlayerState; /** * @@ -66,11 +65,6 @@ public abstract class TournamentSingleElimination extends TournamentImpl { } } - protected void winners() { - for(TournamentPlayer winner: this.getActivePlayers()) { - winner.setState(TournamentPlayerState.FINISHED); - winner.setStateInfo("Winner"); - } - } + } diff --git a/Mage/src/mage/game/tournament/TournamentSwiss.java b/Mage/src/mage/game/tournament/TournamentSwiss.java index a93a13c171..0db706d599 100644 --- a/Mage/src/mage/game/tournament/TournamentSwiss.java +++ b/Mage/src/mage/game/tournament/TournamentSwiss.java @@ -27,6 +27,13 @@ */ package mage.game.tournament; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import mage.constants.TournamentPlayerState; + /** * * @author BetaSteward_at_googlemail.com @@ -39,7 +46,86 @@ public abstract class TournamentSwiss extends TournamentImpl { @Override protected void runTournament() { - //TODO: implement this + for (Map.Entry entry: players.entrySet()) { + if (entry.getValue().getPlayer().autoLoseGame()) { + entry.getValue().setEliminated(); + entry.getValue().setResults("Auto Eliminated"); + } + } + + while (this.getActivePlayers().size() > 1 && this.getNumberRounds() > this.getRounds().size()) { + // Swiss pairing + Round round = createRoundSwiss(); + playRound(round); + } + nextStep(); } + protected Round createRoundSwiss() { + Round round = new Round(rounds.size() + 1); + rounds.add(round); + List roundPlayers = getActivePlayers(); + // sort players by tournament points + Collections.sort(roundPlayers, new Comparator() { + @Override public int compare(TournamentPlayer p1, TournamentPlayer p2) { + return p2.getPoints() - p1.getPoints(); + } + + }); + // create pairings + while (roundPlayers.size() > 0) { + TournamentPlayer player1 = roundPlayers.get(0); + roundPlayers.remove(0); + TournamentPlayer playerForPossibleSecondPairing = null; + for (TournamentPlayer player2: roundPlayers) { + if (alreadyPaired(player1, player2)) { + // if laready paired but equal ponts -> remember if second pairing is needed + if (playerForPossibleSecondPairing == null) { + playerForPossibleSecondPairing = player2; + } + } else { + if (player2.getPoints() < player1.getPoints() && playerForPossibleSecondPairing != null) { + // pair again with a player + round.addPairing(new TournamentPairing(player1, playerForPossibleSecondPairing)); + roundPlayers.remove(playerForPossibleSecondPairing); + player1 = null; + break; + } else { + // pair agains the next not paired before + round.addPairing(new TournamentPairing(player1, player2)); + roundPlayers.remove(player2); + player1 = null; + break; + } + } + } + if (player1 != null) { + // no pairing done yet + if (playerForPossibleSecondPairing != null) { + // pair again with a player + round.addPairing(new TournamentPairing(player1, playerForPossibleSecondPairing)); + roundPlayers.remove(playerForPossibleSecondPairing); + } else { + // player free round - add to bye players of this round + round.getPlayerByes().add(player1); + player1.setState(TournamentPlayerState.WAITING); + player1.setStateInfo("Round Bye"); + } + } + } + return round; + } + + protected boolean alreadyPaired(TournamentPlayer player1, TournamentPlayer player2) { + for (Round round : rounds) { + for (TournamentPairing pairing: round.getPairs()) { + if (pairing.getPlayer1().equals(player1) || pairing.getPlayer2().equals(player1)) { + if (pairing.getPlayer1().equals(player2) || pairing.getPlayer2().equals(player2)) { + return true; + } + } + } + } + return false; + } } diff --git a/Mage/src/mage/game/tournament/TournamentType.java b/Mage/src/mage/game/tournament/TournamentType.java index d367c4957e..5af9055a66 100644 --- a/Mage/src/mage/game/tournament/TournamentType.java +++ b/Mage/src/mage/game/tournament/TournamentType.java @@ -40,8 +40,10 @@ public class TournamentType > implements Serializabl protected int minPlayers; protected int maxPlayers; protected int numBoosters; - protected boolean draft; - protected boolean limited; + protected boolean cubeBooster; // boosters are generated from a defined cube + protected boolean draft; // or sealed + protected boolean limited; // or construced + protected boolean elimination; // or Swiss protected TournamentType() {} @@ -73,4 +75,13 @@ public class TournamentType > implements Serializabl public boolean isLimited() { return limited; } + + public boolean isElimination() { + return elimination; + } + + public boolean isCubeBooster() { + return cubeBooster; + } + }