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