diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/RichManCubeDraftEliminationTournament.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/RichManCubeDraftEliminationTournament.java
new file mode 100644
index 0000000000..70c3bdb847
--- /dev/null
+++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/RichManCubeDraftEliminationTournament.java
@@ -0,0 +1,89 @@
+/*
+ * 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.DraftOptions;
+import mage.game.draft.RichManCubeBoosterDraft;
+import mage.game.events.TableEvent.EventType;
+import mage.game.tournament.TournamentOptions;
+import mage.game.tournament.TournamentPlayer;
+import mage.game.tournament.TournamentSingleElimination;
+
+/**
+ *
+ * @author spjspj
+ */
+public class RichManCubeDraftEliminationTournament extends TournamentSingleElimination {
+
+ protected enum TournamentStep {
+ START, DRAFT, CONSTRUCT, COMPETE, WINNERS
+ }
+
+ protected TournamentStep currentStep;
+
+ public RichManCubeDraftEliminationTournament(TournamentOptions options) {
+ super(options);
+ currentStep = TournamentStep.START;
+ }
+
+ protected void draft() {
+ draft = new RichManCubeBoosterDraft((DraftOptions) options.getLimitedOptions(), getSets());
+ for (TournamentPlayer player : players.values()) {
+ draft.addPlayer(player.getPlayer());
+ player.setState(TournamentPlayerState.DRAFTING);
+ }
+ tableEventSource.fireTableEvent(EventType.START_DRAFT, null, draft);
+ }
+
+ @Override
+ public void nextStep() {
+ if (isAbort()) {
+ currentStep = TournamentStep.COMPETE;
+ }
+ switch (currentStep) {
+ case START:
+ currentStep = TournamentStep.DRAFT;
+ draft();
+ break;
+ case DRAFT:
+ 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/config/config.xml b/Mage.Server/config/config.xml
index 924d92a58a..b211ab08a1 100644
--- a/Mage.Server/config/config.xml
+++ b/Mage.Server/config/config.xml
@@ -81,6 +81,7 @@
+
diff --git a/Mage/src/main/java/mage/game/draft/DraftCube.java b/Mage/src/main/java/mage/game/draft/DraftCube.java
index b45a2fa09e..e5df9e6680 100644
--- a/Mage/src/main/java/mage/game/draft/DraftCube.java
+++ b/Mage/src/main/java/mage/game/draft/DraftCube.java
@@ -139,4 +139,17 @@ public abstract class DraftCube {
return booster;
}
+
+ void removeFromLeftCards(CardIdentity cardId) {
+ if (cardId == null) {
+ return;
+ }
+
+ for (int i = leftCubeCards.size() - 1; i >= 0; i--) {
+ if (leftCubeCards.get(i) == cardId) {
+ leftCubeCards.remove(i);
+ return;
+ }
+ }
+ }
}
diff --git a/Mage/src/main/java/mage/game/draft/RichManCubeBoosterDraft.java b/Mage/src/main/java/mage/game/draft/RichManCubeBoosterDraft.java
new file mode 100644
index 0000000000..548b366ab8
--- /dev/null
+++ b/Mage/src/main/java/mage/game/draft/RichManCubeBoosterDraft.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2011 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.game.draft;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import mage.cards.Card;
+import mage.cards.ExpansionSet;
+import mage.game.draft.DraftCube.CardIdentity;
+
+/**
+ *
+ * @author spjspj
+ */
+public class RichManCubeBoosterDraft extends DraftImpl {
+
+ protected int[] richManTimes = {75, 70, 65, 60, 55, 50, 45, 40, 35, 35, 35, 35, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25};
+ protected final Map cardsInCube = new LinkedHashMap<>();
+
+ public RichManCubeBoosterDraft(DraftOptions options, List sets) {
+ super(options, sets);
+ }
+
+ @Override
+ public void start() {
+ cardNum = 0;
+ while (!isAbort() && cardNum < 36) {
+ openBooster();
+ cardNum = 0;
+ while (!isAbort() && pickCards()) {
+ passLeft();
+ fireUpdatePlayersEvent();
+ }
+ }
+ resetBufferedCards();
+ this.fireEndDraftEvent();
+ }
+
+ @Override
+ protected void passLeft() {
+ synchronized (players) {
+ UUID startId = table.get(0);
+ UUID currentId = startId;
+ UUID nextId = table.getNext();
+ DraftPlayer next = players.get(nextId);
+ draftCube.leftCubeCards.clear();
+ draftCube.leftCubeCards.addAll(draftCube.getCubeCards());
+ cardsInCube.clear();
+ for (CardIdentity card : draftCube.leftCubeCards) {
+ cardsInCube.put(card.getName(), card);
+ }
+
+ while (true) {
+ for (DraftPlayer player : players.values()) {
+ if (player != null && player.getDeck() != null) {
+ for (Card card : player.getDeck().getSideboard()) {
+ if (cardsInCube.get(card.getName()) != null) {
+ draftCube.removeFromLeftCards(cardsInCube.get(card.getName()));
+ }
+ }
+ }
+ }
+
+ List nextBooster = draftCube.createBooster();
+ next.setBooster(nextBooster);
+ if (nextId == startId) {
+ break;
+ }
+ nextId = table.getNext();
+ next = players.get(nextId);
+ }
+ }
+ }
+
+ @Override
+ protected boolean pickCards() {
+ cardNum++;
+ for (DraftPlayer player : players.values()) {
+ if (cardNum > 36) {
+ return false;
+ }
+ player.setPicking();
+ player.getPlayer().pickCard(player.getBooster(), player.getDeck(), this);
+ }
+ synchronized (this) {
+ while (!donePicking()) {
+ try {
+ this.wait();
+ } catch (InterruptedException ex) {
+ }
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public void firePickCardEvent(UUID playerId) {
+ DraftPlayer player = players.get(playerId);
+ if (cardNum > 36) {
+ cardNum = 36;
+ }
+ if (cardNum <= 0) {
+ cardNum = 1;
+ }
+ int time = richManTimes[cardNum - 1] * timing.getFactor();
+ playerQueryEventSource.pickCard(playerId, "Pick card", player.getBooster(), time);
+ }
+}