From 2eb68403cf710a2ad31656b89e15a37555902095 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sun, 26 Jun 2016 12:54:59 +1000 Subject: [PATCH] spjspj - Add Rich Man Cube draft. This is a variation on the Rich Man set draft. It still (like cube) shouldn't let there be more than one copy of a card in the draft but will give each player a new pack from the cards that haven't been picked already each time. Allows 2 player cube drafts to be playable. --- ...RichManCubeDraftEliminationTournament.java | 89 ++++++++++++ Mage.Server/config/config.xml | 1 + .../main/java/mage/game/draft/DraftCube.java | 13 ++ .../game/draft/RichManCubeBoosterDraft.java | 135 ++++++++++++++++++ 4 files changed, 238 insertions(+) create mode 100644 Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/RichManCubeDraftEliminationTournament.java create mode 100644 Mage/src/main/java/mage/game/draft/RichManCubeBoosterDraft.java 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); + } +}